我正在尝试从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
我收到此消息的原因是我无法确定:
信息:无法找到给定模式的文件
答案 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需要{{ 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%"
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