Соединение 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 += $_;"$_"}
Это выполняет команду, и каждая строка вывода добавляется к переменной $ и выводится на консоль.