Соединение Powershell на переменную и на хост записи одновременно

Привет всем и спасибо за ваше время заранее;

Я столкнулся с небольшой проблемой.

Я запускаю команду и помещаю ее в переменную, чтобы я мог манипулировать выводом.

$variable = some command

это обычно работает нормально, но не выводит то, что происходит на экран, что нормально в большинстве случаев. Однако иногда эта команда требует некоторого пользовательского ввода (например, да или нет или пропуска, например), и, поскольку она на самом деле ничего не передает в командное окно, она просто висит там, вместо того, чтобы запрашивать пользователя. Если вы знаете, чего ожидать, вы можете нажать y или n или s, и все пойдет нормально.

Есть ли какой-либо способ выполнить команду, чтобы вывод передавался в переменную И появлялся на экране? Я уже попробовал:

($variable = some command) 

Я также попробовал:

write-host ($variable = some command) 

Но ни одна из них не работает. Обратите внимание, что команда, запущенная не является родной командой windows или командой оболочки, и я не могу просто запустить ее дважды подряд.

Чтобы уточнить (потому что я, вероятно, не было ясно)

Я также попробовал:

$variable = some command : Out-host

а также

$variable = some command | out-default

со всеми их параметрами, но "подсказка" из команды (для записи y, n, s) не отображается.

Возможность пройти S автоматически также будет приемлемым.

3 ответа

Похоже, вам нужно Tee-Object, Пример:

some command | Tee-Object -Variable MyVariable

Это должно передать все от команды по конвейеру, а также сохранить весь вывод команды в $MyVariable переменная для вас.

Вам нужно привести какой-то конкретный пример, который не работает. Я попробовал это, и это работает:

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

Чтобы это работало:

а) Заменить вышеуказанную команду на: "Say something:"; $x= ./test.cmd, Это, очевидно, не идеально в общем случае, так как вы можете не знать заранее, что спросит *.cmd. Но когда ты знаешь, это очень легко.

б) Попробуйте это:

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
      $variable = ""
some command | % {$variable += $_;"$_"}

Это выполняет команду, и каждая строка вывода добавляется к переменной $ и выводится на консоль.

Другие вопросы по тегам