質問: ### 前提・実現したいこと エスケープが必要な文字を含むファイル名の先頭文字を1文字目としたとき、 1文字目から10文字目と、拡張子を除いた末尾一文字を削除したい。 ``` # 元のファイル名 XXXXXXXXXXAAAAAAAAAAAAAAAAX.txt # リネーム後のファイル名 AAAAAAAAAAAAAAAA.txt ``` ### 発生している問題 まず、前提として、 Windows上で、ファイル名の置換をしたいファイルをスクリプトへドラッグ・アンド・ドロップするような使い方を想定しています。 そのために、以下のURLのようにに、バッチをかませてからPowerShellスクリプトを呼び出そうと考えています。 バッチから呼ばれたPowerShellを、 例えば、先頭の1文字目から10文字目を削除するために以下のようなスクリプトとしたとき、 $argにエスケープが必要な文字を含んでいた場合、何もせず終了してしまいます。 ``` foreach ($arg in $args) { Get-ChildItem $arg| Rename-Item -NewName { $_.Name -replace '^..........','' } } ``` ドラッグ・アンド・ドロップしてきたファイル名にエスケープが必要な文字を含んでいた場合でも、きちんと処理が行えるようにするためには、どのような方法があるでしょうか。 ### 補足情報(FW/ツールのバージョンなど) PowerShellのバージョンは5.0です。
回答: こんにちは。 質問への追記が依頼されていますので、まずはそれにお答えいただきたいのですが、私のほうからは予想で回答させていただきます。 質問の中にある「エスケープが必要な文字」はおそらくPowerShellのワイルドカード文字(`*,[,],?`)を指していると推測します。 例えばファイル名が`"[XXXXXXXXXAAAAAAAAAAAAAAAA].txt"`の場合`Get-ChildItem`(Zuishinさんの指摘の様に`Get-Item`でも同様です)には`-LiteralPath`を指定してやらないと正しくファイルを取得できません。 ファイルを取得できなれければ後続の`Rename-Item`は実行されないので何もせずに処理が終了します。 ``` # NG : これはファイルに対してワイルドカード検索がかかってしまうのでダメ Get-ChildItem "C:\Temp\[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" Get-Item "C:\Temp\[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" # OK : 正しく単一のファイルを取得できる Get-ChildItem -LiteralPath "C:\Temp\[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" Get-Item -LiteralPath "C:\Temp\[XXXXXXXXXAAAAAAAAAAAAAAAA].txt" ``` ですので、 ``` foreach ($arg in $args) { Get-ChildItem -LiteralPath $arg| Rename-Item -NewName { $_.Name -replace '^..........','' } } ``` の様にしてやれば良いかと思います。