Как перенаправить вывод из команды в переменную? - PullRequest
1 голос
/ 28 июня 2019

Как перенаправить вывод этой команды в переменную?

Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop

я пробовал это:

Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop >$output

$output

ничего не отображал. команда iteslf действительно что-то выводит. но я хочу сохранить этот вывод в переменную

Операция восстановления базы данных успешно завершена.

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Полезный ответ ди-джея показывает самый простой способ зафиксировать вывод любой команды (успех) в переменной - путем прямого назначения.


Что касается того, что вы пытались:

>$output

>, оператор перенаправления вывода поддерживает перенаправление только на файлы указано их именем / путем (он также поддерживает , подавляя вывод с >$null) - вы не можете использовать его для сохранения вывода в переменной .

Следовательно, значение $output будет интерпретироваться как имя / путь целевого файла;если переменная $output никогда не создавалась, это равносильно > $null, т. е. вывод suppression .

Также обратите внимание, что файлы, создаваемые >, неизменно plain-text файлы, которые отражают тот же формат вывода, который вы видите в консоли (терминале), и поэтому не подходят для программной обработки.


Byнапротив, общий параметр -OutVariable (-ov), который вы упоминаете в комментарии , делает , позволяет захватывать выходные объекты команды в переменную , не мешаявывод команды.

То есть вывод команды все еще (также) записывается в выходной поток, и если этот вывод не используется (другой командой, назначением переменной или перенаправлением)), он по-прежнему выводится на консоль.

Например, -OutVariable output сохраняет выходные данные командлета / расширенной функции в переменной $output - обратите внимание на отсутствие $ в аргументе -OutVariable:

PS> Get-Date -OutVariable output; $output

Thursday, June 27, 2019 10:17:07 PM  # direct Get-Date output
Thursday, June 27, 2019 10:17:07 PM  # output from $output

Следовательно, -OutVariable (-ov) полезно:

  • , если вы хотите видеть вывод команды в консоли, а также записывать этот вывод в переменную для последующего анализа.

  • , если вы хотите захватить вывод промежуточной команды внутри конвейера без вмешательства в конвейер.


A Небольшое предостережение re -OutVariable (-ov) в том, что оно:

  • создает не обычные массивы PowerShell ([object[]]), а экземпляры [System.Collections.ArrayList].

  • создает - одноэлементный - [System.Collections.ArrayList], даже если команда выводит только объект single (как, например, Get-Date).

Это удивительное поведение обсуждается в этой проблеме GitHub .

Однако, учитывая гибкую обработку коллекции PowerShell и функцию перечисления членов *1107*, поведение на практике не всегда может быть проблематичным.

2 голосов
/ 28 июня 2019

Вы сохраняете вывод команды как переменную, подобную этой:

$commandOutput = Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...