我想在Windows Server 2008 R2上启动脚本
Start-Transcript -path C:\Temp\test.txt
"Hello!"
Stop-Transcript
Run Code Online (Sandbox Code Playgroud)
但PowerShell返回以下错误消息:
Start-Transcript:此主机不支持转录.
如何激活成绩单?
Ada*_*rax 31
Windows PowerShell v4 ISE及更低版本不支持转录.您必须使用命令行来运行该命令行开关.
来自PowerShell v5 Start-Transcript在ISE中原生支持.
dwa*_*oft 17
完整的答案(PowerShell ISE 2.0/4.0)::
今天在另一台服务器上再看一遍,我注意到最新的PowerShell ISE(也不允许使用Start-Transcript)没有Output窗格,而是使用新的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
}
Run Code Online (Sandbox Code Playgroud)
接管提示对此非常有用,但是保留两个输出缓冲区并不理想.我还添加了TrimEnd(),因为PSISE 2.0喜欢附加空格来填充整个水平线宽.不确定PSISE 4.0是否也这样做,但现在无论如何都没问题.
新的答案(PowerShell ISE 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
}
Run Code Online (Sandbox Code Playgroud)
原始答案::
PowerShell ISE中并不原生支持转录.有一篇关于如何实现这一目标的Scripting Guy 博客.不幸的是,这需要是脚本中运行的最后一件事.这意味着您需要记住在关闭窗口之前运行它.我希望这更好用,或者有办法强制它在关闭窗口时运行.
这是与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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66251 次 |
| 最近记录: |