PowerShell相当于bash`exec> >(tee -a $ logfile); exec 2> >(tee -a $ logfile>& 2)`

时间:2013-04-12 19:08:30

标签: shell powershell

我正在将bash脚本日志记录到Powershell,该文件顶部有以下内容:

# redirect stderr and stdout
backupdir="/backup"
logfile=$backupdir/"std.log"
exec >  >(tee -a $logfile)
exec 2> >(tee -a $logfile >&2)
echo "directory listing:"
ls -la

使用exec语句,stdout和stderror都被重定向到日志文件。

bash中的exec命令非常好,因为重定向是在脚本开始时设置的一次。我想尽可能避免在每个命令上明确设置重定向。

PowerShell中是否有与上述相同的内容?

2 个答案:

答案 0 :(得分:1)

PowerShell 2,3,x让Transcript cmdlets尝试将PowerShell窗口的所有输出记录到文本文件中。有some limitations

  • 外部可执行stdout,未捕获stderr

以下示例代码演示了这一点:

$this_path = Split-Path -Path $MyInvocation.MyCommand.Path -Parent
$log_path = Join-Path -Path $this_path -ChildPath script_log.txt
Start-Transcript -Path $log_path
$VerbosePreference = "continue"
$ErrorActionPreference = "continue"
$DebugPreference = "continue"
$WarningPreference = "continue"
& hostname.exe
Write-Host "write-host"
Write-Verbose "write-verbose"
Write-Error "write-error"
Write-Debug "write-debug"
Write-Warning "write-warning"
Get-Date
Stop-Transcript
& notepad $log_path

以上所有内容都将在script_log.txt中捕获,但hostname.exe的输出除外,因为它是外部可执行文件。

有一些解决方法:

powershell.exe -noprofile -file script.ps1 > script.log

这会捕获包括hostname.exe输出在内的所有内容,但这是在脚本之外完成的。

另一个是每个外部命令,管道输出通过主机API:

& hostname.exe | Out-Default

这是在脚本中完成的,但是你在shell窗口上的exe中丢失了任何文本颜色。

答案 1 :(得分:0)

如果我真的需要有选择地重定向整个脚本的输出流,我会将其作为后台作业运行。子作业将每个作业流放在一个可以从作业对象中读取的单独缓冲区中,因此您几乎可以随意使用它们,包括在作业运行时读取它们。