在 PowerShell 中运行 CMD 命令
Posted
技术标签:
【中文标题】在 PowerShell 中运行 CMD 命令【英文标题】:Running CMD command in PowerShell 【发布时间】:2014-09-16 09:27:27 【问题描述】:我在运行 PowerShell 命令时遇到了很多问题。它所做的只是运行将在 CMD 提示窗口中运行的命令。
命令如下:
"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME
我尝试了以下但没有成功(我已经尝试了很多次迭代以尝试获得一个有效的方法。语法可能都搞砸了):
$TEXT = $textbox.Text #$textbox is where the user enters the PC name.
$CMDCOMMAND = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"
Start-Process '"$CMDCOMMAND" $TEXT'
#iex -Command ('"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"' $TEXT)
该命令只会打开用户在文本框中指定的计算机的 SCCM 远程连接窗口。
【问题讨论】:
我不确定您使用的是哪个版本的 SCCM,但 07 需要一个“-1”,但 2012 在启动 CmRcViewer 时不需要。仅供参考。 【参考方案1】:试试这个:
& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME
对于 PowerShell,字符串“...”只是一个字符串,PowerShell 通过将其回显到屏幕来对其进行评估。要让 PowerShell 执行名称为字符串的命令,请使用调用运算符 &
。
【讨论】:
太棒了,这行得通。这应该适用于大多数 cmd 命令吗? 是的,但对于名称或路径中没有空格的 exe 来说,这不是必需的。例如,您可以执行ipconfig.exe
而不必使用&
。唯一需要使用&
的时候是以字符串形式调用命令名称。当路径或文件名中有空格时,您必须使用“字符串形式”。
我要补充一点,构造命令行字符串并尝试使用 &
执行是行不通的,因为 PowerShell 会认为整个字符串是可执行文件的名称。而是只引用可执行文件的名称并在后面加上可执行文件的参数。
&
和 cmd
之间的区别是什么?
&
是 PowerShell 调用(也称为调用)运算符。当您拥有的是包含命令名称或 exe 路径的字符串时,它允许您执行命令。您还可以指定一个脚本块,例如&$foo=42
或 CommandIno 对象,例如$cmd = Get-Command Get-Date; &$cmd
。 cmd
是一个不同的外壳。请注意,&
在子范围内执行,因此您会注意到,在上面设置 $foo
的脚本块完成后,$foo
不再设置。【参考方案2】:
要从 PowerShell 外部运行或转换批处理文件(特别是如果您希望使用证书签署所有计划任务脚本),我只需创建一个 PowerShell 脚本,例如删除文件夹.ps1。
在脚本中输入以下内容:
cmd.exe /c "rd /s /q C:\#TEMP\test1"
cmd.exe /c "rd /s /q C:\#TEMP\test2"
cmd.exe /c "rd /s /q C:\#TEMP\test3"
*每个命令都需要换行再次调用 cmd.exe。
此脚本现在可以从 PowerShell 签名并运行,直接将命令输出到命令提示符 /cmd
。
这比运行批处理文件更安全!
【讨论】:
这对我很有用。我试图运行:来自 PowerShell 的sc query serviceName
认为它会执行,但没有输出。我尝试了几次 & 技术的迭代,没有骰子。但是按照您推荐的方式运行它是有效的。接下来我打开 cmd.exe /?看看还有什么其他的奇迹在等着我。我只喜欢在需要时运行 cmd。【参考方案3】:
一种解决方案是将您的命令从 PowerShell 管道 传输到 CMD。运行以下命令会将notepad.exe
命令通过管道传送到 CMD,然后它将打开记事本应用程序。
PS C:\> "notepad.exe" | cmd
命令在 CMD 中运行后,您将返回到 PowerShell 提示符,并且可以继续运行您的 PowerShell 脚本。
编辑
显示 CMD 的启动信息
正如mklement0 指出的那样,此方法显示了 CMD 的启动消息。如果您要使用上述方法将输出复制到另一个终端,则启动消息将与它一起复制。
【讨论】:
即使&
不行,它也可以工作。例如。 & "mklink"
对我不起作用,而 "mklink" | cmd
起作用【参考方案4】:
对于那些可能需要此信息的人:
我发现您几乎可以从 PS 脚本运行 PATH
中的命令,它应该可以工作。
有时您可能需要使用 cmd.exe /c
预先启动此命令
示例
从 PS 脚本调用 git
我不得不重新打包一个 git
客户端,用 Chocolatey 包装(对于那些可能不知道的人,它是一个 Windows 包管理器),它大量使用 PS 脚本。
我发现,一旦git
在PATH
中,类似的命令
$ca_bundle = git config --get http.sslCAInfo
将git
crt
文件的位置存储在$ca_bundle
变量中。
寻找应用
另一个结合当前 SO 帖子和 this SO post 的示例是使用 where
命令
$java_exe = cmd.exe /c where java
将java.exe
文件的位置存储在$java_exe
变量中。
【讨论】:
您只需要cmd /c
即可调用其内部 命令,例如mklink
。相比之下,where.exe
是一个外部程序,因此您可以直接调用它。但是,由于与 PowerShell 内置的where
别名(对于Where-Object
)的名称冲突,必须使用where.exe
;例如,where.exe java
.
或者只使用 PowerShell 的 Get-Command
而不是调用 cmd
?和之前一样:$java_exe = $(Get-Command java.exe).Source
【参考方案5】:
您必须使用 Invoke-Command cmdlet 来启动此外部程序。通常它可以毫不费力地工作。
如果您需要多个命令,则应使用带有 -scriptblock
选项的 Invoke-Expression cmdlet。
【讨论】:
在这种情况下不需要 Invoke-Command(请参阅 Keith Hill 的回答)。 是的,我同意这一点。我更多的是考虑脚本解决方案。 命令是否从脚本运行都没有关系。在这种情况下仍然没有必要使用 Invoke-Command。 另外,Invoke-Expression should be avoided 请不要在没有示例的情况下提供“答案”以上是关于在 PowerShell 中运行 CMD 命令的主要内容,如果未能解决你的问题,请参考以下文章
Powershell 或 CMD - 我想同时运行两个命令而不等待第一个命令完成