我在运行 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 远程连接窗口。
尝试这个:
& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME
对于 PowerShell,字符串“...”只是一个字符串,PowerShell 通过将其回显到屏幕来对其进行评估。要让 PowerShell 执行名称为字符串的命令,请使用调用运算符 &
。
要从 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
,认为它会执行,但没有输出。我尝试了 & 的几次迭代。技术,没有骰子。但是按照您推荐的方式运行它是有效的。接下来我打开 cmd.exe /?看看还有什么其他的奇迹在等着我。我只喜欢在需要时运行 cmd。
一种解决方案是将您的命令从 PowerShell pipe 传输到 CMD。运行以下命令会将 notepad.exe
命令通过管道传送到 CMD,然后它将打开记事本应用程序。
PS C:\> "notepad.exe" | cmd
一旦命令在 CMD 中运行,您将返回到 PowerShell 提示符,并且可以继续运行您的 PowerShell 脚本。
编辑
显示 CMD 的启动消息
正如 mklement0 所指出的,此方法显示 CMD 的启动消息。如果您要使用上述方法将输出复制到另一个终端,则启动消息将与其一起复制。
&
没有,它也可以工作。例如,"mklink" | cmd
工作时,& "mklink"
对我不起作用
对于那些可能需要此信息的人:
我发现您几乎可以从 PS 脚本运行 PATH
中的命令,它应该可以工作。
有时您可能必须使用 cmd.exe /c
预启动此命令
例子
从 PS 脚本调用 git
我不得不重新打包一个包含在 Chocolatey 中的 git
客户端(对于那些可能不知道的人,它是 Windows 的包管理器),它大量使用 PS 脚本。
我发现,一旦 git
在 PATH
中,类似的命令
$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
。
Get-Command
而不是调用 cmd
?和以前一样:$java_exe = $(Get-Command java.exe).Source
您必须使用 Invoke-Command cmdlet 来启动此外部程序。通常它可以毫不费力地工作。
如果您需要多个命令,则应使用带有 -scriptblock
选项的 Invoke-Expression cmdlet。
不定期副业成功案例分享
ipconfig.exe
而不必使用&
。您需要使用&
的唯一一次是以字符串形式调用命令名称。当路径或文件名中有空格时,您必须使用“字符串形式”。&
执行是行不通的,因为 PowerShell 会认为整个字符串是可执行文件的名称。而是仅引用可执行文件的名称并在之后放置可执行文件的参数。&
和cmd
之间的区别是什么?&
是 PowerShell 调用(也称为调用)运算符。当您拥有的是包含命令名称或 exe 路径的字符串时,它允许您执行命令。您还可以指定一个脚本块,例如&{$foo=42}
或一个 CommandIno 对象,例如$cmd = Get-Command Get-Date; &$cmd
。cmd
是一个不同的外壳。请注意,&
在子范围内执行,因此您会注意到,在上面设置$foo
的脚本块完成后,不再设置$foo
。