在cmd和INFO下执行powershell命令:无法找到给定模式的文件

时间:2017-04-19 11:48:15

标签: powershell cmd

我正在尝试从CMD执行以下powershell命令,例如:

powershell Get-WmiObject Win32_PnPSignedDriver 

powershell Get-WmiObject Win32_PnPSignedDriver > test.txt 

两者都正常工作。

但是当我进行查询时,例如:

powershell (Get-WmiObject Win32_PnPSignedDriver | where {$_.location -like "*PCI bus 0, device 22, function 0*"}).DeviceName

我收到此消息的原因是我无法确定:

  

信息:无法找到给定模式的文件

3 个答案:

答案 0 :(得分:2)

这似乎对我有用(我看到了与你原来相同的错误):

powershell -command "(Get-WmiObject Win32_PnPSignedDriver | where {$_.location -like '*PCI bus 0, device 22, function 0*'}).DeviceName"

答案 1 :(得分:1)

使用一般指南补充现有答案,以便powershell.exe (命令提示符)向cmd.exe传递命令:

  • 将整个PowerShell命令括在"..." (双引号)中。

    • 这可以保护其内容免受cmd.exe不需要的前期解释 - 正如|cmd.exe所发生的那样,如aschipfl's answer中所述。
    • 但是,%USERNAME%样式的环境变量引用(例如,'...'仍然展开。
  • 对于PowerShell命令中引用 embedded

    • 在可行的情况下使用"..."(单引号);这是Mark Wragg's helpful answer的作用,但如果引用的字符串是 literal (不包含变量引用或子表达式),它只是一个选项。

    • 如果您确实需要嵌入式\"...\",请将其转发为`

      • 请注意,当内部 PowerShell时,\(反引号)作为转义字符,当从外部传递字符串时, PowerShell需要{{ 1}}。

简化示例(从cmd.exe运行):

请注意,传递不带参数名称的命令意味着-Command参数;运行powershell -?以查看命令行语法 您可能还想使用-NoProfile,以便不会每次都加载用户个人资料。

不需要嵌入式引用的命令 - 只需双引号:

 powershell -noprofile "get-date"
 powershell -noprofile "(get-date).Date"
 powershell -noprofile "get-date | get-member"

带嵌入式引文的命令 - 使用'...'\"...\"

 powershell -noprofile "(get-date).Year -like '*17'"
 powershell -noprofile "$v=17; (get-date).Year -like \"*$v\""

包含cmd.exe环境变量值的命令:

 :: # Nothing special to do: cmd.exe expands the reference irrespective of quoting.
 set "v=17"
 powershell -noprofile "(get-date).Year -like '*%v%'"

 :: # More robust variant that passes the value as an argument to a script block.
 set "v=17"
 powershell -noprofile ". { param($v) (get-date).Year -like \"*$v\" }" "%v%"

可选阅读:从类似POSIX的shell调用powershell,例如bash

上述规则同样适用,但通常会使用'...'(单引号)来包含整个PowerShell命令,这会明确阻止shell的前期解释。

如果明确需要预先扩展shell变量引用和命令替换,则使用"..."是一个选项,但是混淆的可能性很大,因为类似POSIX的shell和PowerShell都使用了sigil {{1引用变量 - 在展开时可能并不明显。

POSIX类shell绝对不支持在$个字符串中嵌入'个实例,这需要一个有点尴尬的解决方法(见下文)。

简化示例(从类似POSIX的shell运行,例如'...'):

不需要嵌入式引用的命令 - 只需单引号:

bash

带嵌入式引号的命令 - 将嵌入式 powershell -noprofile 'get-date' powershell -noprofile '(get-date).Date' powershell -noprofile 'get-date | get-member' 实例替换为'(原文如此),并按原样使用嵌入式'\''

"

包含shell / environment变量值的命令:

 powershell -noprofile '(get-date).Year -like '\''*17'\'''
 powershell -noprofile '$v=17; (get-date).Year -like "*$v"'

答案 2 :(得分:0)

我非常确定管道符|是问题所在,因为cmd会尝试处理它。 只需通过前面的^

来逃避它
powershell (Get-WmiObject Win32_PnPSignedDriver ^| where {$_.location -like "*PCI bus 0, device 22, function 0*"}).DeviceName

如果在cmd的括号内的代码块中使用此代码,您可能还需要转义结束)(开头(也可以转义,但是没有必要):

powershell ^(Get-WmiObject Win32_PnPSignedDriver ^| where {$_.location -like "*PCI bus 0, device 22, function 0*"}^).DeviceName