시작-번역:이 호스트는 전사를 지원하지 않습니다.
윈도우즈 서버 2008 R2에서 스크립트를 시작하려는 경우
Start-Transcript -path C:\Temp\test.txt
"Hello!"
Stop-Transcript
그러나 PowerShell은 다음 오류 메시지를 반환합니다.
시작-트랜스크립트 : 이 호스트는 전사를 지원하지 않습니다.
스크립트를 활성화하는 방법은 무엇입니까?
윈도우즈 PowerShell v4 ISE 이하에서는 전사를 지원하지 않습니다.명령줄을 사용하여 명령줄을 실행해야 합니다.
From PowerShell v5 Start-Transcript는 ISE에서 기본적으로 지원됩니다.
전체 답변(PowerShell ISE 2.0/4.0):
오늘 다른 서버에서 이 문제를 다시 살펴보니 최신 PowerShell ISE(시작-트랜스크립트도 허용하지 않음)에는 출력 창이 없고 대신 새 콘솔 창이 사용됩니다.따라서 기능은 다음과 같습니다.
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
}
프롬프트를 넘겨받는 것은 매우 유용하지만 출력 버퍼의 복사본을 두 개 유지하는 것은 이상적이지 않습니다.PSISE 2.0은 전체 가로줄 너비를 채우기 위해 공백을 추가하는 것을 좋아하기 때문에 TrimEnd()에도 추가했습니다.PSISE 4.0에서도 이 작업을 수행할 수 있는지는 확실하지 않지만, 어쨌든 지금은 문제가 없습니다.
새로운 답변(PowerShell ISE 2.0):
최근에 이 문제로 돌아왔는데 명령이 실행될 때 PowerShell ISE의 모든 업데이트를 강제로 로그아웃하는 방법이 있습니다.이 작업은 _DSTranscript라는 글로벌 변수에 저장되는 로그 경로에 의존합니다.이 변수는 Start-iseTranscript 기능으로 전달됩니다.그런 다음 _LastText와 호스트 간의 비교를 실행하기 위해 프롬프트 기능을 하이잭했습니다.UI 출력 텍스트 및 차이점을 로그에 추가합니다.이제는 효과가 있습니다.
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는 기본적으로 전사를 지원하지 않습니다.이를 달성하는 방법에 대한 스크립팅 가이 블로그가 있습니다.안타깝게도 이 작업은 스크립트에서 마지막으로 실행되어야 합니다.이것은 창을 닫기 전에 실행해야 한다는 것을 의미합니다.이것이 더 잘 작동하거나 창문을 닫을 때 강제로 실행할 수 있는 방법이 있기를 바랍니다.
이 기능은 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
수 호스트: 허할수예수스지를호나스는트원트하크립거호트하스락없을음용콘솔예▁either▁that:PowerShell.exe).
그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의 팁을 따라 트랜잭션 로그를 필요한 곳에서 사용할 수 있는 스니펫(예약된 작업)을 만들었습니다. 따라서 Windows 2008 R2에서 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
}
@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
}
ISE(LaPhi가 언급하지도 않은 원래 포스터) 외에도 이 오류를 일으킬 수 있는 또 다른 이유는 Invoke-Command 스크립트 블록 내에서 Start-Transcript를 사용하려는 경우입니다.예를 들어 클라이언트 시스템에서 스크립트를 실행한 다음 Invoke-Command를 통해 윈도우즈 서버 2008 R2 상자에 연결하면 시작-트랜스크립트가 서버로 출력됩니다.
로컬 세션에서 실행할 때 Start-Transcript가 예상대로 작동하지만 Invoke-Command를 사용할 때 스크립트는 해당 컴퓨터의 원격 세션 내에서 실행되며 원격 세션 중 하나는 전사를 지원하지 않는 특정 제한 사항입니다.
언급URL : https://stackoverflow.com/questions/5032075/start-transcript-this-host-does-not-support-transcription
'programing' 카테고리의 다른 글
| 데이터베이스 이름 규칙: DATTIME 열 (0) | 2023.08.20 |
|---|---|
| macOS에서 Docker 데몬에 연결할 수 없음 (0) | 2023.08.20 |
| 각도 2에서 비동기 검증기에 데바운스 시간을 추가하는 방법은 무엇입니까? (0) | 2023.08.15 |
| Oracle PL/SQL에 대한 좋은 참조 자료 (0) | 2023.08.15 |
| 판다에서 데이터 프레임의 첫 번째 및 마지막 행 추출 (0) | 2023.08.15 |