PowerShell-Start-Transcript: cet hôte ne supporte pas la transcription

<!-Je veux commencer la transcription sur un serveur Windows 2008 R2

Start-Transcript -path C:Temptest.txt
"Hello!"
Stop-Transcript

mais le PowerShell renvoie le message suivant:

Start-Transcript : This host does not support transcription.

Comment est-il possible d'activer transcript?

19
demandé sur LaPhi 2011-02-17 20:03:50

6 réponses

Windows PowerShell v4 ISE et lower ne supportent pas la transcription. Vous devez utiliser la ligne de commande pour exécuter le commandlet.

From PowerShell v5 Start-Transcript is supported nativement in ISE.

29
répondu Adam Prax 2017-09-29 11:16:04

COMPLETE ANSWER (PowerShell ISE 2.0 / 4.0)::

ayant encore un autre regard sur ceci aujourd'hui sur un autre serveur, j'ai remarqué que la dernière PowerShell ISE (qui n'autorise pas non plus Start-Transcript) n'a pas de volet de sortie, et utilise plutôt le nouveau ConsolePane. Ainsi, la fonction est maintenant la suivante:

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
}

prendre en charge l'invite est incroyablement utile pour cela, cependant garder deux copies du tampon de sortie n'est pas idéal. J'ai également ajouté dans TrimEnd () comme PSISE 2.0 aime ajouter des espaces pour remplir toute la largeur de la ligne horizontale. Je ne suis pas sûr que PSISE 4.0 le fasse aussi, mais ce n'est pas un problème maintenant de toute façon.

NEW ANSWER (PowerShell ISE 2.0)::

je reviens tout juste à ce problème, et il y a un moyen de forcer chaque mise à jour dans PowerShell ISE à se déconnecter quand une commande est exécutée. Cela dépend du chemin de journalisation enregistré dans une Variable globale appelée _DSTranscript. Cette variable est passée à la fonction Start-iseTranscript. J'ai ensuite détourné la fonction Prompt pour exécuter une comparaison entre _LastText et le texte de sortie de hostUI, et ajouter les différences au journal. Il travaille maintenant un régal.

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
}

RÉPONSE ORIGINALE::

PowerShell ISE does not nativement le soutien à la Transcription. Il y a un scripteur blog sur la façon d'y parvenir. Malheureusement, ce doit être la dernière chose qui est exécuté dans le script. Cela signifie que vous devez vous souvenir de l'exécuter avant de fermer la fenêtre. J'aimerais que ça marche mieux, ou qu'il y ait un moyen de forcer la fermeture des fenêtres.

c'est la fonction qui produit presque le même résultat que la fonctionnalité 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
17
répondu dwarfsoft 2014-07-15 07:15:56

accepter que vous ne pouvez pas, ou utiliser un hôte qui prend en charge les relevés de notes (comme la console de l'hôte: PowerShell.exe).

1
répondu Richard 2011-02-17 17:08:54

powershell.exe générera aussi cette erreur s'il y a un problème d'écriture dans le fichier journal. Par exemple, si le fichier journal a été créé par un administrateur et l'utilisateur ne dispose pas des autorisations pour remplacer le journal.

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

Une bonne solution est d'essayer en utilisant -Append ou pour rendre le fichier journal unique en générant un tampon date / heure.

Start-Transcript -Path "$Source\logs\Test.txt" -Append

de cette façon, un message d'erreur approprié est généré.

Access to the path 'D:\Test\logs\Test.txt' is denied.

-Force a le même effet que -Append et va générer une erreur de permission.

0
répondu Jason 2016-01-02 11:04:03

suivant le Conseil de @ richard ici j'ai créé un snippet qui permet l'utilisation des journaux de transactions là où j'en ai besoin (tâches programmées), donc j'ai fini par avoir dans Windows 2008R2 le code suivant qui peut être exécuté à partir de powershell ISE ou comme un script autonome.

  • lors de l'exécution dans ISE, les informations du journal seront imprimées sur l'écran
  • lorsqu'il est exécuté sous forme de script, les informations du log seront sauvegardées dans un fichier
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
répondu user322049 2017-05-23 12:17:11

Marquage sur l'incroyable réponse et de travail par @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
répondu Gaurav 2018-01-07 22:03:39