首页 > 解决方案 > 检查文件内容时 if 语句不起作用

问题描述

我想检查“C:\test.txt”是否存在,或者该文件中是否存在“Done”。如果没有,请设置域策略并创建文件“C:\test.txt”并将“完成”写入其中。

如果我同时使用这两个条件...

if (!(Select-String -Path c:\test.txt -Pattern "Done") -or !(Test-Path C:\log.txt)) {
    Set-ADDefaultDomainPasswordPolicy -Identity ad.contoso.com -ComplexityEnabled $true -MinPasswordLength 7 -MinPasswordAge 1 -MaxPasswordAge 30 -LockoutDuration 00:30:00 -LockoutObservationWindow 00:30:00 -LockoutThreshold 3
    write-output "test" | out-file C:\Users\tfl.AD\Desktop\test.txt -Append
}

然后我得到:

Select-String : Cannot find path 'C:\test.txt' because it does not exist.

Set-ADDefaultDomainPasswordPolicy没有输出,这就是为什么我添加了第二个命令来Done写入log.txt

标签: powershellactive-directory

解决方案


正如 JohnLBevan 在评论中所说,您应该将子句的顺序切换-or

$filetoCheck = "C:\test.txt"
!(Test-Path $filetoCheck) -or !(Select-String -Path $filetoCheck -Pattern "Done")

因此,如果文件不存在,则不需要执行该语句的右侧。您可以从about_logical_operators获得更长的解释

PowerShell 逻辑运算符仅评估确定语句真值所需的语句。如果包含 and 运算符的语句中的左操作数为 FALSE,则不计算右操作数。如果包含 or 语句的语句中的左操作数为 TRUE,则不计算右操作数。因此,您可以像使用 If 语句一样使用这些语句。

强调我的


你还提到

Set-ADDefaultDomainPasswordPolicy没有输出

这是真的......默认情况下。许多 cmdlet,如Set-ADDefaultDomainPasswordPolicy,都支持-PassThru开关。因此,如果您愿意,可以输出通过管道传递的部分或部分对象。

Set-ADDefaultDomainPasswordPolicy -Identity ad.contoso.com .... -PassThru | Export-CSV -NoTypeInformation c:\log.csv -Append

您可能需要在Select其中添加一个以获得满足您需求的确切输出。


推荐阅读