• 締切済み

マイクロソフトのバッチ処理について

マイクロソフトのバッチ処理は、MSDOSのころから連綿として続いている機能で、unixのシェルを適用させたものと思います。 記述されているコマンドを上から順番に進めていくということになると思っていますが、ループ化することはできるのでしょうか。 100個のファイルがあって1つ1つナンバリングされていますが、それを一挙に処理するために同じ処理を100行にわたって書くことを行っています。ただし、ファイル名が違うのでそこは変えていますが。 同じことを100回書くのが苦痛なのでperlのようなもので書き出す工夫はしています。バッチがループで回ってループカウンタとファイル名をうまく合わせると2,3行で済むのではないかと思うのですが。こういうことはできないものなのでしょうか。unix, Linuxにいったん渡してそこでシェルスクリプトで処理することは今回はできません。Windows上限定のことなのですが。よろしくお願いします。

みんなの回答

回答No.6

コマンドプロンプトから直接for文を使う場合変数は「%i」等でよいが、 バッチファイル内に記述する場合は「%%i」のように「%」を2つ書かなければならない。 https://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html ということになってる。 それに、ファイル名に%が入っていると、処理がおかしくなる。例えばファイル名"純度100%.txt"みたいのとか。

  • asciiz
  • ベストアンサー率70% (6640/9407)
回答No.5

Windows限定ということであれば、WSH(Windows Shell) や PowerShell を使いましょう、ということになるんでしょうかね…。 WSHならWin98/Windows Server 2003以降、PowerShellならWin8/Server2012以降に標準で入っている感じだったと思います。 >コマンドプロンプト、WSH、PowerShell…Windows標準機能で作成するバッチ処理について | 今更ながらのバッチ処理基礎 | 情シスHack >https://jyosys-hack.info/2019/05/07/post-2313/ PowerShellにとそのオブジェクトに精通した人であれば、まさにご質問にあるようなことを数行で書けるようになるみたいです。 私が組むとしたらどんなオブジェクトが用意されてるのか一々調べながらになってしまうので、全然使いこなせませんが。 ---- 以下蛇足 ---- >プログラム言語のような風ですが、いろいろと決め打ちされている面があります。 全く、そんな感じです。 コマンドラインで出来ることを、少しずつ少しずつ拡張、そのたびに「この方法が良いのではないか」「こういう書き方なら簡潔に書けるかな」みたいにその場その場で決めていかれた感じです。 最終的に、まったくまとまりのない、覚えるためには膨大な苦労をするものになりました。 使える部分は使って行っていいと思いますが、こんな言語(っぽい物)を一から覚えようとするのはやめた方が良いように思うぐらいです。 >%%Fという記述がありますが、Fは変えてもいいのではないかと思います。 「%なんとか」がfor文における一時変数名で、英字1字に限られます。aでもbでもいいですが、「ファイル」だから f を使ったんでしょう。 で、コマンドラインで直接実行するときは、「%f」って書きます。 コマンドプロンプトを起動して、 for %f in (*.csv) do echo %f を打って実行すると、*.csv に該当したファイルの数だけ、「echo ファイル名」を実行します。 しかしこれをバッチファイルにすると、エラーメッセージが出て動きません。 バッチファイルの中では、 for %%f in (*.csv) do echo %%f と書かなければいけないんです。 この理不尽なエスケープ仕様。 「そうしなければならない」を、山ほど覚えなければいけないのがバッチです。 (詳細は 「help for」にて表示可能) また、echo なんて表示するだけだからこれでもいいんですが、正確には for %%f in (*.csv) do echo "%%f" と書かなければいけません。 ダブルクォーテーションが無いと、ファイル名に空白が含まれた場合に、1つのパラメータでなくなってしまうからです。 例えば、echoでなくtypeにした次のコマンド、 for %%f in (*.txt) do type %%f このバッチを、「sample(空白)text.txt」というファイルに対して実行すると、実行文の部分が type sample text.txt になってしまいます。 この場合、「sample」というファイルも「text.txt」というファイルも無いので、ファイルを見つけられずにエラーになります。 type "sample text.txt" になるように、 for %%f in (*.txt) do type ”%%f” としておかなければいけなかったのです。 つまり、言語仕様にはありませんが、「ファイル名を扱うならダブルクォーテーションでくくっておくべき」というルールが発生しています。 どこかでくくり忘れたら、普段は動きますが、空白のあるファイル名にぶち当たった時に異常動作を起こします。 バッチファイルのデバッグなんて、一から十までこんな感じですからね。 この蛇足の長さが、バッチに対するイライラ度です。

skmsk1941093
質問者

お礼

回答ありがとうございます。 パワーシェルでのバッチ(シェルスクリプト?)に慣れると軽々とできるということであれば、調べてみようと思います。 コンピュータオタクのような人は大体はLinuxとかUnixのシェルスクリプトで処理したりしており、そういう人たちはWindowsをよく言わないという風潮だったと思います。そういう意味でWindowsのシェルに精通している人の類型があまり想像できないのですが、Linuxから移ってきているのでしょうか。Linuxのシェルの本はいくつか出ていると思いますが、Windowsパワーシェルのスクリプト解説本などあるでしょうか。ちょっと調べて取り寄せようかと思います。

  • watanabe04
  • ベストアンサー率18% (295/1597)
回答No.4

MSDOSはWindowsよりも、UNIXよりも古いものです。 マイクロソフトが最初にフロッピーディスク媒体に発売したものです。

skmsk1941093
質問者

お礼

ありがとうございます。 私はMSDOSよりもUnixは古いと思っているのですが。Unixは1960年代、MSDOSは1970年代末ぐらいに作られて1980年代に広まったって感じのはずです。Unixのコマンドの仕様に合わせてMSDOSのコマンドは作られたと思っています。Windowsは1990年ぐらいでしょうか。Linuxも広まったのは1990年台ですね。これらは最近ですね。

回答No.3

for %%F in (ディレクトリ名) do ( %%~nxFなんたら ) というようなコードもある。 http://tecsingularity.com/others/batfilelist/

skmsk1941093
質問者

お礼

回答ありがとうございました。PythonとかCみたいな感じに見えますが、変数名とかそれに不随した処理(拡張子ありなしとか、ディレクトリ名ありなしとか)なども決め打ちされているようです。ルールブックを見ながら自分の用途に向けて書いていくようです。 %%Fというところですが、最初の%がエスケープなので、ファイル名本体は%Fなのかと思ったのですが、やはりFがファイル名ということです。2番目の%って何でしょうか。

  • f272
  • ベストアンサー率46% (8016/17133)
回答No.2

こんな書き方とか for /l %%n in (1,1,10) do ( echo n = %%n )

skmsk1941093
質問者

お礼

回答ありがとうございます。ネットでさがしてみると、以下のような記述がありました。 ---------- 「%%f」について 変数「%%f」について単独の%は消滅するため、%でエスケープをして「%%f」としています。 ---------- 2番目の%はどう解釈したらいいでしょうか。ファイル名の本体はfのはずなので、2番目の%の意味なのですが。 バッチファイルはいろいろ決め打ちされていることが多いらしいので、そういうことでしたら、ガイドブックとか辞書のようなものが便利で必須ではないかと思いました。 そういうのあまり見ないなと思っているのですが。

回答No.1

https://rainbow-engine.com/batch-get-filepath-filename/ こんなものがみつかりました。

skmsk1941093
質問者

お礼

回答ありがとうございます。思ったよりいろんなことができるんだなと思いました。プログラム言語のような風ですが、いろいろと決め打ちされている面があります。 %%Fという記述がありますが、Fは変えてもいいのではないかと思います。ここで、最初の%がエスケープであり、2番目の%ってどういう意味でしょうか。Fが文字列であるということでしょうか。もし、ご存じであれば。

関連するQ&A

  • 自ファイル名取得(バッチファイル)

    バッチファイルで 自ファイル名の取得はどのようにすればよいでしょうか? unixのシェルでは log=$1 の用にすればよいようですので、 ためしに%1としてみましたら・・・・ループしてしまいました。

  • Windowsのバッチ処理のループカウンタについて

    Windowsのバッチ処理(パワーシェルだからシェルスクリプト風?) についてお尋ねします。 以下はループ処理です。%%iというところがループカウンタで%%iが整数です。この例では1から10です。 for /L %%i in (1,1,10) do ( ここでいろいろ処理 ) ここで質問ですが、整数とは1,2,3,...10ですが、01,02,03,....10のように2カラムを使うものとして利用することは可能でしょうか。 3桁だったら、001,002,,,100 のように変化していくようなものですが。文字列のような整数のような位置づけはよくわからないのですが。 バッチ内部は変数に型がないようです。フォーマット指定のような印象なのですが。 よろしくお願いします。

  • taskkill をバッチ処理できない。

    バッチファイルを作って、taskkillを実行しようとしましたが、出来ません。 ファイル名は、たとえば、task.bat 中身には、 taskkill /F /im imagename と入れました。 これで実行すると、MSDOSウインドウが開いてバッチ処理が開始されますが、 taskkill /F /im imagename が、永遠に連続して繰り返し現れて、いつまでたっても終わりません。 また、kill 自身も実行されておりません。 copy コマンドなどでは、問題なくできます。 MSDOSプロンプトを手動で開いて、手で入力して実行すると、問題なくKillできます。 なぜでしょうか。

  • rshを使用したバッチファイル

    今、あるサーバにPCからシェルをFTPして、RSHでFTPしたシェルを実行するバッチファイルを作成していますが、 コマンド1行づつをカット&ペーストで実行すると正常に動作するのですが、バッチファイルをWクリックすると、FTP は正常に動作するのですが、RSHの処理がされず、ループ? (ループの記述はなし)してしまいます。 *ECHO ONでじっこうすると、RSHの行は呼ばれているみたいですが、処理が失敗しているようです。 バッチファイルでの設定に問題があるのでしょうか? <バッチの内容 start> *IP、パス、ユーザ名は伏せさせていただきます。 ftp -s:d:\PATH\send.txt XXX.XXX.XXX.XXX rsh XXX.XXX.XXX.XXX -l USRNAM -n "chmod +x /PATH2/rsh.sh;source /PATH3/envsetUSRNAM;PATH4/rsh.sh" <バッチの内容 end>

  • Telnetをログアウトしても処理を続けたい

    PC1(AIX UNIX)からPC2(Win2000 sp2)へtelnetでログインし、PC2上のバッチファイルを実行させようとしています。 一連の作業を自動化させたいため、PC1上のシェルスクリプトでバッチファイルを起動させているのですが、ログアウトするとバッチファイルのプロセスも切れてしまいます。 シェルスクリプトはsleepコマンドのため、自動的にexitがかかってしまい、長い処理や処理時間の読めないプログラムを走らせることができません。UNIX系のnohupのようなことをWindows上で行うことはできないのでしょうか? 色々と調べても情報がなかったので、あきらめかけてます。ご存じの方、またご経験のある方がいましたら教えて下さい。

  • テキスト処理のシェルプログラム

    UNIXシェルもしくはPerlでテキスト処理のシェルスクリプト を作成したいのですがご教授お願いします 1000行あるテキストファイルを 2行単位で区切り2行単位で横一列へ置換しテキストへ出力したいのですが 例 処理前 aaa bbb ccc ddd eee fff 処理後 aaa,ccc,eee bbb,ddd,fff ご教授よろしくお願いします

  • 行単位で並び替えて、重複行を削除したい

    WindowsXPです。 テキストファイル、A.TXTがあり、10000行くらいなのですが、 行単位で並べ替えて、重複している同じものがあれば、これを1行にまとめたいのです。 並べ替えだけならば、MSDOSで、 sort A.TXT > outfile.TXT でいけそうですが、重複行をまとめることは出来そうにありません。 バッチファイルで処理をしたいのでMSDOSで捜しているのですが方法はないのでしょうか。 MSDOSに限らないとすれば、何か簡単にできる方法はありますか。 何かスクリプトみたいな感じで出来るといろいろと応用が出来ていいのですが。 関連して、WindowsXPでも、PERLが使えると聞きました。 WEBで捜しましたが、どうもどれがいいのか、また、インストール方法もよくわかりません。 フリーで使える、Windows上のPERL、あるいは、MSDOS以上に使い勝手のよいスクリプトがあれば、教えてください。

  • Winでバッチファイルで外部処理後、ファイル処理

    全部で3行のバッチファイルを作成しました。一行目で外部プログラムを呼び出し走らせて(30分ほどで終了します)、2行目と3行目でファイル処理をするものです。生成されたファイルをZIPして元のファイルを削除するだけです。 問題は2行目が始まらないので、バッチファイル自体が終了しません。 おそらく.batが一行目の処理終了を認識しないためだと思うのですが、どうしたらよいのでしょうか?バッチファイル自体は手動クリックで開始です。 例えば40分後に強制的に2行目に進む方法とか、外部処理の終了が、外部アプリの終了なのか・・・ よろしくお願いします。

  • 連番ファイルからバッチ処理でgifアニメを作る方法

    画像ソフトirfanviewですが、シェル上のコマンドラインでi_view64.exeで呼び出すことができます。そこで、連番の画像ファイルがあってそれを束ねてgifアニメを作るi_view64.exeの使い方がないかなと思っています。いわゆるバッチ処理でループを回りながらi_view64コマンドで1つのgifアニメファイルを作りたいということですが。よろしくお願いします。

  • バッチファイルの繰り返し処理について

    初心者でよくわからず質問させていただきます。 バッチファイルで以下の処理をさせたいのですが、そもそも可能なのでしょうか? 可能であればどのように記述するのかヒントをいただければ助かります。 ある処理を実施して、ファイルサイズが10kbyte以上になるまで処理を繰り返したいです。 そこで、以下のような処理を考えています。 1.ファイルサイズをみて、10k未満であれば、再度処理させる 2.10回繰り返しても10kbyte未満の場合は、アラートメールを指定の固定アドレスまで飛ばしたあと   ループを抜けて、次の処理へ進む。 宜しくお願い致します。