WPS3.0でのGet-childitemの挙動
先日、Windows power shell 3.0をインストールし、バージョン2.0で利用していたスクリプトを実行したところ以前と挙動が変わり、目的の処理ができなくなってしまいました。
具体的には、カギ括弧"[]"が含まれるパスを対象に-Recurse付きでGet-childitemを実行した場合です。
例:
> Get-ChildItem -LiteralPath 'E:\Test\[15-4]' -Recurse
Get-ChildItem : 指定されたワイルドカード パターンは無効です: [15-4]
発生場所 行:1 文字:1
+ Get-ChildItem -LiteralPath 'E:\Test\[15-4]' -Recurse
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-ChildItem], WildcardPatternException
+ FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.GetChildItemCommand
カギ括弧がワイルドカードとしてチェックが行われ、5以上4以下が指定されているのはおかしい、と言うエラーメッセージが出ているのだと思われます。
powershell.exe -version 2を実行して、環境をWindows power shell 2.0に切り替えてから同一のスクリプトを実行するとワイルドカード扱いとならず、期待通りの動作となります。
> Get-ChildItem -LiteralPath 'E:\Test\[15-4]' -Recurse
ディレクトリ: E:\Test\[15-4]
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2012/09/13 20:02 a
ディレクトリ: E:\Test\[15-4]\a
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2012/09/13 19:51 aa
Windows power shell 3.0環境でも、次のケースではエラーになりません。
-Recurseが無い場合:
Get-ChildItem -LiteralPath 'E:\Test\[15-4]'
ディレクトリ: E:\Test\[15-4]
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2012/09/13 20:02 a
-Recurseは有るが、カギ括弧の中の"-"直前・直後が前<後となっている場合:
Get-ChildItem -LiteralPath 'E:\Test\[15-6]' -Recurse
ディレクトリ: E:\Test\[15-6]
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2012/09/13 20:03 c
ディレクトリ: E:\Test\[15-6]\c
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2012/09/13 19:51 cc
行いたいことは、下位フォルダを持っている(かもしれない)数十から数百のフォルダに対して、中身(フォルダ中のフォルダ数、.docなど特定種類のファイルの存在、下階層にフォルダしかない等)を判断し、フォルダの条件ごとに適切な場所にフォルダを移動、不要なものを削除する事です。
フォルダ名は変更できず、スクリプトも既に組んでいるので大きな変更を加えずに済むと助かります。
優先順に次の事柄を教えて頂けると助かります。
1.Windows power shell 3.0で”[15-4]”のような文字列を含むフォルダの下位階層のオブジェクトを取得する方法。
2.上記が困難な場合、Windows power shell 3.0をアンインストールせずに、デフォルトの実行環境をWindows power shell 2.0環境に固定する方法。
3.Windows power shell 3.0で上手くいかない理由。(バグ?、仕様変更?、本来の仕様に修正?)
よろしくお願いします。
お礼
ありがとうございます。 うまく消せました。