我想在Windows Server 2008 R2的PowerShell的 - 啓動成績單:該主機不支持轉錄
Start-Transcript -path C:\Temp\test.txt
"Hello!"
Stop-Transcript
上啓動轉錄但PowerShell是返回以下消息:
Start-Transcript : This host does not support transcription.
如何有可能激活成績單?
我想在Windows Server 2008 R2的PowerShell的 - 啓動成績單:該主機不支持轉錄
Start-Transcript -path C:\Temp\test.txt
"Hello!"
Stop-Transcript
上啓動轉錄但PowerShell是返回以下消息:
Start-Transcript : This host does not support transcription.
如何有可能激活成績單?
Windows PowerShell v4 ISE及更低版本不支持轉錄。您必須使用命令行來運行commandlet。
從PowerShell v5開始 - 腳本本身在ISE中受支持。
要麼接受你不能,要麼使用支持轉錄本的主機(如控制檯主機:PowerShell.exe
)。
有什麼辦法可以嗅出你知道的東西,在ISE中阻止它,但允許它在控制檯中? – jcolebrand 2012-05-02 17:14:33
檢查`$ Host.Name`。 – Richard 2012-05-02 20:04: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
的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
相同的效果,並會產生權限錯誤。
繼@richard here的提示之後,我創建了一個片段,允許在需要它們的地方使用事務日誌(計劃任務),因此我在Windows 2008R2中結束了以下代碼,可以從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
}
標記上以驚人的答案和由@ 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
}
你使用的是什麼主機? – Richard 2011-02-17 17:08:53