在PowerShell中运行CMD命令


87

我在运行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”,但启动CmRcViewer时不需要2012。仅供参考。
Kevin_

Answers:


101

试试这个:

& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

对于PowerShell,字符串“ ...”只是一个字符串,PowerShell通过将其回显到屏幕来对其进行评估。要使PowerShell执行名称在字符串中的命令,请使用调用运算符&


太棒了,这可行。这应该适用于大多数cmd命令吗?
user3585839

4
是的,但是对于名称或路径中没有空格的exe来说是没有必要的。例如,您ipconfig.exe无需使用即可执行&。您唯一需要使用的&是以字符串形式调用命令名称。如果路径或文件名中有空格,则必须使用“字符串形式”。
基思·希尔

17
我要补充一点,因为构建命令行字符串&会导致整个字符串是可执行文件的名称,所以它无法构建命令行字符串并尝试使用来执行。而是仅引用可执行文件的名称,然后在其后放置可执行文件的参数。
Bill_Stewart 2014年

&和之间的区别是什么cmd
Timo

1
&是PowerShell调用(也称为调用)运算符。当您所拥有的字符串是包含命令名称或exe路径的字符串时,它使您可以执行命令。您也可以指定一个脚本块&{$foo=42}或一个CommandIno对象$cmd = Get-Command Get-Date; &$cmdcmd是一个不同的外壳。请注意,它&在子作用域中执行,因此您会注意到,在$foo完成上述$foo设置的脚本块之后,将不再设置。
基思·希尔

55

要从PowerShell外部运行或转换批处理文件(特别是如果您希望使用证书对所有计划的任务脚本进行签名),我只需创建一个PowerShell脚本,例如deletefolders.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直接输出到命令提示符/ 。

这比运行批处理文件安全得多!


这对我来说很棒。我试图运行:sc query serviceName从PowerShell认为它将执行,但没有输出。我尝试了&技术的几次迭代,没有骰子。但是按照您推荐的方式运行它。接下来我打cmd.exe /?看看还有什么其他的奇迹在等我。我只喜欢在需要时运行cmd。
Paul Masek

9

一个解决办法是你的命令从PowerShell来CMD。运行以下命令会将notepad.exe命令通过管道传递到CMD,CMD随后将打开“记事本”应用程序。

PS C:\> "notepad.exe" | cmd

在CMD中运行命令后,将返回到PowerShell提示符,并可以继续运行PowerShell脚本。


编辑

显示CMD的启动消息

正如mklement0指出的那样,此方法显示了CMD的启动消息。如果要使用上述方法将输出复制到另一个终端,则启动消息将与之一起复制。


即使&没有,它也可以工作。例如,& "mklink"在工作期间没有为我"mklink" | cmd工作
moudrick

2

对于那些可能需要此信息的人:

我发现您几乎可以PATH从PS脚本中运行一个命令,并且该命令应该可以工作。

有时您可能需要使用以下命令预启动此命令 cmd.exe /c

例子

从PS脚本调用git

我不得不重新包装一个打包成大量使用PS脚本的git客户端Chocolatey(对于那些可能不知道的人,这是Windows的一种应用商店)。

我发现,一旦gitPATH,像命令

$ca_bundle = git config --get http.sslCAInfo

git crt文件的位置存储在$ca_bundle变量中。

寻找一个应用程序

将当前SO帖子与此SO帖子组合在一起的另一个示例是使用wherecommand

$java_exe = cmd.exe /c where java

java.exe文件的位置存储在$java_exe变量中。


1
您只需要cmd /c调用其内部命令,例如mklink。相反,它where.exe是一个外部程序,因此您可以直接调用它。但是,由于名称与PowerShell的内置where别名(for Where-Object)冲突,因此必须使用where.exe;。例如where.exe java
mklement0

或者只是使用PowerShellGet-Command而不是调用cmd?与之前相同:$java_exe = $(Get-Command java.exe).Source
dtasev

-1

您必须使用Invoke-Command cmdlet启动此外部程序。通常,它可以毫不费力地工作。

如果需要多个命令,则应将Invoke-Expression cmdlet与该-scriptblock选项一起使用。


1
在这种情况下,不需要调用命令(请参阅Keith Hill的答案)。
Bill_Stewart

是的,我同意这一点。我更多地考虑脚本解决方案。
蒂姆·克里斯汀

4
该命令是否从脚本运行都无关紧要。在这种情况下,仍不需要使用Invoke-Command。
Bill_Stewart


请不要提供没有示例的“答案”
AX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.