ファイルアイテムを関数に渡し、foreachループで$ inputを使用すると、(非決定論的のように)奇妙な動作が発生します。
このように関数を呼び出しています...
get-childitem Stuff | Create-Zip C:\Stuff.zip
ここで、「Stuff」には、ディレクトリとサブディレクトリを含む一連のフォルダが含まれています。問題は、繰り返し実行すると、空であるかどうかに関係なく、一部の最上位ディレクトリがコピーされないことです。
この関数は、 http://blogs.msdn.com/b/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windowsにあるもののほぼ直接のコピーです。-vista-sidebar-gadget.aspx
function Create-Zip
{
param([string]$zipfile)
set-content $zipfile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $zipfile).IsReadOnly = $false
$shellApplication = new-object -comObject Shell.Application
$zipPackage = $shellApplication.NameSpace($zipfile)
foreach($item in $input)
{
$zipPackage.CopyHere($item.FullName)
Start-sleep -milliseconds 500
}
}
問題はStart-Sleep行にあるようです。これを完全に省略すると、zipファイルは空になります... 10秒に増やすと、通常、zipファイルはいっぱいになります。これはなぜですか、そして睡眠値に依存せずにこれを書くためのより良い方法はありますか?