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