Предостережение :
Write-Host
предназначено для для отображения вывода , а не для вывода data - он обходит Поток вывода успешного завершения PowerShell (эквивалент стандартного вывода PowerShell), поэтому вывод из Write-Host
не может (непосредственно [1] ) быть записан в переменнойили не перенаправлены в файл - см. нижнюю половину этого ответа для получения дополнительной информации.
Используйте Write-Output
или - предпочтительно - PowerShell неявный вывод поведение вывод данные , подходящий для дальнейшей программный обработка .
В дополнение к этому фундаментальному различию Write-Host
и Write-Output
также отличаются по тому, как они обрабатывают аргументы :
# What Write-Host prints to the display is a *single string* that is
# the space-separated list of the (stringification of) its arguments.
PS> Write-Host file1, '>>', file2
file1 >> file2 # printed to *display* only
# Write-Output outputs each argument - whatever its data type - *separately*
# to the success output stream.
# In the case of *string* arguments, each string renders *on its own line*.
PS> Write-Output file1, '>>', file2
file1
>>
file2
Использование неявного вывода, эквивалент вышеупомянутой команды Write-Output
:
# Send an array of 3 strings to the success stream.
PS> 'file1', '>>', 'file2'
file1
>>
file2
Если вы перенаправите команду Write-Output
или ее неявный эквивалент toa file (с >
/ Out-File
или Set-Content
[2] ), вы получите такое же трехстрочное представление.
Если вы хотите вывести одну строку в виде data , используйте строку в кавычках ;чтобы ссылаться на переменные и вставлять подвыражения в строку, используйте расширяемую строку (интерполяция строки), "...
"(см. about_Quoting_Rules ), или используйте объединение строк (+
)
$arg1 = 'file1'; $arg2 = 'file2'
# Expandable string
PS> "$arg1 >> $arg2"
file1 >> file2
# String concatenation
PS> $arg1 + ' >> ' + $arg2
file1 >> file2
[1] В PowerShell v5 или более поздней версии вы можете сделать захватВывод / redirect Write-Host
через поток вывода информации , номер 6
, например: $writeHostOutput = & { Write-Host hi } 6>&1
. Однако обратите внимание, что поток вывода информации в первую очередь предназначен для работы с командлетом PSv5 + Write-Information
и общий параметр -InformationAction
.
[2] При только строки , >
/ Out-File
ведут себя так же, как Set-Content
, за исключением того, чтов Windows PowerShell применяется другой символ по умолчанию (не в PowerShell Core ). Для получения дополнительной информации о различиях см. этот ответ .