在PowerShell中运行CMD命令
我在运行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
“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