1

Powershell で .zip ファイルを解凍するリクエストを受け取りました。インターネットで、次のコードを複数回見つけました。

    param(  [String]$newlocation, [String]$filepath)
    if(($newlocation -and $filepath) -and ((test-path $newlocation) -and (test-path $filepath)))
    {
       Copy-Item $filepath $newlocation
       $shell_app=new-object -com shell.application
       $filename = $filepath.split("\")[-1]
       if(Test-Path "$newlocation\$filename")
       {
           $zip_file = $shell_app.namespace("$newlocation\$filename")
           $destination = $shell_app.namespace($newlocation)
           $destination.Copyhere($zip_file.items())
       }
    }

スクリプトに実装すると、少し変わりました。上記は変更後のバージョンです。今、私はエラーを持っています:

Exception calling "NameSpace" with "1" argument(s): "The system cannot find the file specified. (Exception from HRESULT
: 0x80070002)"
At Z:\MyScripts\deploy.ps1:34 char:34
+     $zip_file = $shell_app.namespace <<<< ("$newlocation\$filename")
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

そして、もう 1 つ、非常に明確です (最初のエラーが原因です)。

You cannot call a method on a null-valued expression.
At Z:\MyScripts\deploy.ps1:36 char:39
+     $destination.Copyhere($zip_file.items <<<< ())
    + CategoryInfo          : InvalidOperation: (items:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

ファイルと宛先パスの両方が存在し、それらにアクセスする権利があります (両方を作成しました)。Windows XP で PowerShell 2.0 を実行しています

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

これは、コンソールで直接実行したときの Powershell からのダンプ全体です。 Powershell エラー

皆さんが私を助けてくれることを願っています。少なくとも、答えを見つけるためにどこに行けばよいか教えてください.

私はすでにzipファイルを手動で解凍しようとしましたが、うまくいきました。ファイルとファイルパスの両方にアクセスできました(両方を作成したため)。

4

3 に答える 3

0

COM オブジェクトへのアクセスで問題が発生している可能性があります。64 ビット Windows を使用している場合は、必ず 64 ビットの powershell.exe からスクリプトを実行してください。これは、c:\windows\system32...\v1.0... の powershell.exe を意味します。これは、system32 に「32」があるため、直感に反していました。32ビットプロセスであるConsole2からpowershellを実行していたため、32ビットpowershellを起動していました(c:\ windows \ syswow64 ...から)。また、powershell.exe が管理者権限で実行されていることを確認してください。

于 2012-10-01T22:06:49.920 に答える
0

Windows シェルを自動化しようとする代わりに、.NET Framework 4.5 には、次のように使用できるZipFileクラスがあります。

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

編集:おっと、.NET Framework 4.5 はWindows XP ではサポートされていません
とにかく、この回答は、Powershell で ZIP の問題を抱えている他の人にとってはまだ役立つかもしれません…</p>

于 2012-12-30T17:48:18.203 に答える