2011-02-17 20 views

Respuesta

29

Windows PowerShell v4 ISE y versiones anteriores no son compatibles con la transcripción. Debe usar la línea de comando para ejecutar el comando.

De PowerShell v5 Start-Transcript es compatible de forma nativa en ISE.

RESPUESTA
+0

Solucionado en PowerShell v5 – Rod

1

Acepte que no puede o use un host que no admite transcripciones (como el host de la consola: PowerShell.exe).

+0

¿Alguna manera de olfatear esto de lo que usted está enterado, para evitarlo en el ISE pero permitirlo en la consola? – jcolebrand

+2

Verificar '$ Host.Name'. – Richard

+0

Buena llamada. ¡Gracias! – jcolebrand

17

COMPLETA (PowerShell ISE 2.0/4.0) ::

, teniendo aún otro vistazo a esto hoy en otro servidor, me di cuenta de que la última PowerShell ISE (que también no permite Start-Transcript) hace no tiene un panel de Salida, y en su lugar usa el nuevo Panel de Consola. Así, la función ahora es como sigue:

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 
} 

Tomando sobre el símbolo es increíblemente útil para esto, sin embargo mantener dos copias de la memoria intermedia de salida no es ideal. También agregué TrimEnd() ya que a PSISE 2.0 le gusta agregar espacios para llenar todo el ancho de la línea horizontal. No estoy seguro si PSISE 4.0 también lo hace, pero de todos modos no es un problema.

nueva respuesta (PowerShell ISE 2.0) ::

he acabo de regresar a este problema, y ​​no hay una manera de forzar a cada actualización en PowerShell ISE para cerrar la sesión como se ejecuta un comando. Esto se basa en la ruta de registro que se guarda en una variable global llamada _DSTranscript. Esta variable se pasa a la función Start-iseTranscript. Luego he secuestrado la función Prompt para ejecutar una comparación entre _LastText y el texto de salida de hostUI, y anexar las diferencias al registro. Ahora funciona como un regalo.

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 
} 

respuesta original ::

PowerShell ISE no se forma nativa Transcripción apoyo. Hay un tipo de scripting blog about how to achieve this. Desafortunadamente esto tiene que ser lo último que se ejecuta en el script. Esto significa que debe recordar ejecutarlo antes de cerrar la ventana. Desearía que esto funcionara mejor, o hubiera una forma de forzarlo a funcionar al cerrar la ventana.

Esta es la función que produce cerca del mismo resultado que la función 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 
0

El powershell.exe también generará este error si hay un problema al escribir en el archivo de registro. Por ejemplo, si el archivo de registro fue creado por un administrador y el usuario no tiene permisos para sobrescribir el registro.

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 

Una buena solución es tratar de usar -Append o para hacer el archivo de registro único mediante la generación de una marca de fecha/hora.

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

De esta forma se genera un mensaje de error adecuado.

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

-Force tiene el mismo efecto que -Append y generará un error de permisos.

0

Seguí la sugerencia de @richard here Creé un fragmento que permite el uso de registros de transacciones donde los necesito (tareas programadas), así que terminé teniendo en Windows 2008R2 el siguiente código que se puede ejecutar desde el ISE de powershell o como secuencia de comandos independiente.

  • Cuando se ejecuta en ISE, la información de registro será impreso en la pantalla
  • Cuando se realiza según una secuencia de comandos, la información de registro se guardará en un archivo
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

Etiquetado en a la increíble respuesta y trabajo de @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 
} 
Cuestiones relacionadas