0

Powershell での実際のアプリへの私の最初のエクスカーション。従来の .Net 言語でコードを書くこともできましたが、このようなコンソール アプリには Powershell が理想的だと思います。StackOverflow を検索したところ、必要な (ほぼ) 正確なスクリプトが見つかりました。私の問題は、ファイルのフォルダー (サーバー fsA 上) を取得し、ファイルの日付で名前を付けた fsB 上に 7-Zip アーカイブを作成することです。たとえば、2012 年 7 月 21 日に最後に書き込まれたすべてのファイルは、アーカイブ 20120721.7z にあります。これは、ここにあるソリューションに基づいています: Create a 7z Archive for files created by date using Powershell

これが私がこれまでに持っているものです:

$prog_dir = "C:\Progra~1\7-Zip\7z.exe"
$archive_dir = "\\fsa\Backup"
$input_dir = "\\fsb\Xml\Archive\"
$7zOpts = "-m0=PPMd:o32:mem192M"
$groups = dir $input_dir | group-object -property {$_.LastWriteTime.Date}
$groups | foreach{$cmd = $prog_dir + " a " + $archive_dir + "\$((Get-Date $_.Name).ToString(`"yyyyMMdd`")).7z $([string]::join(`" `", $_.Group)) " + $7zOpts} #; invoke-expression $cmd}
#
#Where to put this: "+ $input_dir +"???
#
$cmd

foreach 行で入力ディレクトリを指定する方法が見つからないようです。結合ステートメントの先頭に配置できますが、入力ディレクトリがリストの最初のファイルに追加されるだけです。例えば:

$groups | foreach{$cmd = $prog_dir + " a " + $archive_dir + "\$((Get-Date $_.Name).ToString(`"yyyyMMdd`")).7z " + $input_dir + "$([string]::join(`" `", $_.Group)) " + $7zOpts} #; invoke-expression $cmd}

出力を生成します

C:\Progra~1\7-Zip\7z.exe a \\fsa\Backup\20120722.7z \\fsb\Xml\Archive\255IQR.xml 2573WV.xml 257RMC.xml

最後の 2 つのファイルの先頭にフル パスが追加されていないのはどこですか? 私は何を間違っていますか?

4

1 に答える 1

1

PowerShell はシェルであるため、コマンドの実行はほとんどうまくいくはずです。したがって、一般的に、Invoke-Expressionコマンドを実行するときに頼る場合は、非常に間違ったことをしています。別の方法を試してみましょう。

$prog_dir = 'C:\Progra~1\7-Zip\7z.exe' # you don't need 8.3 names here, by the way
$archive_dir = '\\fsa\Backup'
$input_dir = '\\fsb\Xml\Archive\'
$7zOpts = '-m0=PPMd:o32:mem192M'
$groups = dir $input_dir | group-object -property {$_.LastWriteTime.Date}
$groups | foreach {
    $files = $_.Group | select -expand FullName
    $date = (Get-Date $_.Name).ToString('yyyyMMdd')
    & $prog_dir a $archive_dir\$date.7z $files $7zOpts
}
于 2012-07-24T12:25:04.337 に答える