2020-01-31

PowerShell 5.1の罠の続きです。

コマンドレットCompress-Archiveにはワイルドカードの扱いで問題がある様子。

1)正しい動き
Compress-Archiveでhoge.zipを生成する。
同じhoge.zipの生成を実行すると、既に存在するとしてエラー
-Forceを付加すると、既に存在しても上書き

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge.zip

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge.zip
Compress-Archive : アーカイブ ファイル C:\TEST\A\hoge.zip は既に存在します。既存のアーカイブ ファイルを更新するには、-Update パラメーターを使用してください。既存のアーカイブ ファイルを上書きするには、-Force パラメーターを使用してください。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge. ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\A\hoge.zip:String) [Compress-Archive]、IOException
    + FullyQualifiedErrorId : ArchiveFileExists,Compress-Archive

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\A\hoge.zip -Force

2)ワイルドカードの扱いに失敗する動き。パスにワイルドカード[が含まれている。
パスにワイルドカード[が含まれているとエラー
バッククオート`を1 個ではエラー
バッククオート``を2個にすると成功、hoge.zipが生成される
生成したファイルを上書きさせる事を狙って再度実行するとPowerShellの内部でエラー

見た感じでは、上書きの内部処理で元ファイルを削除する箇所に問題がある様子。
ファイル削除の箇所でエスケープが上手く処理されていない様だ。
そもそも-DesitinationPathの様な出力側でワイルドカードは使わない(複数のファイルに出力する事は無い)ので、標準でワイルドカードを受け付けないLiteralPath扱いするべきなのである。

3)おまけ
Copy-Itemの-Desitination
エスケープ不要で正常動作

Move-Itemの-Desitination
エスケープ必要で正常動作


どうしてこんな複雑な事に....。




PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\[A\hoge.zip -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\[A\hoge ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\`[A\hoge.zip -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\`[A\hog ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\``[A\hoge.zip -Force

PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath C:\TEST\``[A\hoge.zip -Force
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:182 文字:13
+             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath 'C:\TEST\``[A\hoge.zip' -Force
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:182 文字:13
+             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath "C:\TEST\``[A\hoge.zip" -Force
Remove-Item : コマンドレットの動的パラメーターを取得できません。指定されたワイルドカード文字パターンは無効です: [A
発生場所 C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:182 文字:13
+             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
    + FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.RemoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath "C:\TEST\[A\hoge.zip" -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath "C:\TEST\[A\hog ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive


PS C:\msys64\home\doctor_d\FileMaintenace> Compress-Archive -Path C:\TEST\*.txt -DestinationPath 'C:\TEST\[A\hoge.zip' -Force
Compress-Archive : パス 'C:\TEST\[A' が存在しないか、または有効なファイル システム パスではありません。
発生場所 行:1 文字:1
+ Compress-Archive -Path C:\TEST\*.txt -DestinationPath 'C:\TEST\[A\hog ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\TEST\[A:String) [Compress-Archive]、InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive



PS C:\msys64\home\doctor_d\FileMaintenace> Copy-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force

PS C:\msys64\home\doctor_d\FileMaintenace> Copy-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force


PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force
Move-Item : 指定されたワイルドカード文字パターンは無効です: [A
発生場所 行:1 文字:1
+ Move-Item -Path C:\TEST\*.txt -Destination C:\test\[A -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Move-Item], WildcardPatternException
    + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.MoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\`[A -Force
Move-Item : 指定されたワイルドカード文字パターンは無効です: [A
発生場所 行:1 文字:1
+ Move-Item -Path C:\TEST\*.txt -Destination C:\test\`[A -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Move-Item], WildcardPatternException
    + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.MoveItemCommand


PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\``[A -Force

PS C:\msys64\home\doctor_d\FileMaintenace> Move-Item -Path C:\TEST\*.txt -Destination C:\test\``[A -Force

0 コメント:

自己紹介

自分の写真
東京都, Japan
憂鬱な凍死家です。こちらではmixiとは異なり固めの話題中心です。

Total Page View

Categories

Powered by Blogger.

Popular Posts

Blog Archive