我正在使用 PowerShell 启动一个名为 GoodSync 的应用程序来为我执行备份。在该过程结束时,我将结果通过电子邮件发送给我。我还喜欢(有时)观察 PowerShell 窗口以密切关注它,并在处理过程中观察备份的状态。由于我的代码现在就在,stdout 将控制台,仅此而已。
我的问题:是否可以让标准输出进入控制台,并将其保存到变量中以供以后处理?
您可以看到我正在尝试使用 $output 变量,但无济于事。这是 $output 返回的错误:
You cannot call a method on a null-valued expression.
At GoodSync.ps1:119 char:42
+ $output = $proc.StandardOutput.ReadToEnd <<<< ()
+ CategoryInfo : InvalidOperation: (ReadToEnd:String) [], Runtime
Exception
+ FullyQualifiedErrorId : InvokeMethodOnNull
You cannot call a method on a null-valued expression.
At GoodSync.ps1:120 char:42
+ $output += $proc.StandardError.ReadToEnd <<<< ()
+ CategoryInfo : InvalidOperation: (ReadToEnd:String) [], Runtime
Exception
+ FullyQualifiedErrorId : InvokeMethodOnNull
这是我的代码:
(并且从你们那里的所有大师那里变得有点主动,是的,我正在用这段代码做很多事情来输出到文件和标准输出,这样我就可以关注所有事情。这部分只是整个部分的一个片段文件。)
###############################
## Call the GoodSync process ##
###############################
# This is the section taken from http://stackoverflow.com/questions/8925323
# This is a known working section. However, right now I don't know how to save the stdout to variable and insert into email log file.
$procInfo = New-Object System.Diagnostics.ProcessStartInfo
$procInfo.FileName = "C:\Program Files\Siber Systems\GoodSync\gsync.exe"
$procInfo.UseShellExecute = $false
$procInfo.Arguments = '/progress=yes /exit sync MyBackupJobName'
$proc = New-Object System.Diagnostics.Process
$proc.StartInfo = $procInfo
$proc.Start() | Out-Host
(Get-Date -format T) + " - Loaded gsync.exe. Backup process running. Please stand by..." | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
$proc.WaitForExit()
(Get-Date -format T) + " - Backup complete and gsync.exe has exited." | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
# Now we take the exit code, write it to console and log file, and begin to build our email report.
if ($proc.ExitCode -eq 0) {
"Success: GoodSync Reported: Analyze or Sync Successfully Completed." | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
$subject = $RoboLog
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
} elseif ($proc.ExitCode -eq 1) {
"Failure: GoodSync Error: Analyze had Terminal Errors. Did gsync.exe close abruptly?" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
$subject = $RoboLog
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
} elseif ($proc.ExitCode -eq 2) {
"Failure: GoodSync Error: Sync had Terminal Errors. Did gsync.exe close abruptly?" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
$subject = $RoboLog
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
} else {
"Failure: GoodSync Error: General Error. Check log file." | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
$subject = $RoboLog
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
}
# Grab the stdout and stderr to a variable
$output = $proc.StandardOutput.ReadToEnd()
$output += $proc.StandardError.ReadToEnd()
# The ReadToEnd() makes everything 1 long string, so we break it up by carriage return, and filter
$output -split "`n"
# Write to log file for email capture
$output >> $myLogFile
"" | Tee-Object -Variable RoboLog
$RoboLog >> $myLogFile
#---------------------------------------------------------------------------------------------------
# GoodSync backup jobs are now complete.
#---------------------------------------------------------------------------------------------------