Powershell同时管道到变量和写主机

时间:2015-05-27 04:40:33

标签: variables powershell output write-host

大家好,感谢您的提前时间;

我遇到了一个小问题。

我正在运行一个命令并将其输入变量,以便我可以操作输出。

$variable = some command

这通常可以正常工作,但不会输出屏幕上发生的事情,这在大多数时候都很好。然而,偶尔这个命令需要一些用户输入(例如是或否或跳过例如),并且由于它实际上没有将任何东西输送到命令窗口,它只是挂在那里而不是提示用户。如果你知道会发生什么,你可以打y或n或s,它会正常进行。

无论如何都要运行命令,以便输出通过管道输出到变量AND出现在屏幕上?我已经尝试过了:

($variable = some command) 

我也试过了:

write-host ($variable = some command) 

但是都不行。请注意,运行的命令不是本机的Windows或shell命令,我不能连续两次运行它。

澄清(因为我可能不清楚)

我也试过了:

$variable = some command : Out-host

$variable = some command | out-default

包含所有参数,但命令中的“提示”(写入y,n,s)不会显示。

能够自动传递S也是可以接受的。

3 个答案:

答案 0 :(得分:1)

您需要提供一些不起作用的具体示例。我试过这个并且它有效:

function test { $c = read-host "Say something"; $c }
$x = test

我仍然看到"说些什么"。 read-host未输出到标准输出,因此您的问题令人惊讶。即便如此:

read-host "Say something" *> out

===编辑===

由于这是与cmd.exe的交互,因此您有两个选项AFAIK。首先,测试命令:

test.cmd

@echo off
set /p something="Say something: "
echo %something%

这并不像你说的那样有效:$x= ./test.cmd

使其有效:

a)将上述命令替换为:"Say something:"; $x= ./test.cmd。这在一般情况下显然不理想,因为您可能事先不知道* .cmd会问什么。但是当你知道它很容易。

b)试试这个:

Start-transcript test_out; 
./test.cmd; 
Stop-transcript;
gc .\test_out | sls 'test.cmd' -Context 0,1 | select -Last 1 | set y
rm test_out 
$z = ($y -split "`n").Trim()

$z变量包含:Say something: something之后。这可能是您可以转换为函数的良好通用解决方案:

$z = Get-CmdOutput test.cmd

文本解析的细节在一般情况下可能会略有不同 - 我在这里假设只询问一个问题并且答案在同一行但在任何情况下都有一些工作你将能够获得所有cmd.exe脚本输出一般情况下:

===编辑2 ===

这可能是更好的一般提取:

$a = gi test_out; rm test_out
$z = $a | select -Index 14,($a.count-5)
$z

答案 1 :(得分:0)

听起来你需要Tee-Object。例如:

some command | Tee-Object -Variable MyVariable

这应该从命令传递管道中的所有内容,并将命令的所有输出存储在$MyVariable变量中。

答案 2 :(得分:0)

$variable = ""
some command | % {$variable += $_;"$_"}

这将执行命令,每一行输出都被添加到 $variable 并打印到控制台。