这是漫长的一天,我想我会发疯。我想测试一个文件并生成一个电子邮件(如果不存在)。在这里它被削减到最小:
> 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'。我之前以这种方式使用了条件逻辑并且它起作用了。
我做错了什么?
答案 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