对于我的测试我正在使用'开始>运行'对话框(不是cmd.exe)。
这很好用,我在log.txt中得到9
powershell -Command 4+5 > c:\log.txt
但这不起作用:
powershell -EncodedCommand IAA1ACsANwAgAA== > c:\log.txt
那么在这种情况下如何重定向输出?
实验代码:
function Test
{
$cmd = { 5+7 }
$encodedCommand = EncodeCommand $cmd
StartProcess "powershell -Command $cmd > c:\log.txt"
StartProcess "powershell -EncodedCommand $encodedCommand > c:\log2.txt"
}
function StartProcess($commandLine)
{
Invoke-WMIMethod -path win32_process -name create -argumentList $commandLine
}
function EncodeCommand($expression)
{
$commandBytes = [System.Text.Encoding]::Unicode.GetBytes($expression)
[Convert]::ToBase64String($commandBytes)
}
答案 0 :(得分:4)
“运行”对话框似乎根本不提供重定向。 According to this usenet post如果你有一个控制台,你只能获得重定向。我想知道powershell.exe是否正在解析重定向参数,如果它没有接收到编码输入,它会选择重定向?听起来像Raymond Chen的问题。
无论如何,这是有效的,代价是产生一个无用的控制台:
cmd /c powershell -EncodedCommand IAA1ACsANwAgAA== > c:\ps.txt
答案 1 :(得分:2)
这两个命令之间的区别在于-Command参数是贪婪的。它接管命令行后的所有内容,而-EncodedCommand不贪心。第一个命令真正做的是:
powershell -Command "4+5 > c:\log.txt"
因此新的PowerShell实例正在处理重定向。但是,如果使用-EncodedCommand参数,则新的PowerShell实例不会看到重定向,因为您没有将其包含在编码命令中。如果调用PowerShell的环境没有重定向(如在计划任务中),这可能是一件坏事。
因此,正如“crb”所示,您需要将重定向编码到命令中,或者从可以处理重定向的环境(如cmd或其他PowerShell实例)中调用PowerShell。
答案 2 :(得分:1)
我必须将命令与重定向一起编码。
function Test
{
$cmd = { 5+7 }
$encodedCommand = EncodeCommand "$cmd > 'c:\log2.log'"
StartProcess "powershell -Command $cmd > c:\log.txt"
StartProcess "powershell -EncodedCommand $encodedCommand"
}
所以这会将5 + 7的总和写入c:\ log2.log
powershell -EncodedCommand IAA1ACsANwAgACAAPgAgACcAYwA6AFwAbABvAGcAMgAuAGwAbwBnACcA
P.S。
crb 建议使用“cmd / c”。但在这种情况下,编码的脚本长度将受command line limitations
的约束在运行Microsoft Windows的计算机上 XP或更高版本,最大长度 您可以在命令中使用的字符串 提示符是8191个字符。上 运行Microsoft Windows的计算机 2000或Windows NT 4.0,最大值 您可以使用的字符串的长度 在命令提示符是2047年 字符。