- 締切済み
マイクロソフトのバッチ処理について
マイクロソフトのバッチ処理は、MSDOSのころから連綿として続いている機能で、unixのシェルを適用させたものと思います。 記述されているコマンドを上から順番に進めていくということになると思っていますが、ループ化することはできるのでしょうか。 100個のファイルがあって1つ1つナンバリングされていますが、それを一挙に処理するために同じ処理を100行にわたって書くことを行っています。ただし、ファイル名が違うのでそこは変えていますが。 同じことを100回書くのが苦痛なのでperlのようなもので書き出す工夫はしています。バッチがループで回ってループカウンタとファイル名をうまく合わせると2,3行で済むのではないかと思うのですが。こういうことはできないものなのでしょうか。unix, Linuxにいったん渡してそこでシェルスクリプトで処理することは今回はできません。Windows上限定のことなのですが。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- m5048172715
- ベストアンサー率16% (860/5261)
コマンドプロンプトから直接for文を使う場合変数は「%i」等でよいが、 バッチファイル内に記述する場合は「%%i」のように「%」を2つ書かなければならない。 https://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html ということになってる。 それに、ファイル名に%が入っていると、処理がおかしくなる。例えばファイル名"純度100%.txt"みたいのとか。
- asciiz
- ベストアンサー率70% (6825/9705)
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” としておかなければいけなかったのです。 つまり、言語仕様にはありませんが、「ファイル名を扱うならダブルクォーテーションでくくっておくべき」というルールが発生しています。 どこかでくくり忘れたら、普段は動きますが、空白のあるファイル名にぶち当たった時に異常動作を起こします。 バッチファイルのデバッグなんて、一から十までこんな感じですからね。 この蛇足の長さが、バッチに対するイライラ度です。
- watanabe04
- ベストアンサー率18% (295/1599)
MSDOSはWindowsよりも、UNIXよりも古いものです。 マイクロソフトが最初にフロッピーディスク媒体に発売したものです。
お礼
ありがとうございます。 私はMSDOSよりもUnixは古いと思っているのですが。Unixは1960年代、MSDOSは1970年代末ぐらいに作られて1980年代に広まったって感じのはずです。Unixのコマンドの仕様に合わせてMSDOSのコマンドは作られたと思っています。Windowsは1990年ぐらいでしょうか。Linuxも広まったのは1990年台ですね。これらは最近ですね。
- m5048172715
- ベストアンサー率16% (860/5261)
for %%F in (ディレクトリ名) do ( %%~nxFなんたら ) というようなコードもある。 http://tecsingularity.com/others/batfilelist/
お礼
回答ありがとうございました。PythonとかCみたいな感じに見えますが、変数名とかそれに不随した処理(拡張子ありなしとか、ディレクトリ名ありなしとか)なども決め打ちされているようです。ルールブックを見ながら自分の用途に向けて書いていくようです。 %%Fというところですが、最初の%がエスケープなので、ファイル名本体は%Fなのかと思ったのですが、やはりFがファイル名ということです。2番目の%って何でしょうか。
- f272
- ベストアンサー率46% (8532/18265)
こんな書き方とか for /l %%n in (1,1,10) do ( echo n = %%n )
お礼
回答ありがとうございます。ネットでさがしてみると、以下のような記述がありました。 ---------- 「%%f」について 変数「%%f」について単独の%は消滅するため、%でエスケープをして「%%f」としています。 ---------- 2番目の%はどう解釈したらいいでしょうか。ファイル名の本体はfのはずなので、2番目の%の意味なのですが。 バッチファイルはいろいろ決め打ちされていることが多いらしいので、そういうことでしたら、ガイドブックとか辞書のようなものが便利で必須ではないかと思いました。 そういうのあまり見ないなと思っているのですが。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
https://rainbow-engine.com/batch-get-filepath-filename/ こんなものがみつかりました。
お礼
回答ありがとうございます。思ったよりいろんなことができるんだなと思いました。プログラム言語のような風ですが、いろいろと決め打ちされている面があります。 %%Fという記述がありますが、Fは変えてもいいのではないかと思います。ここで、最初の%がエスケープであり、2番目の%ってどういう意味でしょうか。Fが文字列であるということでしょうか。もし、ご存じであれば。
お礼
回答ありがとうございます。 パワーシェルでのバッチ(シェルスクリプト?)に慣れると軽々とできるということであれば、調べてみようと思います。 コンピュータオタクのような人は大体はLinuxとかUnixのシェルスクリプトで処理したりしており、そういう人たちはWindowsをよく言わないという風潮だったと思います。そういう意味でWindowsのシェルに精通している人の類型があまり想像できないのですが、Linuxから移ってきているのでしょうか。Linuxのシェルの本はいくつか出ていると思いますが、Windowsパワーシェルのスクリプト解説本などあるでしょうか。ちょっと調べて取り寄せようかと思います。