Start-Transcript: этот хост не поддерживает транскрипцию - PullRequest
20 голосов
/ 17 февраля 2011

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

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

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

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

Как можно активировать стенограмму?

Ответы [ 7 ]

30 голосов
/ 17 февраля 2011

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

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

17 голосов
/ 14 августа 2012

ПОЛНЫЙ ОТВЕТ (PowerShell ISE 2.0 / 4.0) ::

Еще раз посмотрев сегодня на другой сервер, я заметил, что последний ISE PowerShell (который также не позволяетStart-Transcript) не имеет панели вывода, а вместо этого использует новую панель ConsolePane.Таким образом, теперь функция выглядит следующим образом:

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 делает это тоже, но теперь это все равно не проблема.

НОВЫЙ ОТВЕТ (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 не поддерживает изначально поддерживает транскрипцию,О том, как этого добиться, есть блог сценаристов . К сожалению, это должно быть последним, что запускается в скрипте.Это означает, что вам нужно помнить, чтобы запустить его перед закрытием окна.Хотелось бы, чтобы это работало лучше, или был способ заставить его работать при закрытии окна.

Эта функция выдает результат, близкий к тому же, что и у функции 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
1 голос
/ 17 февраля 2011

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

0 голосов
/ 07 февраля 2019

В дополнение к ISE (который я отмечаю, что оригинальный плакат LaPhi даже не упоминает), другая вещь, которая может вызвать эту ошибку, - это если вы пытаетесь использовать Start-Transcript в блоке сценария Invoke-Command. Например, если вы запускаете сценарий на своем клиентском компьютере, а затем подключаетесь к Windows Server 2008 R2 через Invoke-Command, чтобы Start-Transcript выводил на сервер.

При запуске в локальном сеансе Start-Transcript работает должным образом, однако при использовании Invoke-Command скрипт запускается в удаленном сеансе на этом компьютере, и удаленные сеансы имеют определенные ограничения, одно из которых не поддерживает транскрипцию. 1003 *

0 голосов
/ 08 января 2018

Переход к удивительному ответу и работе @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
}
0 голосов
/ 18 февраля 2016

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

  • При запуске в ISE информация журнала будет выводиться на экран
  • При запуске в виде скрипта информация журнала будет сохранена в файл
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
}
0 голосов
/ 02 января 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...