43

我正在编写我的第一个 PowerShell 脚本,但无法弄清楚循环。

我有以下内容,它将重复$ActiveCampaigns次数:

Write-Host "Creating $PQCampaign1 Pre-Qualified Report"
Invoke-Item "$PQCampaignPath1\PQ REPORT $PQCampaign1.qvw"
Write-Host "Waiting 1 minute for QlikView to update"
sleep -seconds 60 # Wait 1 minute for QlikView to Reload, create Report and Save.

DO{
    Write-Host "Daily Qlikview Reports"
    Write-Host "Wating for QlikView to create the $PQCampaign1 PQ Report"
    Get-Date
    Write-Host "Checking...."
    sleep -seconds 1
    Write-Host ""
    Write-Host "Not Done Yet"
    Write-Host "Will try again in 5 seconds."
    Write-Host ""
    sleep -seconds 5
}

Until (Test-Path "$PQCampaignPath1\$PQCampaign1 $PQReportName $ReportDate.xlsx" -pathType leaf)

Get-Date
Write-Host "Done with $PQCampaign1 PQ Report. Wait 10 seconds."
sleep -seconds 10

这些参数需要为每个循环增加一个:

  • $PQCampaign1 (应该变成$PQCampaign2,然后是 3 等等)
  • $PQCampaignPath1 (应该变成$PQCampaignPath2,然后是 3 等等)

所以如果$ActiveCampaigns在某一天设置为 8,那么这需要重复 8 次,最后一次必须打开$PQCampaign3,位于$PQCampaignPath8.

我怎样才能解决这个问题?

4

4 回答 4

128

利用:

1..10 | % { write "loop $_" }

输出:

PS D:\temp> 1..10 | % { write "loop $_" }
loop 1
loop 2
loop 3
loop 4
loop 5
loop 6
loop 7
loop 8
loop 9
loop 10
于 2015-02-26T03:02:06.270 回答
43

这可能是您正在寻找的:

for ($i=1; $i -le $ActiveCampaigns; $i++)
{
  $PQCampaign     = Get-Variable -Name "PQCampaign$i"     -ValueOnly
  $PQCampaignPath = Get-Variable -Name "PQCampaignPath$i" -ValueOnly

  # Do stuff with $PQCampaign and $PQCampaignPath
}
于 2013-08-28T14:04:06.380 回答
31

这是在 PowerShell 中循环任意次数的简单方法。

它与上面的循环相同for,但对于新的程序员和脚本编写者来说更容易理解。它使用范围和 foreach。范围定义为:

range = lower..upper

或者

$range = 1..10

范围也可以直接在for循环中使用,尽管不是最佳方法,但任何性能损失或额外的处理指令都不会引起注意。解决方案如下:

foreach($i in 1..10){
    Write-Host $i
}

或者在你的情况下:

$ActiveCampaigns = 10
foreach($i in 1..$ActiveCampaigns)
{
    Write-Host $i
    If($i==$ActiveCampaigns){
        // Do your stuff on the last iteration here
    }
}
于 2014-10-16T13:57:03.030 回答
1

请参阅此链接。它向您展示了如何在 PowerShell 中动态创建变量。

这是基本思想:

使用New-VariableGet-Variable

for ($i=1; $i -le 5; $i++)
{
    New-Variable -Name "var$i" -Value $i
    Get-Variable -Name "var$i" -ValueOnly
}

(它取自提供的链接,我不相信代码。)

于 2013-08-28T12:51:25.490 回答