在批处理脚本中,我可以执行以下操作...
execute command | findstr.exe "string_to_look"
如果它不存在那么我有%errorlevel%不同于0
在Powershell中,似乎select-string没有相同的行为。
答案 0 :(得分:2)
在条件上过滤输出并使用if
语句来测试是否有任何匹配:
PS C:\> dir test*
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 23/12/2013 16:12 19820 test.html
PS C:\> if (dir | ? { $_ -match 'test' }) { echo 'yes' }
yes
PS C:\> if (dir | ? { $_ -match 'testx' }) { echo 'yes' }
PS C:\>
请注意,如果该命令是Powershell cmdlet,那么您需要测试特定属性,因为您看到的行不是进入测试的行:
PS C:\> if (dir | ? { $_.Length -eq 19820 }) { echo 'yes' }
yes
对于我的示例命令,仅测试名称上的$_
测试。
答案 1 :(得分:2)
你可以这样做:
if (someCommand | Select-String "string_to_look")
{
# found!
}
或者像这样:
$found = someCommand | Select-String "string_to_look"
if ($found)
{
# found!
}
它起作用的原因是Select-String
如果找不到任何内容({1}}则会返回$null
,并返回$false
(或数组) MatchInfo
}如果确实找到了某些内容,则评估为MatchInfo
。
答案 2 :(得分:1)
好吧,如果你想知道字符串是否存在,你可以做这样的事情(以dir
为例):
$doesItHaveStringICareAbout = (dir | Out-String).Contains("string_to_look")
答案 3 :(得分:1)
findstr
仍然在PowerShell中工作,因为它是一个外部命令。但是,它不是很PoSh,所以我不建议使用它。
您可以将Where-Object
cmdlet(或其别名?
)与各种comparison operators一起使用。 -like
运算符与findstr
的默认行为最相似,除了您在查找部分匹配时需要在搜索字符串的开头和/或结尾添加通配符:< / p>
if (& command | ? { $_ -like '*string_to_look*' }) {
...
}
-match
运算符将输入与正则表达式匹配(如findstr /r
):
if (& command | ? { $_ -match 'regexp_to_look' }) {
...
}
您还可以使用Select-String
cmdlet,默认情况下将使用正则表达式,但可以指示使用与参数的简单匹配:
if (& command | Select-String -SimpleMatch 'string_to_look') {
...
}
如果Where-Object
或Select-String
找不到匹配项,则管道的结果为$null
,evaluates to $false
。否则结果是非空数组,其值为$true
。