1

如何捕获 PowerShellStart-Transcript命令的默认路径以进一步调用它Invoke-Item?有没有办法通过管道Start-Transcript传输到变量并拆分脚本文件的完整路径?

Start-Transcript | $TranscriptFile

Stop-Transcript    
Invoke-Item $TranscriptFile
4

3 回答 3

1

我发现:

Start-Transcript | Select Path -OutVariable TranscriptFile 
Stop-Transcript 
Invoke-Item $TranscriptFile.Path
于 2017-07-29T03:09:03.660 回答
0

最简单的 PSv5+解决方案:

$transcriptFilePath = (Start-Transcript).Path 
# ...
$null = Stop-Transcript
Invoke-Item $transcriptFilePath

虽然Start-Transcript状态消息输出为字符串(其中还包含脚本文件路径,但必须从消息中提取),但该字符串实例具有.Path包含脚本文件路径的由 PowerShell 添加的属性。

通常,您可以通过属性查询对象的 PS 添加.psextended属性(对 Tab 补全隐藏Get-Member,默认隐藏):

> (Start-Transcript).psextended 

Path                                                                          
----                                                                          
/Users/jdoe/PowerShell_transcript.JdoesMachine.Q83psmn4.20170729002407.txt

PSv4-解决方案:

.Path属性是在 v5 中引入的,因此在早期版本中需要采用不同的方法。

# Remove everything from the message before the file path.    
$transcriptFilePath = (Start-Transcript) -replace '^.*?(?=[a-z]:[\\/])'

请注意,由于文件路径通常没有嵌入空格,因此更简单的方法通常可以工作,但$transcriptFilePath = (-split (Split-Path))[-1]PetSerAl指出它们可以,因为您可以将 Documents 文件夹重定向到任意位置并且用户名可能包含空格。

这是可行的,因为生成的默认文件路径在状态消息中最后Start-TranScript提到,没有尾随字符。 请注意,我假设 状态消息的本地化版本最后还提到了脚本文件路径,但我尚未验证。

于 2017-07-29T04:27:25.177 回答
0

您可以使用 $TRANSCRIPT 全局变量将其设置为您想要的任何位置,而不是捕获默认位置,例如:

$MyTranscriptFile = 'C:\MyFolder\PowerShell_transcript.'+$Env:COMPUTERNAME+'.'+(Get-Date).ToString("yyyyMMdd.HHmmss")+'.txt'
$TRANSCRIPT = $MyTranscriptFile
Start-Transcript

Stop-Transcript
Invoke-Item $MyTranscriptFile

要重置回 Powershell 的默认位置,只需分配 $null:

$TRANSCRIPT = $null
于 2020-03-01T04:44:48.453 回答