アプリ版:「スタンプのみでお礼する」機能のリリースについて

Powershellでzip圧縮しようとしているのですが、

・Powershell ISEで実行すると正常に圧縮
・コマンドプロンプトで実行すると、「圧縮(zip形式)フォルダーエラー」が発生し、圧縮できない

という現象が発生しています。コマンドプロンプトで実行できるようにしたいのですが、原因がわからないので、御教示をお願いします。

・環境
Windows XP SP3
Powershell 2.0

・Powershellソース
# 引数チェック
# 引数の数が2以外の時は異常終了
if ($args.Length -ne 2 )
{
write-host "引数エラー"
exit 2;
}

# 圧縮zipファイル名
$ZipFilePath = $Args[0]

# 圧縮対象ファイル名
$TargetItems = $Args[1]

# 圧縮先パス存在チェック
if((Test-Path (Split-Path $ZipFilePath -Parent)) -ne $True){
write-host "圧縮先パスエラー"
exit 3;
}

# 圧縮対象ファイル存在チェック
if((Test-Path ($TargetItems)) -ne $True){
write-host "圧縮対象ファイルエラー"
exit 4;
}

# Zipファイルが存在する場合は削除
if(Test-Path -Path $ZipFilePath)
{
Remove-Item -Path $ZipFilePath
}
# Zipファイル作成
Set-Content $ZipFilePath ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $ZipFilePath).IsReadOnly = $false

# Zipファイルにファイルを投入
$shell = New-Object -com Shell.Application
$zipfile = $shell.NameSpace($ZipFilePath)

$archivedItems = New-Object Collections.ArrayList

# 圧縮対象ファイルの数だけループ
foreach($item in ($TargetItems | %{Get-Item -Path $_}))
{

# ファイルをZipファイルに投入。圧縮処理は非同期なので、その終了を待つ。
$archivedItems.Add($item) | Out-Null

$zipfile.CopyHere($item.FullName)
while($true)
{
if($archivedItems.Count -eq $zipfile.Items().Count)
{
break
}
Start-Sleep -Seconds 1
}
}
write-host "処理終了"
exit 0

「Powershellでzip圧縮が出来な」の質問画像

A 回答 (1件)

変数名やコメント等大体同じようなので、下記ページのものを改変された感じでしょうか


http://memo-space.blogspot.com/2010/01/powershel …

引数1が固めたいzipファイル名で、それ以降に圧縮対象ファイルのパス書く感じですよね
ISEで試していないんですが、cmdだとうまく行ったりいかなかったりという感じじゃ無いでしょうか
ざっと見る限り最後の待ち部分に問題ありそうな気がしましたけど、自分も不慣れなものでどこがとはぱっとわからなかったです。

自分の勉強がてら書いてみたら動いたっぽいので、一応貼っておきますね
ある程度相対パスへ対処できるように等なってるかもしれません。
確認OSはWin7です。
http://ideone.com/l19NY
    • good
    • 0
この回答へのお礼

ありがとうございます。

Windows7だと自分のスクリプトで動きますね…。
何故WindowsXPだと駄目なのか…OSの違い?

ソースもありがとうございました。

お礼日時:2012/01/21 10:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!