2011-02-17 96 views
19

我想在Windows Server 2008 R2的PowerShell的 - 啓動成績單:該主機不支持轉錄

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

上啓動轉錄但PowerShell是返回以下消息:

Start-Transcript : This host does not support transcription. 

如何有可能激活成績單?

+0

你使用的是什麼主機? – Richard 2011-02-17 17:08:53

回答

29

Windows PowerShell v4 ISE及更低版本不支持轉錄。您必須使用命令行來運行commandlet。

從PowerShell v5開始 - 腳本本身在ISE中受支持。

1

要麼接受你不能,要麼使用支持轉錄本的主機(如控制檯主機:PowerShell.exe)。

+0

有什麼辦法可以嗅出你知道的東西,在ISE中阻止它,但允許它在控制檯中? – jcolebrand 2012-05-02 17:14:33

+2

檢查`$ Host.Name`。 – Richard 2012-05-02 20:04:17

17

完整的答案(ISE的PowerShell 2.0/4.0)::

有另一個看這個今天在另一臺服務器上,我注意到,最新的PowerShell ISE(也不允許啓動抄本)呢沒有輸出窗格,而是使用新的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是否也這樣做,但現在不存在問題。

新的答案(ISE的PowerShell 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中不本身支持轉錄。有一位腳本專家blog about how to achieve this.不幸的是,這需要是在腳本中運行的最後一件事。這意味着您需要記住在關閉窗口之前運行它。我希望這樣做更好,或者有辦法迫使它在窗口關閉時運行。

這是產生接近相同的結果啓動成績單功能的功能:如果寫入日誌文件中的問題

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

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相同的效果,並會產生權限錯誤。

0

繼@richard here的提示之後,我創建了一個片段,允許在需要它們的地方使用事務日誌(計劃任務),因此我在Windows 2008R2中結束了以下代碼,可以從PowerShell ISE運行或作爲獨立腳本。

  • 當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

標記上以驚人的答案和由@ 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 
}