powershell - 检查文件内容时 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
解决方案
正如 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
其中添加一个以获得满足您需求的确切输出。
推荐阅读
- coq - 为什么 `ev n (S(S n))' 减少数字而不增加数字?
- r - R:根据列值将数据帧中的行号提取到向量中
- python - 有没有通过类型索引这样的东西?
- vba - 解析给定 SMTP 域和部分名称的收件人
- d3.js - d3 控制刻度之间的空间
- aem - 视觉隐含对象
- asp.net-mvc - 我必须将项目 id 作为我的 WebGrid 中呈现的 id 广告的方法是什么
- c - 使用 C 中的 DFS 方法,我怎样才能使它没有用户输入
- node.js - nodejs中有没有办法将geotiff转换为PNG(使用gdal_translate?)
- python - 如何获取网站所有页面中表格的所有数据?