同时将Powershell管道输出到变量和write-host中

5

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

我遇到了一个小问题。

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

$variable = some command

这通常可以正常工作,但不会将正在发生的情况输出到屏幕上,大多数情况下这是可以接受的。然而,偶尔此命令需要一些用户输入(例如是、否或跳过),由于实际上没有向命令窗口传输任何内容,它就会挂起而不是提示用户。如果你知道该命令会发生什么,你可以按 y 或 n 或 s 继续进行。

有没有办法使输出被导入到一个变量中,并在屏幕上显示出来?我已经尝试过:

($variable = some command) 

我也尝试过以下方法:
write-host ($variable = some command) 

但是两者都无法工作。请注意,正在运行的命令不是本地的Windows或shell命令,我不能只是连续运行它两次。

为了澄清(因为我可能没有表达清楚):

我也尝试过:

$variable = some command : Out-host

and

$variable = some command | out-default

所有参数都已设置,但是命令提示符(要求输入y、n、s)未显示出来。

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

3个回答

6
听起来你需要使用 Tee-Object。例如:
some command | Tee-Object -Variable MyVariable

这个命令会将所有的内容从管道中传递下去,并将命令的所有输出保存到$MyVariable变量中。


1
谢谢您的回复,不幸的是,那个方法也没有起作用。如果我按照您说的方式执行,它会报告“无法绑定到参数,因为它为空”。如果我使用()命令,它会执行与之前相同的行为(没有提示),尽管它实际上正在正确地运行该命令。编辑:我尝试提前设置变量为false值,并且它确实被命令输出覆盖,但提示仍然不显示。 - Razorx

1

你需要给出一些具体的不起作用的例子。我尝试了这个,它是有效的:

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

我仍然看到“Say something”。read-host不会输出到标准输出,所以你的问题很奇怪。即使这个也可以工作:
read-host "Say something" *> out

=== 编辑 ===

由于这涉及与 cmd.exe 的交互,据我所知你有两个选择。首先,测试命令:

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变量包含:说点什么: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

该命令是我们公司基线工具中的.cmd命令。问题不在于常规输出,而在于当出现一个提示框时,提示框上会显示“是、否、编辑、跳过”,如果我将命令管道化到变量中,那么这个提示框就不会出现;但如果我从PowerShell中触发它而没有进行管道化,则该提示框会出现。因此,我想模仿不进行管道化时调用它的行为,同时又进行管道化。Tee和|out-host或|out-default都没有起作用。我不介意将提示框添加到变量中,我只需要它出现在命令行窗口中即可。 - Razorx

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接