1

次のコマンドを検討してください。

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が示す動作をシミュレートしたいと思います。

4

3 に答える 3

6

これは私のために働く:

& 7z.exe a -t7z -bsp1 $archive_name $src 2>&1 | Out-Host

スイッチは、ストリームをストリームに-bsp1リダイレクトします。これは 7z の機能です。スイッチも見てください。progress informationstdout-bb

2>&1、エラー ストリームを にリダイレクトしますstdout。これは PowerShell の機能です。

-bs (出力/エラー/進捗行の出力ストリームを設定) スイッチ 構文

構文

-bs{o|e|p}{0|1|2}

{id} | ストリーム タイプ
................................................
 を | 標準出力メッセージ
 e | エラー メッセージ
 p | 進捗情報
{N} | ストリーム先
................................................
 0 | ストリームを無効にする
 1 | stdout ストリームにリダイレクト
 2 | stderr ストリームにリダイレクト
于 2016-07-15T16:07:28.327 に答える
0

あなたはただできるはずだと私には思えます:

&7z.exe a -t7z $archive_name $src | write-verbose

何か足りないものがない限り。

于 2012-11-23T21:51:44.090 に答える
0

なぜこのようにしないのですか?必要な場合

function archive-folder ($src, $archive_name) {   
$origcolor = [console]::ForegroundColor
[console]::ForegroundColor = "yellow"
"archiving $src"
$command = "7z.exe a -t7z $archive_name $src"
iex $command    
[console]::ForegroundColor = $origcolor    
}

私の些細な呼び出し元関数:

Function k
{
  dir c:\ps\ita
  Write-Host "Starting 7zippping from K function"
  archive-folder -archive_name c:\ps\pippo.7z c:\ps\ita
  Write-Host "7zipping from function k ended"
}

そして、powershellコンソールに表示されるもの(からの出力は黄色archive-folder

k

    Directory: C:\ps\ita


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---    08/06/2011    19:26     5,502 MB ita.txt
-a---    28/05/1994    16:59   165,624 KB ITALIANO.A
-a---    28/05/1994    16:54    53,903 KB ITALIANO.B
-a---    28/05/1994    17:00   165,541 KB ITALIANO.C
-a---    08/06/2011    11:06    98,609 KB ITALIANO.D
-a---    28/05/1994    17:00    72,077 KB ITALIANO.E
-a---    28/05/1994    16:54    80,813 KB ITALIANO.F
-a---    28/05/1994    16:55    78,312 KB ITALIANO.G
-a---    28/05/1994    16:55     2,412 KB ITALIANO.H
-a---    08/06/2011    11:07   298,609 KB ITALIANO.I
-a---    28/05/1994    16:55     1,033 KB ITALIANO.J
-a---    28/05/1994    16:55     1,777 KB ITALIANO.K
-a---    28/05/1994    17:01    71,553 KB ITALIANO.L
-a---    08/06/2011    10:59   162,084 KB ITALIANO.M
-a---    28/05/1994    16:56    47,123 KB ITALIANO.N
-a---    28/05/1994    16:56    72,973 KB ITALIANO.O
-a---    08/06/2011    19:37   264,109 KB ITALIANO.P
-a---    28/05/1994    16:56    10,512 KB ITALIANO.Q
-a---    08/06/2011    19:38   327,348 KB ITALIANO.R
-a---    08/06/2011    19:40   566,512 KB ITALIANO.S
-a---    08/06/2011    10:57   184,719 KB ITALIANO.T
-a---    28/05/1994    16:57    19,378 KB ITALIANO.U
-a---    28/05/1994    16:57    61,552 KB ITALIANO.V
-a---    28/05/1994    16:57     1,334 KB ITALIANO.W
-a---    28/05/1994    16:57     1,368 KB ITALIANO.X
-a---    28/05/1994    16:57       533 B  ITALIANO.Y
-a---    28/05/1994    17:01     7,054 KB ITALIANO.Z
Starting 7zippping from K funztion
archiving c:\ps\ita

7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03

Scanning

Updating archive c:\ps\pippo.7z

Compressing  ITA\ITALIANO.H
Compressing  ITA\ITALIANO.C
Compressing  ITA\ITALIANO.F
Compressing  ITA\ita.txt
Compressing  ITA\ITALIANO.O
Compressing  ITA\ITALIANO.A
Compressing  ITA\ITALIANO.B
Compressing  ITA\ITALIANO.D
Compressing  ITA\ITALIANO.E
Compressing  ITA\ITALIANO.G
Compressing  ITA\ITALIANO.I
Compressing  ITA\ITALIANO.J
Compressing  ITA\ITALIANO.K
Compressing  ITA\ITALIANO.L
Compressing  ITA\ITALIANO.M
Compressing  ITA\ITALIANO.N
Compressing  ITA\ITALIANO.P
Compressing  ITA\ITALIANO.Q
Compressing  ITA\ITALIANO.R
Compressing  ITA\ITALIANO.S
Compressing  ITA\ITALIANO.T
Compressing  ITA\ITALIANO.U
Compressing  ITA\ITALIANO.V
Compressing  ITA\ITALIANO.W
Compressing  ITA\ITALIANO.X
Compressing  ITA\ITALIANO.Y
Compressing  ITA\ITALIANO.Z

Everything is Ok
7zipping from function k ended
于 2012-11-23T21:17:50.217 に答える