-1

我的任务是自动执行每月维护。基本上我需要将 xmla 文件中的日期值编辑到下个月。

这是 XMLA 文件中的相关部分:

<Process xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
        <Type>ProcessFull</Type>
        <Object>
            <DatabaseID>OLAPQA</DatabaseID>
            <CubeID>Model</CubeID>
            <MeasureGroupID>TRANSACTIONS</MeasureGroupID>
            <PartitionID>TRANSACTIONS 201410</PartitionID>
        </Object>
    </Process>
    <Process xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
        <Type>ProcessFull</Type>
        <Object>
            <DatabaseID>OLAPQA</DatabaseID>
            <CubeID>Model</CubeID>
            <MeasureGroupID>TRANSACTIONS</MeasureGroupID>
            <PartitionID>TRANSACTIONS 201411</PartitionID>
        </Object>
    </Process>
    <Process xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
        <Type>ProcessFull</Type>
        <Object>
            <DatabaseID>OLAPQA</DatabaseID>
            <CubeID>Model</CubeID>
            <MeasureGroupID>TRANSACTIONS</MeasureGroupID>
            <PartitionID>TRANSACTIONS 201412</PartitionID>
        </Object>
    </Process>

我需要使用以下逻辑编写一个 windows powershell 脚本:

  1. 获取当前日期并验证它是否是该月的第一天
  2. 如果是,则计算前一天(以计算前 2 年/月值)
  3. 搜索 XMLA 文件以用新值替换以前的年/月组合

我已经解决了 1 号和 2 号,但我在 3 号上遇到了一些问题。

这是我的代码:

$con = Get-Content .\Process2Periods.xmla
$con | % { $_.Replace("((Get-Date).AddMonths(-2) | Get-Date -Format "yyyyMM")", ("((Get-Date).AddMonths(-1) | Get-Date -Format "yyyyMM")") } | Set-Content .\Process2Periods.xmla

我如何做到这一点是运行以下代码,它与上面的代码不同:

$con = Get-Content .\Process2Periods.xmla
$con | % { $_.Replace("201410", "201411") } | Set-Content .\Process2Periods.xmla

我的问题是如何使这种动态化而不是将值硬编码到脚本中。我需要这个来每月更改三个标签。该代码适用于字符串值,但如何将某些代码的输出作为字符串值?我应该使用变量吗?

提前致谢。

4

2 回答 2

0

我无法理解您尝试做的事情的逻辑。我看到您将每个值的月份都增加了一个。因此,我假设您将在每月的第一天将每个日期的月份增加一个月。我不明白第 2 点,因为我没有看到你对日子进行任何操纵。

$path = .\Process2Periods.xmla
$xmla = Get-Content -Path $path 
$now = (Get-Date -day 1)  #-day 1 is there to trigger next If. Remove for prod.
If($now.Day -eq 1){
    # It is the first of the month. 
    $xmla | ForEach-Object{
        # Output each line back to the variable while editting the found dates
        If($_ -match "<PartitionID>\D+(\d{6})</PartitionID>"){
            $_ -replace $matches[1], ('{0:yyyyMM}' -f [datetime]::ParseExact($matches[1],"yyyyMM", $null).AddMonths(1))
        } Else {
            $_
        }
    }
} | Set-Content  $path 

假设它是本月的第一天,获取文件的内容并通过foreach-Object循环处理它们。将正常行输出到输出,但如果您找到带有PartitionID标签的行,我们会将 6 位数字拉出。接下来,我们将操作字符串写回输出并更新日期。有趣的部分是匹配和替换是如何工作的,我将尝试分解。

  1. matches[1]包含匹配中的第一个捕获组。在我们的例子中是 6 位数字。
  2. 获取这些数字并[datetime]使用精确解析将它们转换为对象。
  3. 将月份增加 1
  4. 获取新日期并使用参数将其转换回“yyyyMM”字符串-f
  5. 用新日期替换匹配的数字。

我确定出了点问题,这不是你的意图,但就像我之前提到的那样,我真的不明白你在做什么。如果你能理解我应该做什么,我认为我们可以用你真正想要的东西来完成这项工作。

于 2014-12-13T03:16:03.207 回答
0

尝试这个:

$con  = Get-Content C:\Process2Periods.xmla
$lastMonth = (Get-Date).AddMonths(-1) | Get-Date -Format "yyyyMM"
$thisMonth = (Get-Date) | Get-Date -Format "yyyyMM"
$con | % { $_.Replace($lastMonth,$thisMonth) } | Set-Content .\Process2Periods.xmla
于 2014-12-12T22:27:21.690 回答