バッチ ファイル 作り方。 WIndowsのバッチ(bat)ファイルを使ってフォルダ内のファイルのリストを作成する

Windows DOSコマンド、バッチファイル(.bat)サンプル、コマンドプロンプト

バッチ ファイル 作り方

Windows上の処理を自動化するプログラムが, BATファイルである。 「コマンドプロンプト」上での手作業を省略し,自動実行できる。 Windowsが存続する限り,BATファイルはなくならないだろう。 バッチ・プログラミングの需要は,何があろうとる。 このWindows 10の時代でもそうだ。 BATは,MS-DOSの時代から長く使われてきた。 そのため,各コマンドに関する個別のノウハウや情報は多い。 だが,実用的なノウハウを体系的に整理したものは,あまり見かけない。 そこで以下では, BATをコーディングする際の良質なパターンを列挙する。 (0)BATプログラミングの特徴 最初に,BATの長所と短所を知っておこう。 そうすれば,BATの正確な使いどころが分かる。 BATのメリット:• ファイルシステムの一括処理に便利• プロセスの起動処理を簡素化できる(起動引数などをまとめて保管しておける) BATのデメリット:• 構造型プログラムが書けない,極めて書きづらい• サブルーチンやfor文の使いようがキモ。 複雑な処理は困難• cscriptでWSF・WSHを呼び出すのもよし。 mshtaでワンライナーを記述するのもよし。 BATでできない難しいことを,無理やりBATでコーディングする必要はない。 それは非生産的で,時間と労力の浪費だ。 SEのすべきことではない。 BATの「得意分野」はBATでコーディングし,なおかつ, BATの「守備範囲外」の事柄であれば,BATから別のプログラムを呼び出せばよいのだ。 BATは プログラムの起動が得意なのだから,多いに外部プログラムに頼って良いのだ。 むしろ, 「外部プログラムの呼び出し方」を,順番にうまく制御する役目を担うのがBATである。 と考えよう。 ここから先の実務的な情報を読むにあたり,コマンドプロンプトの基礎的なツボを網羅しておこう。 以下のエントリが参考になる。 冒頭と末尾は,便利なので暗記してしまおう。 cls 〜処理〜 pause exit まず冒頭の説明。 コマンドの先頭に をつければ,バッチ実行時に,そのコマンド自体は表示されなくなる。 echo offとすれば,実行しているコマンド自体の表示を全面的にOFFにできる。 remはコメント行。 冒頭には,バッチの目的などを記載する。 各行では,各行の処理内容を説明する。 setは,環境変数の定義。 フォルダのパスとかを定義する。 あとから変更しやすいよう,バッチの先頭部分にまとめて記述する。 pushdは,ディレクトリの移動。 cdコマンドだと,異なるドライブに移動できない。 pushdは,ドライブの違いや,ネットワークの違いを気にせず,必ず移動できる。 したがって, cdではなく,常にpushdコマンドを使うのが無難。 なぜなら,このバッチがどこで実行されるのか,前もって知ることができないから。 とすれば,このバッチファイルが存在するフォルダを指す。 したがって,バッチの存在ずるフォルダをカレントディレクトリにすることができる。 clsは,画面の消去。 前回のコマンドの実行結果などを削除して,まっさらな画面でバッチの実行を開始できる。 ここまでで1セットである,と考えよう。 次に,バッチの末尾の説明。 pauseコマンドは,何かキーを押すまで待機する。 バッチの終了を目視でよく確認した上で,次に進む事ができる。 突然ウィンドウが消えてしまうと,処理が成功したのか,失敗したのか,知ることができないから。 exitでバッチの終了。 例えば,コンパイルバッチとか。 下記のサンプルコードは,バッチの実行終了後,押したキーによって,処理をふたたび反復するかどうかを分岐する。 echo off : start cls rem ----- メイン処理 ----- 〜〜 rem ----- キー入力で分岐 ----- echo. コロンで始まる行は,ラベル。 goto文は,ラベルにジャンプすることができる。 ラベル名は,「goto 〜〜」と書いた時にわかりやすく,処理の流れを理解しやすいものを。 つまり,先頭の文字を判別する。 if文とgotoをうまく組み合わせて,特定の条件で振り出しに戻るようにする。 その際に,clsしてあげると親切。 反復実行可能なバッチのサンプル: 繰り返し実行可能なコンパイルバッチ このコードの要点は,「プログラム通りに条件分岐しているのではなく, ユーザの意思を尋ね,ユーザの意思に従って条件分岐している」という点だ。 この発想を応用すれば,ユーザフレンドリーなバッチを作れる。 例えば下記のサンプルを参照。 開発用のフォルダ構成を,自動的に生成してくれるバッチ (プロジェクト用のリポジトリ立ち上げに便利。 ついでに,用が済んだら自動消滅!)• 処理が完了すると, 「このバッチを消去しますか?」と聞いてくる。 つまり,自爆してくれるバッチ。 バッチファイルの内部で,共通的な処理をくくりだし, ルーチンとして再利用したい場合がある。 あるいは,バッチの処理の全体の見通しを良くするために, 複雑で長い処理をルーチンに切り分けて,メインの流れを読みやすくするケースもある。 Hello, fuga! Hello, boo! 続行するには何かキーを押してください. 解説:• ラベルをgotoではなくcallで呼び出せば,サブルーチンになる。 サブルーチンには,そのサブルーチン独自の引数を渡すことが可能。 次に,ルーチンからの戻り値について。 これは数値しか返却できず,大したことはできないので,あまり期待しないように。 バッチ内のルーチンから,呼び出し元に値を返却するには,errorlevelを使う。 」(終了ステータス)に相当する。 call文で外部のバッチファイルを呼べる。 でも、外部バッチで 「exit 0」 とかがあったりすると、処理が終わってしまう(CMD. EXEの終了)• batファイル自体を分割する。 複数のバッチファイル間で,処理を共有したい場合などに使う。 共通の処理は,1つのbat内にまとめておいて,複数のBATから呼び出せるようにする。 バッチの行数を長くせず,ソースコードのコピー&ペーストを減らすために必要。 2つ方法がある:• call バッチファイル名• start バッチファイル名 callでラベルを指定すればサブルーチンを呼び出せたのと同じように, callでファイル名を指定すれば,別バッチを呼び出せる。 また,startで呼び出した場合は,プロセスも分かれる。 別バッチの呼び出し方について: Windows、バッチファイルからバッチファイルを呼び出す方法あれこれ|マコトのおもちゃ箱 〜ぼへぼへ自営業者の技術メモ〜• callは,呼び出し先の終了を待った後で,呼び出し元に戻る• startは別プロセスで起動し,並行して実行する• バッチファイル名を直接指定すると,呼び出したバッチが終了した時点で全ての処理が終わる バッチファイ(batch,. batファイル)について質問します。 start b. bat はb. batを呼び出して,次に進む• call b. bat はb. batを呼び出して,b. batが終わってから,次に進む 4. 7 別バッチファイルの呼び出し• 呼び出した子のバッチファイルが終了したら、 処理は元 親 のバッチファイルに戻り、 その call 行の次の行に処理が移る• コマンドラインからプロセスを起動・終了する方法 (環境変数とレジストリについて)• PATH上に存在すれば,ファイル名だけで起動できる• cscript:WSHやWSFを呼び出せる。 言語はJScript, VBScript。 BATよりも高度な処理が可能。 mshta:ワンライナーでWSHのコードを記述可能。 それぞれのノウハウは,下記を参照。 バッチ職人になろう (WindowsとLinux上での開発業務を自動化するノウハウ集)• WSH, JScriptの項目を参照 JavaScript をコマンドラインで実行する方法 mshta. exeの使い方 コマンドプロンプトから,Win32 APIや任意のDLLを呼び出して実行しよう (コマンドプロンプトから画面キャプチャする方法の仕組みを理解)• mshtaからVBSのコードを実行し,VBSからExcel VBAのマクロを起動し,VBAマクロからWin32 APIを呼び出している。 BATだけで,たった1行で,なかなか恐ろしい事ができてしまう。 mshtaは非常に便利だ。 BATだけで,いろいろできる。 mshta. exe "javascript:JavaScriptのコード"• mshta vbscript:execute "VBScriptのコード" 良いBATをコーディングするためには,WSHの知識も必要なのだ。 txtであるような全てのファイルを検索・列挙してみよう。 カレントディレクトリだけを対象とした,単純なスキャンであれば,下記のように書ける。 doの中で自由に処理できる。 ここではファイル名を表示している。 しかし, 「カレントフォルダ以下の全てのフォルダ内を, 再帰的にファイル検索したい」 というニーズのほうが多いだろう。 これは,下記のようにコーディングできる。 doの中では,そのコマンドの実行結果を1行ずつ処理させる。 ここではコマンドとして,ファイルの再帰検索コマンドを記述する。 もし検索の仕方をカスタマイズしたければ,forコマンドではなく,dirコマンドのオプションを自由に変えればよい。 この記法を覚えると,BATでできる事の幅が,ぐっと広がる。 この便利さを,よく覚えてほしい。 「あるコマンドの実行結果を,別のコマンドに渡す」ための方法として,普通は「 」(パイプ)を使うだろう。 例えば ipconfig more のように。 だが, 「あるコマンドの実行結果を,別のコマンドに渡して,1行ずつ自由に処理する」場合は,for文が非常に便利なのだ。 後述するが,コマンドの実行結果を動的に変数に格納したりする場合にも,forが一役買う。 中級のBATコーディングにおいて,for文はパイプよりも重宝する,と言っていい。 ここでは,for文によるファイルスキャンを応用してみよう。 これはつまり,フォルダツリー上にhtmlとcssだけを残して,他の余計なファイルが存在したら削除する,という整理バッチだ。 解説:• もとのファイルを直接,いきなり加工してしまうことも,確かに可能だ。 だがその場合,もし処理の途中で,加工が失敗したらどうするのか? もとのファイルは失われてしまう。 意図しない実行結果になるかもしれない。 1ステップずつ,処理結果を慎重に保管しながら進めるためには,中間ファイルを利用することになる。 そして,作業が完了した段階で,中間ファイルからターゲットに結果を書き出す。 例として,ファイルの中味を逆ソートして保存し直す例: rem 中間ファイルに出力 type hoge. txt rem 処理結果を保存 type temp. txt rem 中間ファイルを削除 del temp. txt もしソート以外にも途中の処理を追加したくなったら,temp. txtに対して処理を追記すればよい。 txt と書いてしまうと,そこで処理がいったん確定してしまうので,「確定前の途中の処理を,柔軟に追加」し辛い。 中間ファイルを設けて,ステップ数を増やす(=あえて分割しておく)ことによって, 途中のステップを追記しやすくなるので,プログラムを変更しやすくなるのだ。 変更だけでなく,動作確認のためのテストもしやすくなる。 普通は,ステップ数やコードの行数を無駄に増やさないように注意するものだが, 逆にあえてステップを分割したほうが,のちのち便利。 という場合もあるのだ。 あるいは,必要に迫られて,仕方なく中間ファイルを作る場合もある。 その場合,それがBATの限界なので,甘受する必要がある。 不必要な一時ファイルは作らないのが望ましいが,BATの都合で避けられない場合は,サッと作ってサッと消す。 参考: NN Space BLOG-NN空間ブログ• WindowsXPとか7で確認した限り、並べ替え対象ファイルと同じファイル名をソート後の書き込みファイル名にしても問題ない• SORT TARGET. txt とすれば一時ファイルは必要無い。 整数限定で。 カウンターなどの用途に,かろうじて使える程度だが。 coocan. 普通の言語の変数とは違い,「即時展開」と「遅延展開」があるのだ。 その件については,できるだけノータッチでプログラミングが完了できると嬉しい。 だが,この「環境変数の遅延展開」を避けて通れない場合もある。 それが,「 forコマンドによる繰り返しループ中での変数の変更」だ。 例えば,連番を生成するとか。 この話題については,シンプルで良質なサンプルコードを準備しておいたので,そちらを参照してほしい。 そして,必要に迫られたときに参照すればよい。 サンプルコード: BATのforループで,「0埋めされた数値」を連番で出力しよう (環境変数の遅延展開と,数値の大小比較判定の方法)• SETLOCAL enabledelayedexpansion 〜 ENDLOCAL で囲まれた部分は,環境変数が遅延展開される。 で囲む• echoした文字列は,コマンドプロンプトの画面上に表示される。 しかし,エラー出力をログに保管する場合は,ちょっと注意が必要。 下記で見てみよう。 サンプル: main. bat(サブバッチの出力を,ログファイルにリダイレクトしている) call sub. txt pause exit sub. 続行するには何かキーを押してください. log. エラーメッセージは,エラー出力(「2」)に出てくる。 なので,これだと,エラーメッセージをログに記録しておくことができない。 これを解決するためには,リダイレクタの操作を行う。 Linuxと同じである。 main. bat内で,リダイレクトの書き方をちょっと変える。 call sub. txtには,エラーメッセージもちゃんと漏れずに記録されている。 リダイレクト先がマージされたためである。 Linux上でシェルが実行される仕組みを,体系的に理解しよう (bash 中級者への道)• つまり,• 「処理結果をリアルタイムに画面出力しながら,同時にログファイルにも書きこむ」 という要件は,Windows BATでは実現できないのだ。 これはスパッとあきらめよう。 バッチのLogをファイルと標準出力に同時に書き出したい DOSプロンプト活用相談室LOG• UNIX の tee みたいなことをやりたいが,標準のDOSコマンドの範囲ではできない.

次の

バッチファイルの作り方!作成入門から実行まで解説【初心者向け】|猫イラストブログ ~ 無料フリー素材画像集

バッチ ファイル 作り方

setlocal で set 文による環境変数のローカル化(呼び出し元を汚染しない)• こうすればこのバッチファイルの存在するディレクトリを基点として、周辺のファイルに相対パスでアクセスできる 目的2: 表示をすっきりさせる• echo off で「実行されるコマンド」が標準出力に出るのを抑止する(これしないと画面が見辛い) 目的3: 実行結果を読む• pause を実行させてキーを押すまで画面を停止させる(これしないとダブクリで実行した時にすぐにウィンドウが消えて何が起きたのかわからない) テンプレート 2 引数を受け取るバッチファイル バッチファイルでコマンドを作る時に使うテンプレートです。 (というより「引数判定やサブルーチン部分はこんな感じで書けば動くよ」というメモに近いですが ) 内容 addcommand. addcommand help : Show the usage. addcommand help : Show the usage. 引数判定• ダブルクォートは必要(無いと値によっては構文エラーでハマる)• コマンドの戻り値• yourname. txt" 実行結果• メモ帳が起動する• txt を開こうとする)• ここまではブロッキングの動作• 開かれたメモ帳を閉じると、上記二つが 一気に 開かれ、バッチファイルも終了する• これはノンブロッキングの動作 紛らわしいが start "" この第一引数のダブルクォートまでが決まり文句。 この次からパスと引数を書く。 エイリアス doskey コマンドを使う。 alias. txt" 'np' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 txt が見つかりません。 新しく作成しますか? 」 のようなダイアログが出るはず。 echo ここは表示されます。 echo ここはスキップされるので表示されません。 echo ここはスキップされるので表示されません。 echo ここは表示されます。 echo ここはスキップされるので表示されません。 echo ここはスキップされるので表示されません。 サブルーチンの定義• でアクセス• 戻り値は適当な変数を使う Return 文は無い• サブルーチンの利用• call : サブルーチン名 引数1 引数2... で呼ぶ• 戻り値は call 後、サブルーチン側でセットした値にアクセスして入手 心がけ スクリプト例ではないですが、よく使う「(バッチファイルとの付き合い方に関する)心がけ」についてもまとめてみました。 とりあえずググる やりたいことや困ったことがあったら、とりあえずググる。 大体答えが見つかる(ただし「バッチファイルでは無理です」も含む)。 日本語だけでなく英語でも調べると、Stackoverflow あたりにヒットしやすい。 バッチファイルで実現することにこだわらない ついつい意固地になって、やりたいことを「絶対にバッチファイルで実現してやる!」と固執してしまうが、手段と目的を取り違えてはいけない。 バッチファイルは言語能力も微妙だし、文法もカオスなので、 込み入ったことを実現するのは本質的に難しい。 別のスクリプトや言語で書くことを積極的に検討する。 参考 バッチファイルと戦いたい方向け :• 文字化けにご用心 バッチファイルはコマンドプロンプト cmd 上で動作するが、このコマンドプロンプトの文字コードは大体 cp932 なので、よく文字化けが発生する。 原因としてありがちなのは以下。 バッチファイル自体が UTF-8 等で書かれている• バッチファイルから呼び出したツールやコマンドが、cp932 以外の文字コードで標準出力している(特に UNIX ベースのツールと相性が悪い) ヘルプに目を通す 以下コマンドあたりのヘルプを読んでおくと、文法の理解が深まる。 clip などでコピーして、テキストエディタに貼り付けて読む。 おわりに 以上、かなり雑多&偏っているとは思いますが、ざっとまとめてみました。 コメントなどありましたらお気軽にいただけると幸いです.

次の

【超簡単】windowsバッチ(batch)ファイル作り方! ~ 全ての作業を自動化しよう!~

バッチ ファイル 作り方

管理者権限はなぜ必要か 正直何かするたびに出てくるの邪魔だなぁ・・・。 そう思ってる方が多いと思います。 私もそう思います。 それでもパソコンを守るためのセーフティとしてなくてはならないものなのです。 もし管理者権限を求められずに好き勝手にパソコンの設定を変更したり、むやみやたらにプログラムインストールできたらどうなるでしょう。 何かの拍子にデータが破損して、そのままパソコン自体が使えなくなってしまう可能性もないとは言えません。 個人のパソコンなら「まぁ自己責任だよねHAHAHA! 」で終わる話ですが、会社のパソコンだったとしたらもう目も当てられない事態に発展してしまうかも。 そういう危険があるからこそ、チェックの意味も含めて必要で重要な機能なのです。 でもやっぱり面倒・・・ まぁ、重要なのは分かるんですが、間違えた時にいちいち「管理者権限がないから」と締め出しを食らって実行しなおすのは時間のロスだし面倒です。 特に何百台ものパソコンのキッティングとなればなおさら。 というわけで一発で実行できるいい方法がないか探してみましょう。 これはずいぶんスマートに書けるしパスワードもいらないようです。 これを使っていきましょう。 ちなみにこのコマンドレット、どんな処理なのでしょう? Start-process 実行対象 ここはいたってシンプル実行対象を実行します。 例えばメモ帳を開くなら start-process notepad. exe です。 でもこれだけだとダブルクリックで起動しているのと変わりません。 管理者権限で実行するにはもうひと手間必要となります。 -verb runas start-process のオプションである -verb で、プロセス実行時のアクションを指定することができます。 例えばHello. txtというファイルの中身を印刷したいなら start-process Hello. txt -verb print です。 つまり start-process 実行対象 -verb runas は「実行対象を管理者として実行する」という意味です。 ただこれはあくまで PowerShell で使うコマンドレットです。 そのままではバッチファイルで使えません。 バッチファイルで powershell と最初に入れるとPowerShellのコマンドが使えます。 つまり最終的な形は powershell start-process 実行対象 -verb runas という形です。 さぁ準備は整いました。 実際に使ってみましょう! 学んだすべてをぶつける! 管理者権限で動かす 今回は、カレントディレクトリに file. まずは管理者権限で実行するバッチファイルを用意します。 仮に「test. bat」としましょう。 bat powershell start-process hello. bat -verb runas pause exit そしてファイルを作成する「hello. bat」。 txt pause exit これらをデスクトップ上に作ったtestフォルダに入れて、 いざ起動! 下段の通り、hello. bat は無事動いています。 また file. txt も無事 test フォルダ内に作成されました! bat はちゃんと思ったとおりに動いてくれたと言うこと! 無事完成です! ・・・いないとは思いますが2つに分けるのが面倒だからといって、全てをhello. batにまとめて以下のように書くのはダメですよ? powershell start-process hello. こんな時は -verb runas -wait のように -wait を追加しましょう。 これで start-process で起動したプロセスが終了するまで後続処理は待ちになります。 最後に いかがでしたでしょうか? 2回にわたってお送りしました「犬でもわかるバッチファイルの作り方」。 カレントディレクトリの指定と管理者権限の付与。 この2つはバッチファイルを作るうえで重要な基礎の部分でもあります。 私と同じ新人エンジニアの皆さん!しっかり覚えて使いこなせるようにしましょう!

次の