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
コマンドレット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