Вопрос или проблема
При запуске скрипта через PSRemoting транскрипция пуста
У меня есть скрипт, который мне нужно запустить на наборе компьютеров. Он регистрирует все свои действия, используя встроенную функцию транскрипции. Это хорошо работает, когда скрипт выполняется обычным образом. Когда скрипт запускается в сессии PSRemoting, я вижу вывод в терминале, но результирующий файл транскрипции пуст. Я должен предположить, что это происходит из-за того, что стандартный вывод перенаправляется в удалённую сессию таким образом, что не фиксируется командой транскрипции.
Существует ли простой способ продолжать использовать функцию транскрипции и сделать так, чтобы она работала внутри сессии PSRemoting?
ПРИМЕР СКРИПТА:
#Run-My-Script.ps1
Set-PSDebug -Trace 1
$timeStamp = $(Get-Date -Format yyyyMMddTHHmmss)
$localTranscriptFile = "$PSScriptRoot\$env:COMPUTERNAME-ScriptOutput-$timeStamp.txt"
Start-Transcript -path $localTranscriptFile -append
# Выполнение некоторых команд
Write-Output "Важная информация для сохранения в файле журнала."
Stop-Transcript
Set-PSDebug -Trace 0
Запустите этот скрипт с PSRemoting:
Enter-PSSession ComputerName
.\Run-My-Script.ps1
В результате транскрипция пишется с заголовком и подвалом, но без содержимого.
Ответ или решение
Когда вы запускаете скрипт с помощью PSRemoting, и ваш транскрипт оказывается пустым, это действительно может быть связано с тем, как PowerShell обрабатывает вывод в удаленной сессии. При работе с командлетом Start-Transcript
в удаленной сессии некоторые команды могут не фиксировать вывод должным образом, так как стандартный вывод перенаправляется на удаленную машину.
Решение проблемы:
- Используйте
Invoke-Command
: Вместо запуска скрипта в интерактивной сессии (Enter-PSSession
), вы можете использовать командлетInvoke-Command
, который позволяет выполнять командлеты и скрипты на удаленных компьютерах и перенаправляет их выходные данные правильно.
Пример использования Invoke-Command
:
$timeStamp = $(Get-Date -Format yyyyMMddTHHmmss)
$localTranscriptFile = "\\<remote_computer_name>\<path>\$env:COMPUTERNAME-ScriptOutput-$timeStamp.txt" # Укажите путь к сетевой папке или локальную папку на удаленной машине
Invoke-Command -ComputerName <remote_computer_name> -ScriptBlock {
param ($localTranscriptFile)
Set-PSDebug -Trace 1
Start-Transcript -Path $localTranscriptFile -Append
# Выполните ваши команды
Write-Output "Важно сохранить эту информацию в лог-файле."
Stop-Transcript
Set-PSDebug -Trace 0
} -ArgumentList $localTranscriptFile
Обратите внимание, что в этом примере транскрипция будет выполнена непосредственно на удаленной машине, и путь к файлу транскрипции должен быть доступен на этой машине. Вы можете использовать сетевой путь к расположенному месту или путь на локальном диске на удаленном компьютере.
-
Проверьте права доступа: Убедитесь, что у вас есть необходимые права доступа для записи транскрипта в указанную директорию на удаленной машине. Если вы используете сетевую папку, проверьте, что учетные данные, используемые для PSRemoting, имеют доступ к этой папке.
- Логирование с использованием
Out-File
: ЕслиStart-Transcript
не работает так, как ожидалось, вы можете использовать альтернативный метод логирования с помощьюOut-File
. Вместо транскрипции, вы можете сохранять вывод команд в файл:
$timeStamp = $(Get-Date -Format yyyyMMddTHHmmss)
$localLogFile = "\\<remote_computer_name>\<path>\$env:COMPUTERNAME-ScriptOutput-$timeStamp.txt"
Invoke-Command -ComputerName <remote_computer_name> -ScriptBlock {
param ($localLogFile)
Set-PSDebug -Trace 1
# Выполните ваши команды и перенаправьте вывод в файл
"Важно сохранить эту информацию в лог-файле." | Out-File -FilePath $localLogFile -Append
Set-PSDebug -Trace 0
} -ArgumentList $localLogFile
Этот метод обеспечивает сохранение любых выходных данных прямо в указанный файл, не полагаясь на механизм транскрипции, который может некорректно работать в удаленной сессии.
Следуя этим рекомендациям, вы сможете сохранять все необходимые данные при запуске скриптов через PSRemoting, избегая пустых транскриптов.