2

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

我遇到了一个小问题。

我正在运行一个命令并将其传递到一个变量中,以便我可以操纵输出。

$variable = some command

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

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

($variable = some command) 

我也试过:

write-host ($variable = some command) 

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

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

我也试过:

$variable = some command : Out-host

$variable = some command | out-default

带有所有参数,但是命令中的“提示”(写 y,n,s)没有出现。

能够自动通过 S 也是可以接受的。

4

3 回答 3

3

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

some command | Tee-Object -Variable MyVariable

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

于 2015-05-27T05:32:04.507 回答
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

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

=== 编辑 2 ===

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

$a = gi test_out; rm test_out
$z = $a | select -Index 14,($a.count-5)
$z
于 2015-05-27T09:59:47.807 回答
0
$variable = ""
some command | % {$variable += $_;"$_"}

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

于 2021-03-16T22:58:53.650 回答