• 締切済み

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の予約語があろうとなかろうと、 自動エスケープして処理する方法があっても良い気がするのですが、 見つかりませんでした。 一般的な処理方法についてご教示いただければ幸いです。

みんなの回答

  • catpow
  • ベストアンサー率24% (620/2527)
回答No.1

もし、「単純作業」で「定型的」な処理のスクリプト化であれば、パラメータとしてのファイル名が""で囲まれているか、そうじゃあないかも決まっていると思います。 それが付加されてるかどうなるか分からないってことは、「単純作業」だけど「定型的ではない処理」ってことですね。 となれば、""で囲まれているか、いないか分からない前提で受け取り、その後に、正しくパラメータが処理されるような補正処理を加えることになると思えます。 そして、その必要な処理をPowerShellで追加記述する、あるいは、CやC#等のプログラムで記述することになると思います。

関連するQ&A

  • 「プログラムとファイルの検索」ではフルパスが必要?

    Windows7 Home Premium SP1 64bit 次のプログラムはどちらも同じフォルダにあります。 C:\Windows\System32\cmd.exe C:\Windows\System32\control.exe 「プログラムとファイルの検索」からシステムプログラムを検索する際、 cmd.exe は "cmd.exe"だけでヒットするのに、 control.exe はフルパスを付けないとヒットしないのは何故でしょうか?

  • Excelマクロでエクセルファイルのファイル名を変更して保存、他

    Excel97のマクロを使用して以下の作業を実施したいのですが どなたかご教示お願い致します。 1.フォルダ内の複数ファイルから任意の一つのファイルAを開き、そのファイルA内の任意のセル(1A)の文字列をファイル名にして保存する。 2.あるファイルBを開き、ファイルB内のあるセル(1A)の"文字列が含まれるフォルダ"を検索してそのフォルダ内に保存する。 3.あるフォルダ(\1)内のあるファイルCを開き所要の作業を実施し閉じたあと、そのファイルCを別のフォルダ(\2)へ移動する。 4.あるフォルダ(\3)内のファイルDを開き、ファイルDのファイル名と同じ文字列を含むフォルダ(\4)を検索し、そのフォルダ(\4)内から、 ファイルD内のあるセル(1A)の文字列と同じファイル名のファイルEを検索して開く。 いくつも質問して真に厚かましいですが 解る物だけでも結構ですので 何卒、宜しくお願い致します。

  • PowerShell1.0での外部プログラム実行方法

    すいません、初歩的な質問で恐縮です。 以下のようなコマンドを実行したいのですが Powershell1.0の場合どのようにしたらよい のでしょうか? C:\hoge.exe -A100 -B200 -C300 -D400 D:\hoge.raw コマンドプロンプトですと普通に実行可能なのですが Powershellで上のをタイプしても The raw file is being acquired - .4 と表示されるだけで、C:\hoge.exeが実行できてない みたいです。また、 C:\hoge.exe D:\hoge.raw の場合はPowershellでも実行できるのですが、 C:\hoge.exeの引数である-A100とかをつけると ダメみたいです。よろしくお願いします。

  • Norton Speed Deskで長いファイル名とのエラー表示

    Cドライブに98SE、DドライブにXPのデュアルブートをしています。 Cドライブ(98SE)にインストールしているNortonSpeedDeskでデフラグをしようとしたところ、 Dドライブのチェックの際に、 「USMT」はドライブ上で不当な長いファイル名のエントリがあります。」のメッセージ。 NorotnDiskDoctorを実行すると 「\windows\system32\usmtフォルダにはファイルに関連付けられていない長いファイル名が入っています。 NortonDiskDoctorはこれらのエントリを削除することによってエラーを訂正します。」 のメッセージが出ました。 system32\usmtフォルダを見ますと、それらしい長いファイル名は     migwiz.exe.manifest のみです。 また、System32フォルダには     cdplayer.exe.manifest     TweakuiPowertoySetupJ.exe     wuancpl.cpl.manifest     PerfstringBakup.INI など、長いファイル名があります。 NorotnDiskDoctorがどのファイル名がエラーだと言っているのか分かりませんが、 この処理をクリアしないとSpeedDeskでデフラグできません。 NorotnDiskDoctorがいうとおり、削除処理を進めて行っていいものか迷っています。 アドバイスをお願いいたします。

  • バッチファイルで、ファイル名から自動振分したい

     C:\B\の中に、必ず「半角数字4桁_」から始まるファイル名のデータが毎週入ります。  「半角数字4桁_」以後のファイル名、拡張子は、その週によって変わります。  C:\A\の中には、必ず「_半角数字4桁_」で終わるフォルダ名のサブフォルダがあります。  このフォルダ名は、ずっと変わることがありません。  C:\B\の中にあるデータを、ファイル名の最初の4桁の数字をもとに、C:\A\にあるサブフォルダに自動で移動したいです。また、移動する際に、既にサブフォルダ内に「半角数字4桁_」から始まるファイル名のデータがある場合は、削除してから移動したいです。 フォルダ構成です。 Cー|    |-【A】    |   |-【あいう_1234】    |  |-【あい_2235】    |   |-【かきくけ_8990】    |   |-【アイウエオ_5014】    |    |-【B】    |   |-1234_ABC.txt    ←このファイルは C:\A\【あいう_1234】に。    |  |-2235_1534.txt   ←このファイルは C:\A\【あい_2235】に。    |   |-8990_22.doc     ←このファイルは C:\A\【かきくけ_8990】に。    |   |-5014_わをん.doc   ←このファイルは C:\A\【アイウエオ_5014】に。   自分でバッチファイルを記述してみたのですが、ここからどうしていいか分かりません。  どなたか教えてもらえないでしょうか? よろしくお願いします。    自分で記述してみたバッチファイルです。 cd C:\B dir /b > C:\C\list.txt set folder=C:\A set file=C:\B set Bat=C:\C for /f "delims=" %%a in ( %Bat%\list.txt ) do if exist "%file%\%%a" move "%folder%\%%a" "%to%" PAUSE > NUL

  • Perlで異なるフォルダからファイルをコピーし、ファイル名を変更する方法を教えてください

    前回類似するお願いをしたのですが、 もう一度ご質問させてください。 <やりたいこと> c:\scriptフォルダにある「copyAndRename.cgi」を  起動し、ファイルコピーとRenameをする処理を  行ないたい。 <ファイルコピーの内容> C:\test1フォルダにあるファイル名「test.test.csv」 を、c:\test2フォルダにコピーする <ファイルRenameの内容> C:\test2フォルダにコピーした、ファイル 名「test.test.csv」の「.」をなくし「-」を置き換え、「test-test-csv」とファイル名に変更する処理をしたい。 <できていること> (1)の処理は行なえているので問題ありません。 (2)の処理に関しては、以前の質問させていただいた  回答から、下記のようなスクリプトを書き、実行した  が、Renameされませんでした。 ----- $A="test.test.csv"; $B=$A; $B=~s/\./-/; # ドットを全置換により[-]に変更。 rename $A,$B; ----- 実行している、「copyAndRename.cgi」が格納されている c:\svriptフォルダに、「test.test.csv」をおいて テストをしてみると正常に起動します。 renameを行なう際のパスの切り方がわかれば 解決できると思うのですが、わかりません。 初心者の質問で恐縮ですが、どなたかお教えください。

    • ベストアンサー
    • CGI
  • Win7ファイル名を同じにする

    検索キーワードも思い浮かばず時間ばかりが過ぎていくので 質問させていただきます。 Aフォルダの中にtxtファイルが300個。 Bフォルダの中にtxtファイルが300個。 Aフォルダ、Bフォルダのファイル(計600)は全て名前が異なります。 フリーのソフトかバッチ処理で Bフォルダにあるファイル300個の名前をAフォルダと同じにする事はできませんでしょうか。 (中身は同じでなく、ファイル名だけを同じにしたい。) (テキストファイル内の内容は無視してください。) 何か良い方法、ツールがございましたら お教えいただければ幸いです。 どうか宜しくお願いいたします。

  • バッチ処理のプログラム

    フォートランでプログラミングされたプログラムをexe形式で受領しており、それを使って大量の解析をします。 繰り返し作業が多く、効率がよくないので、バッチ処理などで効率化する方法をご教示いただけないでしょうか? <作業の流れ> フォルダ1の中に、 インプットデータファイル60個(01-aaaA1.dat,02-abcA1.dat,03-abgA1.dat,...,60-xxx.dat) a.exe,使用するインプットデータ(a-input.dat) b.exe,使用インプットデータ(b-input.dat) があります。 なお、a.exeを実行するには、それぞれのインプットデータをその都度a-input.datに書き換える必要があります。 (1)01-aaaA1.datをa-input.datにリネーム (2)a.exeを実行すると、outフォルダが自動で作成され、その中に計算結果(a.out,b.out,c.out,d.out,e.out,f.out....10ファイル位)が格納されます。 (3)計算結果のファイル名の頭にa-input.datに変える前の名前に-を付け加え(例えば、01-aaaA1-...)を先頭に追加します。 (4)リネームした計算結果ファイルをフォルダ1の中にフォルダ2、フォルダ3、フォルダ4を作成してそのなかに移動させます。 フォルダ2 → 01-aaaA1-a.out フォルダ3 → 01-aaaA1-b.out フォルダ4 → 01-aaaA1-c.out、01-aaaA1-d.out、01-aaaA1-e.out、01-aaaA1-f.out・・・・ という具合です。 ここまでが1ケースの計算の流れになります。 次に02-abcA1.datをa-input.datにリネームして同様に繰り返します。 別処理で、このあと、b-input.datを実行しますが、b-input.datはフォルダ2内のファイル名を書く必要があるため、 フォルダ2内のファイル名を取得して、b-input.datの4行目以降に付け加える処理もお願いできると助かります。 この作業を500ケース程度するのですが、時間もなく、リネーム→実行→リネーム→移動といった作業が非効率のため、 どうがご教示願います。 OS win7

  • windowsのファイル共有について

    windowsのファイル共有について windowsのファイル共有について、検索をし調べたのですがうまく設定が出来なかったので助けてください。 ファイル共有するフォルダには以下のようにユーザーによって権限をかけたいのですが可能でしょうか? Aさん 共有フォルダをしている人 Bさん Aさんのファイルを読み込み・書き込みできる人 Cさん Aさんのファイルを読み込みだけ出来る人 windowsの設定情報 Aさん ユーザーログイン名 a-san Bさん ユーザーログイン名 no-bb Cさん ユーザーログイン名 f01-pc Aさんの共有フォルダを以下のような設定をしたいと思ってます。 Bさんはフォルダに対して、読み込み・書き込みが可能とし、 Cさんはフォルダに対して、読み込みのみ可能とする場合の共有フォルダの方法を教えてください。 パソコンは、windowsXPのProfessionalになります。

  • ファイル名に連番を

    現在[a][b][c].....となっているフォルダ名を [01 a][02 b][03 c].......としたいのですが、無理でしょうか? ちなみに、[a][a (1)][a (2)].... という方法はちょっと違いますので。。 もしくは、ituneで始めから入れなおすときファイル名先頭に [01][02][03]...... とするにはどうしたらよいでしょうか?