みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Windows ファイル名を別プログラムに渡したい

単純作業の自動化のため、スクリプト化しようとしています。
多数のファイルを1つずつループして、
exeファイル(例:CMD.exe)に渡して実行したいだけです。
CMD.exeにはオプションを指定したいです。
(例: -a -b "C:\...\folder" "C:\...\file" (対象ファイル名) )

フォルダ名やファイル名には空白や&などの文字が含まれているケースがあります。
また、ファイル名は"でくくられていたり、いなかったりします。
まずbatで実施してみました。
test.bat
"C:\...\CMD.exe" -a -b "C:\...\folder" %1
この場合、引数のファイルが"でくくられていればファイル名に空白が含まれていても大丈夫でしたが、
&が含まれているとそこでファイル名が分断され、ファイルが見つからずに
エラーになってしまいました。
また、引数のファイル名が"でくくられず、かつ空白を含む場合にもファイル名が分断されエラーになります。
そこで以下のようにもしてみました。
"C:\...\CMD.exe" -a -b "C:\...\folder" "%1"
今度はファイル名が"でくくられている場合に、CMD.exeには""("を2つ)でくくられて渡されてしまい、ファイルが見つからないエラーになります。

回避方法が分からず、PowerShellで実施しようと以下のように実施しました。
test.ps1
$CMD = """C:\......\CMD.exe"" -a -b ""C:\...\folder"" """ + $file-path + """"
Invoke-Expression $CMD

これだと、「式またはステートメントのトークン'-a'を使用できません。」などの
エラーになります。
-aなどのCMD.exeの実行オプションがInvoke-Expressionの実行オプションとして
判断されているようにも見えます。

ファイルの処理なんてほとんどの処理ですることですし、
"があろうとなかろうと、バッチやPowerShellの予約語があろうとなかろうと、
自動エスケープして処理する方法があっても良い気がするのですが、
見つかりませんでした。

一般的な処理方法についてご教示いただければ幸いです。

投稿日時 - 2017-05-27 13:46:09

QNo.9333999

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

もし、「単純作業」で「定型的」な処理のスクリプト化であれば、パラメータとしてのファイル名が""で囲まれているか、そうじゃあないかも決まっていると思います。
それが付加されてるかどうなるか分からないってことは、「単純作業」だけど「定型的ではない処理」ってことですね。

となれば、""で囲まれているか、いないか分からない前提で受け取り、その後に、正しくパラメータが処理されるような補正処理を加えることになると思えます。
そして、その必要な処理をPowerShellで追加記述する、あるいは、CやC#等のプログラムで記述することになると思います。

投稿日時 - 2017-05-27 16:12:10

あなたにオススメの質問