0

我需要在 CMD 的 PowerShell 的帮助下运行远程命令。这是我从 CMD 调用的命令:

powershell -command "$encpass=convertto-securestring -asplaintext mypass -force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; invoke-command -computername "REMOTE_COMPUTER_NAME" -scriptblock {<command>} -credential $cred;"

代替<command>(包括 < 和 > 符号)可以是任何可以在 cmd.exe 中运行的命令。例如可以有perl -e "print $^O;"or echo "Hello World!"(注意:不能有perl -e 'print $^O;',因为单引号导致 CMD 命令不正确)。因此,该命令perl -e "print $^O;"和任何其他包含双引号的命令似乎都没有按预期处理。在这里,我希望它从 perl 的角度返回远程框的操作系统名称,但由于 PowerShell 和/或 CMD 对双引号的模糊处理,它不会打印任何内容。

那么问题来了,如何使用 PowerShell 在远程框中为 CMD 运行正确的命令?

4

1 回答 1

1

OP 中的命令行有几个可能的问题。如果 OP 中的命令行是从 Powershell 本身执行的,则 $encpass 和 $cred 将在调用 powershell 的(子实例)之前被替换。您需要使用单引号或转义 $ 符号,例如:

powershell -command "`$encpass=2"
powershell -command '$encpass=2'

如果不是使用 Powershell,而是从 CMD 执行命令行,则必须对 ^ 进行转义,因为它是 CMD 转义字符。

并且引用 " 也是一个好主意。在我做的一些测试中,我不得不使用不平衡的引号来使命令工作,例如,从 powershell:

powershell -command "`$encpass=`"`"a`"`"`"; 写主机`$encpass"

工作,但平衡报价没有。

为了避免这一切,最可靠的方法可能是在 powershell 命令行帮助中给出powershell -?

# To use the -EncodedCommand parameter:
$command = 'dir "c:\program files" '
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
powershell.exe -encodedCommand $encodedCommand

然而,PS 3.0 中有一个新功能也应该有所帮助,但我认为它不会那么强大。此处描述:http: //blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx,靠近博客中间。

于 2013-07-17T20:43:01.230 回答