ChatGPT解决这个技术问题 Extra ChatGPT

在 PowerShell 中运行 CMD 命令

我在运行 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 时不需要。仅供参考。

K
Keith Hill

尝试这个:

& "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
P
Peter Mortensen

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

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


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

一种解决方案是将您的命令从 PowerShell pipe 传输到 CMD。运行以下命令会将 notepad.exe 命令通过管道传送到 CMD,然后它将打开记事本应用程序。

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

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

编辑

显示 CMD 的启动消息

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


即使 & 没有,它也可以工作。例如,"mklink" | cmd 工作时,& "mklink" 对我不起作用
W
Wessel van Lit

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

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

有时您可能必须使用 cmd.exe /c 预启动此命令

例子

从 PS 脚本调用 git

我不得不重新打包一个包含在 Chocolatey 中的 git 客户端(对于那些可能不知道的人,它是 Windows 的包管理器),它大量使用 PS 脚本。

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

$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 来调用它的 internal 命令,例如 mklink。相比之下,where.exe 是一个外部程序,因此您可以直接调用它。但是,由于与 PowerShell 的内置 where 别名(用于 Where-Object)的名称冲突,您必须使用 where.exe;例如,where.exe java
还是只使用 PowerShell 的 Get-Command 而不是调用 cmd?和以前一样:$java_exe = $(Get-Command java.exe).Source
P
Peter Mortensen

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

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


在这种情况下不需要 Invoke-Command(参见 Keith Hill 的回答)。
是的,我同意这一点。我更多地考虑脚本解决方案。
该命令是否从脚本运行并不重要。在这种情况下,仍然没有必要使用 Invoke-Command。
请不要在没有示例的情况下提供“答案”