背景......
我正在尝试编写一个不断运行的脚本。我需要检查Queue目录中是否有XML文件,如果有,则发送API调用以启动某些服务器。
我已将此部分排序并且有效。
我遇到了第二部分的问题,如果满足以下条件,我需要发送另一个API调用来关闭服务器;
这是我到目前为止所做的:
$QueueDir = "D:\Test"
$RunningDir = "D:\Test\copydir"
while (!(Test-path $QueueDir\*.xml)) {Start-Sleep 10}
Write-Host "Starting Servers, API NORMALLY GOES HERE"
$Starttime = (Get-Date)
Write-Host "Started Servers @ $Starttime"
Start-Sleep -Seconds 30
while (!(Test-Path $rundir\*.xml)) {Start-Sleep 10}
$now = (Get-Date)
$timespan = (New-TimeSpan -Start $Starttime -End $now)
if ( (Test-Path $QueueDir\*.xml) -or (Test-Path $RunningDir\*.xml) -or ($timespan.Minutes -gt 50 -and -lt 55) ) {
Write-Host "Stopping Servers, API NORMALLY GOES HERE"
$StopTime = (Get-Date)
Write-Host "Stopped Servers @ $Stoptime"
}
答案 0 :(得分:3)
此$timespan.Minutes -gt 50 -and -lt 55
无效PowerShell逻辑。您必须在-and
之后提供值表达式。你会收到这样的错误:
您必须在'-and'运算符后面提供值表达式。 + CategoryInfo:ParserError:(:) [],ParentContainsErrorRecordException + FullyQualifiedErrorId:ExpectedValueExpression
所以你需要使用它:
$timespan.Minutes -gt 50 -and $timespacn.Minutes -lt 55
答案 1 :(得分:1)
这很简单boolean algebra。如果三个条件都不成立,您希望采取措施。这可以这样表达:
!A ^ !B ^ !C # (not A) and (not B) and (not C)
以上内容可以转换如下((!A ^ !B) ⇔ !(A v B)
),因为表达式中的多个否定往往是丑陋的:
!(A v B v C) # not (A or B or C)
在您的代码中看起来像这样:
if (-not ((Test-Path ...) -or (Test-Path ...) -or ($timespan.Minutes ...))) {
...
}