在PowerShell中运行CMD命令

在PowerShell中运行CMD命令,powershell,command-line,cmd,Powershell,Command Line,Cmd,我在运行PowerShell命令时遇到了一系列问题。它所做的只是运行一个命令,该命令将在CMD提示符窗口中运行 命令如下: “C:\ProgramFiles(x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe”PCNAME 我尝试了以下几点,但都没有成功(我尝试了很多次,试图得到一个可行的方法。语法可能都搞糟了): 该命令只会打开用户在文本框中指定的计算机的SCCM远程连接窗口。尝试以下操作: &am

我在运行PowerShell命令时遇到了一系列问题。它所做的只是运行一个命令,该命令将在CMD提示符窗口中运行

命令如下:

“C:\ProgramFiles(x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe”PCNAME

我尝试了以下几点,但都没有成功(我尝试了很多次,试图得到一个可行的方法。语法可能都搞糟了):

该命令只会打开用户在文本框中指定的计算机的SCCM远程连接窗口。

尝试以下操作:

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

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

必须使用Invoke command cmdlet启动此外部程序。通常它不费吹灰之力就能工作


如果您需要多个命令,则应使用带有
-scriptblock
选项的Invoke Expression cmdlet。

要从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


这是一种比运行批处理文件更安全的方法

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

我发现,您几乎可以从PS脚本运行
路径中的命令,它应该可以工作

有时您可能需要使用
cmd.exe/c

例子 从PS脚本调用git

我不得不重新打包一个用巧克力包装的
git
客户端(对于那些不知道的人来说,这是一种Windows应用商店),它大量使用PS脚本

我发现,一旦
git
位于
PATH
中,下面的命令

$ca_bundle = git config --get http.sslCAInfo
将在
$ca\u bundle
变量中存储
git
crt
文件的位置

寻找应用程序

另一个示例是当前SO post和使用
where
命令的组合

$java_exe = cmd.exe /c where java
java.exe
文件的位置存储在
$java\u exe
变量中。

一种解决方案是将命令从PowerShell传输到CMD。运行以下命令将把
notepad.exe
命令传送到CMD,然后CMD将打开记事本应用程序

PS C:\>“notepad.exe”| cmd

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


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

Awesome,这很有效。这对大多数cmd命令都适用吗?是的,但对于名称或路径中没有空格的EXE,这不是必需的。例如,您可以执行
ipconfig.exe
,而不必使用
&
。使用
&
的唯一时间是以字符串形式调用命令名。当路径或文件名中有空格时,必须使用“字符串形式”。我要补充的是,构造命令行字符串并尝试使用
&
执行是行不通的,因为PowerShell会认为整个字符串都是可执行文件的名称。相反,只引用可执行文件的名称并在后面输入可执行文件的参数。
&
cmd
之间的区别是什么?
&
是PowerShell调用(又称调用)操作符。当您拥有的是包含命令名称或exe路径的字符串时,它允许您执行命令。您还可以指定脚本块,例如
&{$foo=42}
或CommandIno对象,例如
$cmd=Get命令Get Date&$cmd
cmd
是另一个shell。请注意,
&
在子作用域中执行,因此您会注意到,在上面设置
$foo
的脚本块完成后,
$foo
不再设置。我不确定您使用的是哪个版本的SCCM,但07需要“-1”,但在启动CmRcViewer时,2012不需要。在这种情况下,只需要一个FYI.Invoke-Command(参见Keith Hill的回答)。是的,我同意这一点。我更多地考虑了脚本解决方案。不管命令是否从脚本运行。在这种情况下仍然不需要使用Invoke命令。此外,请不要提供没有示例的“答案”。您只需要
cmd/c
来调用其内部命令,例如
mklink
。相比之下,
where.exe
是一个外部程序,因此您可以直接调用它。但是,由于名称与PowerShell内置的
where
别名(对于
where Object
)冲突,您必须使用
where.exe
;e、 g,
where.exe java
。或者只使用PowerShell的
Get命令而不是调用
cmd
?与前面相同:
$java_exe=$(获取命令java.exe)。Source
即使
&
不工作,它也可以工作。例如,
和“mklink”
对我不起作用,而
“mklink”| cmd
对我很有效。我试图从PowerShell运行:
sc query serviceName
,以为它会执行,但没有输出。我尝试了几次&技巧的迭代,没有骰子。但是按照你推荐的方式运行它是有效的。接下来我点击cmd.exe/?看看还有什么奇迹等着我。我只喜欢在需要的时候运行cmd。
$java_exe = cmd.exe /c where java