Я хочу, чтобы мой сценарий PowerShell напечатал что-то вроде этого:
Enabling feature XYZ......Done
Скрипт выглядит примерно так:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Но Write-Output
всегда печатает новую строку в конце, поэтому мой вывод не находится в одной строке. Есть ли способ сделать это?
powershell
Амит Джи
источник
источник
Ответы:
источник
Write-Output
, который имеет совершенно другие функции, чемWrite-Host
. Читатели должны обратить внимание на это большое несоответствие, прежде чем копировать / вставлять ответ.Write-Host
почти никогда не бывает правильным ответом. Это то же самое, что и>/dev/tty
в Unixland.Write-Progress
может быть уместным в некоторых случаях, см. пример ниже.Write-Output
.Write-Output
не имеет-NoNewLine
параметра.К сожалению, как отмечено в нескольких ответах и комментариях,
Write-Host
может быть опасным и не может быть передан другим процессам иWrite-Output
не имеет-NoNewline
флага.Но эти методы представляют собой способы "* nix" для отображения прогресса, способ "PowerShell", по-видимому, таков
Write-Progress
: он отображает панель в верхней части окна PowerShell с информацией о ходе выполнения, доступной начиная с PowerShell 3.0, см. Руководство для Детали.# Total time to sleep $start_sleep = 120 # Time to sleep between each notification $sleep_iteration = 30 Write-Output ( "Sleeping {0} seconds ... " -f ($start_sleep) ) for ($i=1 ; $i -le ([int]$start_sleep/$sleep_iteration) ; $i++) { Start-Sleep -Seconds $sleep_iteration Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) ( " {0}s ..." -f ($i*$sleep_iteration) ) } Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) -Completed "Done waiting for X to finish"
И чтобы взять пример OP:
# For the file log Write-Output "Enabling feature XYZ" # For the operator Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... " ) Enable-SPFeature... # For the operator Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... Done" ) # For the log file Write-Output "Feature XYZ enabled"
источник
Хотя это может не работать в вашем случае (поскольку вы предоставляете пользователю информативный вывод), создайте строку, которую вы можете использовать для добавления вывода. Когда пришло время вывести его, просто выведите строку.
Игнорируя, конечно, то, что этот пример глуп в вашем случае, но полезен по идее:
$output = "Enabling feature XYZ......." Enable-SPFeature... $output += "Done" Write-Output $output
Отображает:
источник
Write-Output
. Разумное решение, но не решение.Да, поскольку в других ответах есть состояния, это невозможно сделать с помощью записи-вывода. Если PowerShell не работает, обратитесь к .NET, здесь есть даже пара ответов .NET, но они сложнее, чем должны быть.
Просто используйте:
[Console]::Write("Enabling feature XYZ.......") Enable-SPFeature... Write-Output "Done"
Это не самый чистый PowerShell, но он работает.
источник
Write-Host
, только люди этого не ожидают.Для записи в файл вы можете использовать массив байтов. В следующем примере создается пустой ZIP-файл, в который вы можете добавлять файлы:
[Byte[]] $zipHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 [System.IO.File]::WriteAllBytes("C:\My.zip", $zipHeader)
Или используйте:
[Byte[]] $text = [System.Text.Encoding]::UTF8.getBytes("Enabling feature XYZ.......") [System.IO.File]::WriteAllBytes("C:\My.zip", $text)
источник
Упрощение ответа FrinkTheBrave:
[System.IO.File]::WriteAllText("c:\temp\myFile.txt", $myContent)
источник
Проблема, с которой я столкнулся, заключалась в том, что Write-Output фактически прерывает вывод при использовании PowerShell v2, по крайней мере, для stdout. Я безуспешно пытался записать XML-текст в стандартный вывод, потому что он был бы жестко привязан к символу 80.
Обходной путь заключался в использовании
[Console]::Out.Write($myVeryLongXMLTextBlobLine)
Это не было проблемой в PowerShell v3. Кажется, что запись-вывод там работает правильно.
В зависимости от того, как вызывается сценарий PowerShell, вам может потребоваться использовать
прежде чем писать в stdout.
источник
Кажется, в PowerShell это невозможно сделать. Все предыдущие ответы неверны, потому что они не ведут себя так, как
Write-Output
ведет себя, а больше похоже на то,Write-Host
что в любом случае не имеет этой проблемы.Кажется, что закрывающее решение используется
Write-Host
с-NoNewLine
параметром. Вы не можете передать это по конвейеру, что обычно является проблемой, но есть способ переопределить эту функцию, как описано в Write-Host => Export to a file , поэтому вы можете легко заставить ее принимать параметр для выходного файла. Это еще далеко не лучшее решение. ПриStart-Transcript
этом более удобные, но командлет имеет проблемы с родными приложениями.Write-Output
просто не может делать то, что вам нужно в общем контексте.источник
Write-Host
ужасен, разрушитель миров, но вы можете использовать его только для отображения прогресса пользователю при использованииWrite-Output
для входа в систему (не то, чтобы OP запрашивал запись).Write-Output "Enabling feature XYZ" | Out-File "log.txt" # Pipe to log file Write-Host -NoNewLine "Enabling feature XYZ......." $result = Enable-SPFeature $result | Out-File "log.txt" # You could try{}catch{} an exception on Enable-SPFeature depending on what it's doing if ($result -ne $null) { Write-Host "complete" } else { Write-Host "failed" }
источник
Write-Progress
.Вы просто не можете заставить PowerShell опустить эти надоедливые символы новой строки ... Нет сценария или командлета, которые бы это сделали. Конечно, Write-Host - это полная ерунда, потому что вы не можете перенаправить / перенаправить с него!
Тем не менее, вы можете написать свой собственный EXE-файл для этого, что я объяснил, как это сделать, в вопросе о переполнении стека Как вывести что-то в PowerShell .
источник
Ответ шуфлера правильный. Другими словами: вместо передачи значений в Write-Output с использованием ФОРМЫ ARRAY FORM,
Write-Output "Parameters are:" $Year $Month $Day
или эквивалент несколькими вызовами Write-Output,
Write-Output "Parameters are:" Write-Output $Year Write-Output $Month Write-Output $Day Write-Output "Done."
сначала объедините свои компоненты в ПЕРЕМЕННУЮ СТРОКУ:
$msg="Parameters are: $Year $Month $Day" Write-Output $msg
Это предотвратит промежуточные CRLF, вызванные многократным вызовом Write-Output (или ARRAY FORM), но, конечно, не подавит окончательный CRLF командлета Write-Output. Для этого вам придется написать свой собственный командлет, использовать один из других запутанных обходных путей, перечисленных здесь, или подождать, пока Microsoft решит поддержать
-NoNewline
опцию Write-Output.Ваше желание предоставить на консоль текстовый индикатор выполнения (например, «....») вместо записи в файл журнала также должно быть удовлетворено с помощью Write-Host. Вы можете выполнить и то, и другое, собрав текст сообщения в переменную для записи в журнал И используя Write-Host для отображения прогресса на консоли. Эту функциональность можно объединить в ваш собственный командлет для максимального повторного использования кода.
источник
Write-Output
, вы просто не можете его видеть, потому что это последнее, что написано. Разумное решение, но не решение. Возможно, что-то потребляет результирующий вывод, но не может обработать завершающую новую строку.Я обманул, но считаю, что это единственный ответ, отвечающий всем требованиям. А именно, это позволяет избежать замыкающего CRLF, предоставляет место для завершения другой операции и при необходимости правильно перенаправляет на стандартный вывод.
$c_sharp_source = @" using System; namespace StackOverflow { public class ConsoleOut { public static void Main(string[] args) { Console.Write(args[0]); } } } "@ $compiler_parameters = New-Object System.CodeDom.Compiler.CompilerParameters $compiler_parameters.GenerateExecutable = $true $compiler_parameters.OutputAssembly = "consoleout.exe" Add-Type -TypeDefinition $c_sharp_source -Language CSharp -CompilerParameters $compiler_parameters .\consoleout.exe "Enabling feature XYZ......." Write-Output 'Done.'
источник
Следующее вернет курсор в начало предыдущей строки. Вы можете поместить его в правильное горизонтальное положение (используя $ pos.X, чтобы переместить его в сторону):
$pos = $host.ui.RawUI.get_cursorPosition() $pos.Y -= 1 $host.UI.RawUI.set_cursorPosition($Pos)
Ваш текущий вывод превышает 27 пробелов, поэтому $ pos.X = 27 может работать.
источник
$pos.X
. Проблема в том, что если вы отправите его в файл, появятся две отдельные строки.Это может быть не очень элегантно, но делает именно то, что просил OP. Обратите внимание, что ISE портит StdOut, поэтому вывода не будет. Чтобы увидеть, как работает этот сценарий, его нельзя запустить в ISE.
$stdout=[System.Console]::OpenStandardOutput() $strOutput="Enabling feature XYZ... " $stdout.Write(([System.Text.Encoding]::ASCII.GetBytes($strOutput)),0,$strOutput.Length) Enable-SPFeature... $strOutput="Done" $stdout.Write(([System.Text.Encoding]::ASCII.GetBytes($strOutput)),0,$strOutput.Length) $stdout.Close()
источник
[System.Console]
перенаправить в файл нельзя.$host.UI.Write('Enabling feature XYZ.......') Enable-SPFeature... $host.UI.WriteLine('Done')
источник
желаемый o / p: Включение функции XYZ ...... Готово
вы можете использовать команду ниже
$ a = "Включение функции XYZ"
Запись-вывод "$ a ...... Готово"
вам нужно добавить переменную и оператор в кавычки. надеюсь, это будет полезно :)
Спасибо Techiegal
источник
Вы абсолютно можете это сделать. У Write-Output есть флаг под названием « NoEnumerate », который по сути то же самое.
источник