PowerShell-Start-Transcript: cet hôte ne supporte pas la transcription
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?
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.
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
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
).
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.
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
}
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
}