次のコマンドを検討してください。
7z.exe a -t7z folder.7z folder
次の 2 つの削除された powershell スクリプトがあります。
ファイル 1: common.ps1
function Archive-Folder ($src, $dest_path, $archive_name) {
$script_dir = split-path $script:MyInvocation.MyCommand.Path
if ((test-path $src) -eq $false) {
write-error "$src is not a valid source directory"
#return
return $false
}
if ((test-path $dest_path) -eq $false) {
write-error "$dest_path is not a valid destination directory"
#return
return $false
}
if ([string]::IsNullOrWhiteSpace($archive_name) -eq $true) {
write-error "$archive_name is not a valid archive name"
#return
return $false
}
write-verbose "archiving the folder"
$archive_command = "$script_dir\7z.exe a -t7z $dest_path\$archive_name $src"
$exe = "$script_dir\7z.exe"
$arguments = @('a', '-t7z', "$dest_path\$archive_name", "$src")
iex $archive_command
# this doesn't stream the output. it prints it all at once.
# & $exe $arguments | write-verbose
return $true
}
ファイル 2: script.ps1
$script_dir = split-path $script:MyInvocation.MyCommand.Path
. "$script_dir\common.ps1"
$VerbosePreference = "Continue"
$src = 'C:\some\source'
$backup_path = 'C:\some\destination'
$date_format = 'yyyy_MM_dd_HHmm'
$date = get-date
$date_str = $date.tostring($date_format)
$date_ticks = $date.ticks
$archive_name = "backup-$date_str-$date_ticks.7z"
# this prints the output streamed. The output ends with `True`
archive-folder $src $backup_path $archive_name
# the following however doesn't output anything. in order to separate the command output from my function output,
# i was printing the command output using write-verbose
$isSuccess = archive-folder $src $backup_path $archive_name
if ($isSuccess -eq $true) {
#proceed with the rest of the code
}
@Christian と @zdan からの入力により、問題を戻り値のキャプチャに切り分けることができました。と同様にarchive-folder
、コマンドライン ツールを実行する関数が他にもあります。関数が正しい操作で呼び出され、コマンドライン ツールが適切に実行されたかどうかに応じて、これらの各関数は true または false を返すことができると考えていました。
ただし、関数の戻り値を取得するarchive-folder
と、コマンドの出力がコンソールに出力されません。また、戻り値が true または false の値で構成されていません。コマンドの出力全体で構成されます。
これを解決するための私の最初の試みは、コマンド実行ステートメントを として記述することiex $archive_command | write-verbose
でしたが、これは出力をストリーミングしませんでした。
成功した場合にコマンドライン ツールが持つ副作用 (アーカイブ ファイルの存在など) をチェックして、関数が正常に実行されたかどうかを判断できると思いますが、すべての関数に対してこれを実行できるかどうかはわかりません。作成して終了します。
値を返し、コマンドライン ツールの出力をストリーミングする方法はありますか?
編集2
コードを2つの別々のファイル/関数に分割している理由に関して、私の実際の使用シナリオは次のとおりです
がこの
script.ps1
フローを調整します。データベースをバックアップします (mongodb は、db のコレクションごとにファイルを生成します)。データベースのバックアップをアーカイブします。アーカイブを S3 にアップロードします。これらの各ステップは、 の個別の関数によって実行されますcommon.ps1
。にはscript.ps1
グルー コードのみが含まれます。これをすべて投稿すると質問が複雑になる可能性があり、直面している問題を理解する必要はないと感じました
編集1
圧縮中のフォルダに 5 つのファイルがある場合、7zip は最初に著作権を出力します。次に、テキストを出力しますScanning
。次に、行を出力しますCreating archive at some location
。次に、各ファイルを処理し、各ファイルの進行状況を 1 つずつ出力します。このようにして、操作の進行状況について常にフィードバックを得ることができます。
powershell 関数を実行すると、操作中に出力が表示されず、すべての出力が一度に表示されます。7zip からのフィードバックはありません。スタンドアロンのexeとして実行したときに7zipが示す動作をシミュレートしたいと思います。