在 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; &$cmdcmd 是一个不同的外壳。请注意,& 在子范围内执行,因此您会注意到,在上面设置 $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 脚本。

我发现,一旦gitPATH 中,类似的命令

$ca_bundle = git config --get http.sslCAInfo

gitcrt文件的位置存储在$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命令

powershell怎么运行

从 powershell 脚本运行 cmd 命令

Powershell 或 CMD - 我想同时运行两个命令而不等待第一个命令完成

powershell 从PowerShell运行CMD中的命令

一次永久解决cmd窗口汉字显示乱码