Ответ 1
Windows PowerShell v4 ISE и ниже не поддерживают транскрипцию. Вы должны использовать командную строку для запуска командной строки.
Из PowerShell v5 Start-Transcript поддерживается в ISE.
Я хочу начать запись на Windows Server 2008 R2
Start-Transcript -path C:\Temp\test.txt
"Hello!"
Stop-Transcript
Но PowerShell возвращает следующее сообщение:
Start-Transcript : This host does not support transcription.
Как активировать транскрипцию?
Windows PowerShell v4 ISE и ниже не поддерживают транскрипцию. Вы должны использовать командную строку для запуска командной строки.
Из PowerShell v5 Start-Transcript поддерживается в ISE.
ПОЛНЫЙ ОТВЕТ (PowerShell ISE 2.0/4.0)::
Имея еще один взгляд на это сегодня на другом сервере, я заметил, что последняя версия PowerShell ISE (которая также не позволяет Start-Transcript) не имеет панели "Вывод", а вместо нее использует новую консольную панель. Таким образом, теперь функция выглядит следующим образом:
Function Start-iseTranscript
{
Param(
[string]$logname = (Get-logNameFromDate -path "C:\fso" -postfix " $(hostname)" -Create)
)
$transcriptHeader = @"
**************************************
Windows PowerShell ISE Transcript Start
Start Time: $((get-date).ToString('yyyyMMddhhmmss'))
UserName: $env:username
UserDomain: $env:USERDNSDOMAIN
ComputerName: $env:COMPUTERNAME
Windows version: $((Get-WmiObject win32_operatingsystem).version)
**************************************
Transcript started. Output file is $logname
"@
$transcriptHeader >> $logname
$psISE.CurrentPowerShellTab.Output.Text >> $logname
#Keep current Prompt
if ($Global:__promptDef -eq $null)
{
$Global:__promptDef = (gci Function:Prompt).Definition
$promptDef = (gci Function:Prompt).Definition
} else
{
$promptDef = $Global:__promptDef
}
$newPromptDef = @'
if ($Host.Version.Major -eq 2)
{
if ($Global:_LastText -ne $psISE.CurrentPowerShellTab.Output.Text)
{
Compare-Object -ReferenceObject ($Global:_LastText.Split("`n")) -DifferenceObject ($psISE.CurrentPowerShellTab.Output.Text.Split("`n"))|?{$_.SideIndicator -eq "=>"}|%{
$_.InputObject.TrimEnd()}|Out-File -FilePath ($Global:_DSTranscript) -Append
$Global:_LastText = $psISE.CurrentPowerShellTab.Output.Text
}
} elseif ($Host.Version.Major -eq 4)
{
if ($Global:_LastText -ne $psISE.CurrentPowerShellTab.ConsolePane.Text)
{
Compare-Object -ReferenceObject ($Global:_LastText.Split("`n")) -DifferenceObject ($psISE.CurrentPowerShellTab.ConsolePane.Text.Split("`n"))|?{$_.SideIndicator -eq "=>"}|%{
$_.InputObject.TrimEnd()}|Out-File -FilePath ($Global:_DSTranscript) -Append
$Global:_LastText = $psISE.CurrentPowerShellTab.ConsolePane.Text
}
}
'@ + $promptDef
$Global:_LastText = $psISE.CurrentPowerShellTab.Output.Text
New-Item -Path Function: -Name "Global:Prompt" -Value ([ScriptBlock]::Create($newPromptDef)) -Force|Out-Null
}
Выполнение запроса невероятно полезно для этого, однако сохранение двух копий выходного буфера не является идеальным. Я также добавил в TrimEnd(), поскольку PSISE 2.0 любит добавлять пробелы, чтобы заполнить всю ширину горизонтальной линии. Не уверен, что PSISE 4.0 тоже делает это, но теперь это не проблема.
NEW ANSWER (PowerShell ISE 2.0)::
Я только что вернулся к этой проблеме, и есть способ заставить каждое обновление в PowerShell ISE выйти из системы по мере выполнения команды. Это зависит от пути журнала, который сохраняется в глобальной переменной, называемой _DSTranscript. Эта переменная передается функции Start-iseTranscript. Затем я захватил функцию Prompt, чтобы выполнить сравнение между _LastText и выходным текстом hostUI и добавить отличия в журнал. Теперь он работает.
Function Start-iseTranscript
{
Param(
[string]$logname = (Get-logNameFromDate -path "C:\fso" -postfix " $(hostname)" -Create)
)
$transcriptHeader = @"
**************************************
Windows PowerShell ISE Transcript Start
Start Time: $(get-date)
UserName: $env:username
UserDomain: $env:USERDNSDOMAIN
ComputerName: $env:COMPUTERNAME
Windows version: $((Get-WmiObject win32_operatingsystem).version)
**************************************
Transcript started. Output file is $logname
"@
$transcriptHeader >> $logname
$psISE.CurrentPowerShellTab.Output.Text >> $logname
#Keep current Prompt
if ($__promptDef -eq $null)
{
$__promptDef = (gci Function:Prompt).Definition
$promptDef = (gci Function:Prompt).Definition
} else
{
$promptDef = $__promptDef
}
$newPromptDef = @'
if ($global:_LastText -ne $psISE.CurrentPowerShellTab.Output.Text)
{
Compare-Object -ReferenceObject $global:_LastText.Split("`n") -DifferenceObject $psISE.CurrentPowerShellTab.Output.Text.Split("`n")|?{$_.SideIndicator -eq "=>"}|%{ $_.InputObject.TrimEnd()}|Out-File -FilePath ($Global:_DSTranscript) -Append
$global:_LastText = $psISE.CurrentPowerShellTab.Output.Text
}
'@ + $promptDef
New-Item -Path Function: -Name "Global:Prompt" -Value ([ScriptBlock]::Create($newPromptDef)) -Force|Out-Null
}
ОРИГИНАЛЬНЫЙ ОТВЕТ::
PowerShell ISE не поддерживает изначально. Транскрипция. Существует блог сценариев о том, как это сделать. К сожалению, это должно быть последнее, что выполняется в script. Это означает, что вам нужно помнить, что нужно запустить его перед закрытием окна. Я хотел бы, чтобы это работало лучше, или был способ заставить его работать при закрытии окна.
Это функция, которая производит почти тот же результат, что и функция Start-Transcript:
Function Start-iseTranscript
{
Param(
[string]$logname = (Get-logNameFromDate -path "C:\fso" -name "log" -Create)
)
$transcriptHeader = @"
**************************************
Windows PowerShell ISE Transcript Start
Start Time: $(get-date)
UserName: $env:username
UserDomain: $env:USERDNSDOMAIN
ComputerName: $env:COMPUTERNAME
Windows version: $((Get-WmiObject win32_operatingsystem).version)
**************************************
Transcript started. Output file is $logname
"@
$transcriptHeader >> $logname
$psISE.CurrentPowerShellTab.Output.Text >> $logname
} #end function start-iseTranscript
Либо принять, что вы не можете, либо использовать хост, который поддерживает транскрипты (например, хост консоли: PowerShell.exe
).
powershell.exe
также генерирует эту ошибку, если есть проблема с записью в файл журнала. Например, если файл журнала был создан администратором, и у пользователя нет прав на перезапись журнала.
Start-Transcript : The host is not currently transcribing.
At D:\Test1.ps1:9 char:1
+ Start-Transcript -Path "$Source\logs\Test.txt"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Start-Transcript], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.StartTranscriptCommand
Хорошим решением является попытка использовать -Append
или сделать файл журнала уникальным, создав отметку даты/времени.
Start-Transcript -Path "$Source\logs\Test.txt" -Append
Таким образом создается соответствующее сообщение об ошибке.
Access to the path 'D:\Test\logs\Test.txt' is denied.
-Force
имеет тот же эффект, что и -Append
, и генерирует ошибку разрешений.
Следуя подсказке от @richard здесь, я создал фрагмент, который позволяет использовать журналы транзакций там, где они мне нужны (запланированные задачи), поэтому я закончил работу в Windows 2008R2 следующий код, который может быть запущен из PowerShell ISE или как автономный script.
if ($Host.Name -eq "Windows PowerShell ISE Host") {
$ISE=$true
} else {
$ISE=$false
}
if (-Not $ISE) {
$Date = Get-Date -f HHmmss_ddyyyy
Start-Transcript -Path "C:\Temp\$Date.log"
}
//////////
code here ...
//////////
if (-Not $ISE) {
Stop-Transcript
}
Отмечая удивительный ответ и работу @dwarfsoft:
if ($Host.Name -match 'ISE' -and $Host.version.Major -lt 4)
{
#Start-Transcript will not work here. Use Start-iseTranscript by @dwarfsoft above
Start-iseTranscript
}
else
{
#Start Transcript Will work here
Start-Transcript
}