Измените «стандартную ошибку» на «стандартный вывод»

У меня есть сценарий PowerShell, который записывает сообщение об ошибке. Сценарий может быть таким простым, как следующее:

Write-Error 'foo'
Start-Sleep -s 5
Write-Error 'bar'

Сценарий, который я на самом деле вызываю, порождает внешний процесс, который требует времени для обработки и записывает стандартную ошибку.

Теперь, когда я вызываю сценарий следующим образом:

. myScript.ps1

Я получить сообщение об ошибке с обычным поведением PowerShell (т.е. красный текст и много отладочной информации). Поскольку этот текст не имеет отношения к PowerShell в моем реальном приложении, мне не нужна эта отладочная информация, и это только делает результат менее читаемым (и невозможным для обработки).

Есть ли способ перенаправить этот вывод непосредственно в стандартный вывод, чтобы я просто получил текст?

Я пробовал что-то вроде этого:

Write-Host ( . myScript.ps1 2>&1 )

Но это задерживает вывод, пока все не будет завершено.

Что касается «отладочной информации», когда я запускаю сценарий прямо сейчас, результат выглядит следующим образом (красным):

C:\path\to\myScript.ps1 : foo
Bei Zeile:1 Zeichen:2
+ . <<<<  'C:\path\to\myScript.ps1'
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,myScript.ps1

C:\path\to\myScript.ps1 : bar
Bei Zeile:1 Zeichen:2
+ . <<<<  'C:\path\to\myScript.ps1'
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,myScript.ps1

Когда я запускаю сценарий с Write-Host (. MyScript.ps1 2> & 1) , где вывод ошибки записывается в стандартный вывод, я получаю следующий результат:

foo bar

Это именно то, что я хотел бы получить, за исключением того, что Write-Host (. .) заставляет вывод появляться только после завершения сценария, поэтому я не могу получить никакой информации о ходе выполнения указанного сценария.

Чтобы действительно приблизиться к моей реальной проблеме (потому что это трудно объяснить с помощью чистого PowerShell ); У меня есть следующий скрипт Python, который приблизительно похож на то, что делает программа командной строки, которую я использую, т.е. он выполняет некоторую обработку и выводит на экран прогресс до стандартной ошибки:

#!/usr/bin/python
import sys, time
sys.stderr.write( 'Progressing... ' )
sys.stderr.flush()
time.sleep( 5 )
sys.stderr.write( 'done.\n' )
sys.stderr.flush()

Теперь, когда я вызываю его с помощью python script.py , он работает правильно и выводит строку «прогресс», ожидает 5 секунд и затем выводит «готово» в PowerShell (как обычный текст). Проблема в том, что теперь я хочу запустить это в задании , например: Start-Job {python script.py} .

Задание запускается правильно, а также отлично работает в фоновом режиме, но когда я хочу проверить его прогресс с помощью Receive-Job , я сначала не получаю никаких результатов, а после завершения скрипта / программы (то есть через 5 секунд) ), Я получаю следующий результат (снова красный):

Progressing... done.
    + CategoryInfo          : NotSpecified: (Progressing... done.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Очевидно, это не то, что я пытаюсь получить. Вместо этого я хочу получить фактический вывод, который был напечатан со стандартной ошибкой, как live (т.е. когда это происходит в сценарии) и без этого отладочного текста, связанного с PowerShell.

5
задан Peter Mortensen 3 January 2019 в 06:28
поделиться