条件逻辑不再按预期工作?

时间:2012-11-06 15:05:59

标签: powershell logic

这是漫长的一天,我想我会发疯。我想测试一个文件并生成一个电子邮件(如果不存在)。在这里它被削减到最小:

> IF('False' -eq (Test-Path D:\Scripts\SFTP\Import\*)){ECHO "SEND EMAIL"}
> SEND EMAIL

__________________________________________________________________________
> IF((Test-Path D:\Scripts\SFTP\Import\*) -eq 'False'){ECHO "SEND EMAIL"}
> 

为什么第二个命令不起作用?

我已经尝试将'IF'语句之外的Test-Path运行到一个变量中,然后对其进行测试,它再次无效。

如果我只是运行'Test-Path'命令,我会按预期得到一个布尔'False'。我之前以这种方式使用了条件逻辑并且它起作用了。

我做错了什么?

2 个答案:

答案 0 :(得分:5)

原因是这个。在第一个中,您有一个字符串作为比较的第一个操作数。如果可能,这会强制PS将第二个操作数强制转换为字符串。在这种情况下,这意味着调用布尔值的.ToString()方法,该方法将返回'False'字符串(如果布尔值当然是假的)。在第二种情况下,您将一个布尔值作为第一个操作数,因此该字符串被强制转换为布尔值。显然它不起作用。要避免这些问题,请使用内置$false(或$true)变量。我个人建议只是否定Test-Path。以下是一些应该有效的方法:

if( -NOT (Test-Path D:\Scripts\SFTP\Import\*)){


if( (Test-Path D:\Scripts\SFTP\Import\*) -eq $false){

答案 1 :(得分:1)

对于powershell的强制规则

'False' -eq (Test-Path D:\Scripts\SFTP\Import\*)

比较的第二个值被评估为[string]

这里

(Test-Path D:\Scripts\SFTP\Import\*) -eq 'False'

比较的第二个值不能被评估为[Bool]然后失败。

对于bool comparin,optima使用自动变量$false$true