2

这是漫长的一天,我想我快疯了。我想测试一个文件并在不存在时生成一封电子邮件。在这里,它被缩减到最低限度:

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

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

我已经尝试Test-Path将“IF”语句的外部运行到一个变量中,然后对其进行测试,它再次不起作用。

如果我只是运行“测试路径”命令,我会得到预期的布尔值“假”。我以前以这种方式使用过条件逻辑并且它有效。

我究竟做错了什么?

4

2 回答 2

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){
于 2012-11-06T15:14:02.907 回答
1

对于powershell的强制规则

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

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

这里

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

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

对于 bool 比较是最优的,使用自动变量$false$true

于 2012-11-06T15:18:09.870 回答