在IF语句中声明变量

时间:2015-09-02 14:24:34

标签: powershell

为什么这不起作用?

if (([datetime] $a = Date),$a.DayOfWeek -ne 'Wednesday'){
    Write-Host 1
    Exit
}ElseIf ($a.hour -ne 9){
    Write-Host 2
    Exit
}

Do stuff...

但这将

if (($connected = Test-Connection 1.1.1.1 -Quiet), $connected -eq $false){
    Start-Process msg -ArgumentList "$env:USERNAME Not Connected..."
    Exit
}

Do stuff..

在第一个示例中,除非我将[datetime] $a = date移到if语句之外,否则我的脚本总是会退出。但是,第二个例子没有问题。

此外,如果在第一个if语句中插入$a,则返回正确的datetime

2 个答案:

答案 0 :(得分:0)

我最终使用了以下代码:

if ($([datetime] $a = Date; $a.DayOfWeek -ne 'Wednesday') -eq $true){
    Write-Host 1
    Exit
}ElseIf ($a.hour -ne 9){
    Write-Host 2
    Exit
}

Do stuff..

if ($($connected = Test-Connection 1.1.1.1 -Quiet; $connected) -eq $false){
    Write-Host 3
    Exit
}

Do stuff..

答案 1 :(得分:0)

不要在if语句中使用,,因为它会导致创建一个2项数组 - if()将始终评估为$true的对象。

原因在于,当您将赋值操作括在plaint括号中时(即:(),而不是$(),这是子表达式运算符),赋值的右侧本身就归还了:

PS C:\> $null = 123 # the operation itself doesn't generate output
PS C:\> ($null = 123) # but we can force it to do so
123

所以当你做类似的事情时:

($a = Get-Date),$a -eq (Get-Date)

您真正生成以下表达式:@($a,$a) -eq (Get-Date)

你可以这样做:

if(([datetime]$a = Date).DayOfWeek -ne 'Wednesday'){
    # It's not wednesday
}

if (($connected = Test-Connection 1.1.1.1 -Quiet) -eq $false){
    # No response
}