PowerShell中批量执行/查找的等价物

时间:2014-03-02 17:41:26

标签: batch-file powershell

在批处理脚本中,我可以执行以下操作...

execute command | findstr.exe "string_to_look"

如果它不存在那么我有%errorlevel%不同于0

在Powershell中,似乎select-string没有相同的行为。

4 个答案:

答案 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-ObjectSelect-String找不到匹配项,则管道的结果为$nullevaluates to $false。否则结果是非空数组,其值为$true