检查多个条件,然后如果所有都是假的做某事

时间:2016-05-23 13:40:46

标签: powershell logic

背景......

我正在尝试编写一个不断运行的脚本。我需要检查Queue目录中是否有XML文件,如果有,则发送API调用以启动某些服务器。

我已将此部分排序并且有效。

我遇到了第二部分的问题,如果满足以下条件,我需要发送另一个API调用来关闭服务器;

  • 队列目录必须为空
  • 运行目录必须为空
  • 服务器启动和停止之间的时间必须是最接近的小时(其AWS因此按小时收费,如果服务器仅运行几分钟就停止服务器没有意义,因为我们仍会收费整整一个小时。如果我们需要重新开始,我们将再收费一小时。)

这是我到目前为止所做的:

$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"
}

2 个答案:

答案 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

enter image description here

答案 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 ...))) {
  ...
}