1

PowerShell を使用して GoodSync というアプリを起動し、バックアップを実行しています。プロセスの最後に、結果をメールで送ってもらいます。また、(ときどき) PowerShell ウィンドウを監視して処理中のバックアップの状態を監視することも好きです。私のコードが今座っているので、stdout はコンソールに送られ、それだけです。

私の質問: 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.
#---------------------------------------------------------------------------------------------------
4

2 に答える 2

1

バックグラウンドジョブとして実行しないのはなぜですか? 次に、Receive-Job を使用して出力を取得できます (-Keep を使用する場合は何度でも必要なだけ実行できます)。

于 2013-04-23T20:34:23.690 に答える