Start-Transcript:此主机不支持转录

LaP*_*Phi 21 powershell

我想在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)