仅当条件为真时,Powershell循环

时间:2015-11-17 12:39:18

标签: powershell

一般来说编码很新,所以我担心我会遗漏一些完全明显的东西。我希望我的程序检查文件。如果它在那里,只需继续代码。如果尚未到达,请继续检查一段时间,或直到文件显示出来。我的循环独立工作,所以当我只选择Powershell ISE中的do-part时,它可以工作。但是当我尝试在if语句中运行它时,没有任何反应。循环不会开始。

<Directory /test>
Order Allow,Deny
Allow from all
Deny from 10.13.89.47
</Directory>

2 个答案:

答案 0 :(得分:2)

作为pointed out in comments,您的问题是您将布尔值与字符串&#34; False&#34;:

进行比较
$exists -eq "False"

在PowerShell中,比较运算符从左到右评估参数,左侧参数的类型确定正在进行的比较类型。

由于左侧参数($exists)的类型为[bool](布尔值,可以是$true$false),因此PowerShell会尝试转换也是[bool]的右手参数。

PowerShell将任何非空字符串解释为$true ,因此声明:

$exists -eq "False"

相当于

$exists -eq $true

可能你的意图。

答案 1 :(得分:1)

另一种方法是使用while循环:

$VerbosePreference = 'Continue'

[String]$File = 'S:\Test\Input_Test\Test.txt'
[Int]$MaxRetries = 5

$RetryCount = 0; $Completed = $false

while (-not $Completed) {
    if (Test-Path -LiteralPath $File) {
        Write-Verbose "The file is present '$File'"
        $Completed = $true
        <#
            Do actions with your file here
        #>
    }
    else {
        if ($RetryCount -ge $MaxRetries) {
            Write-Verbose "Failed finding the file within '$MaxRetries' retries"
            throw "Failed finding the file within '$MaxRetries' retries"
        } else {
            Write-Verbose "File not found, retrying in 5 seconds."
            Start-Sleep '5'
            $RetryCount++
        }
    }
}

一些提示:

  • 尽量避免Write-Host,因为它会杀死小狗和管道(Don Jones)。如果用于查看脚本的进度,则更好的是使用Write-Verbose
  • 尽量保持间距一致。脚本越长越复杂,阅读和理解它们就越困难。特别是当别人需要帮助你的时候。因此,适当的间距可以帮助我们所有人。
  • 尝试在Tab completion中使用PowerShell ISE。当您键入start并按TAB键时,它会自动提出可用选项。当您使用向下/向上箭头选择所需内容并按Enter键时,它会很好地将CmdLet格式化为Start-Sleep
  • 最重要的提示:继续探索!您尝试使用PowerShell的次数越多,您就会越好。