Подтвердить что ты не робот

PowerShell - Start-Transcript: Этот хост не поддерживает транскрипцию

Я хочу начать запись на Windows Server 2008 R2

Start-Transcript -path C:\Temp\test.txt
"Hello!"
Stop-Transcript

Но PowerShell возвращает следующее сообщение:

Start-Transcript : This host does not support transcription.

Как активировать транскрипцию?

4b9b3361

Ответ 1

Windows PowerShell v4 ISE и ниже не поддерживают транскрипцию. Вы должны использовать командную строку для запуска командной строки.

Из PowerShell v5 Start-Transcript поддерживается в ISE.

Ответ 2

ПОЛНЫЙ ОТВЕТ (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

Ответ 3

Либо принять, что вы не можете, либо использовать хост, который поддерживает транскрипты (например, хост консоли: PowerShell.exe).

Ответ 4

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, и генерирует ошибку разрешений.

Ответ 5

Следуя подсказке от @richard здесь, я создал фрагмент, который позволяет использовать журналы транзакций там, где они мне нужны (запланированные задачи), поэтому я закончил работу в Windows 2008R2 следующий код, который может быть запущен из PowerShell ISE или как автономный script.

  • При запуске в 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
}

Ответ 6

Отмечая удивительный ответ и работу @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
}