コマンドプロンプト、WSH、PowerShell…Windows標準機能で作成するバッチ処理について | 今更ながらのバッチ処理基礎

コマンドプロンプト、WSH、PowerShell…Windows標準機能で作成するバッチ処理について | 今更ながらのバッチ処理基礎




バッチも色々あるけれど、Windows標準機能からやってみる

スクリプト言語=トライアンドエラーがやりやすい

バッチ処理というのは処理形式の話で、作り方は色々あります。
その中でも取っつきやすさも含めてWindows標準機能で作成するバッチを紹介します。

C言語で作りたいなら止めませんが、しょっぱなからコンパイル言語でやるのはおすすめしません。

「コンパイル言語」とは、コードを記述したファイルをコンパイラというプログラムを使って実行可能な形式に変換する必要がある言語のことです。
代表的なものにC、C++、Javaなどがあります。

一方の「スクリプト言語」は基本的には記述したコードがそのまま実行される言語のことです。
デスクトップアプリケーションではVBAなどが該当しますが、一般的にはWebブラウザ上で動作するJavaScript、Perl、Python、PHP、Rubyなどを指すことが多いです。

スポンサーリンク

コンパイル言語はデバッグの度にコンパイルが必要なことからトライアンドエラーがしにくい反面、コンパイルすることでコンピューターが読取やすい機械語になっているため処理のパフォーマンスは良いとされています。

一方のスクリプト言語はデバッグしたソースをそのまま実行するのでトライアンドエラーが容易なのと、構文が(コンパイル言語と比べて)比較的簡単で取っつきやすいと言われています。裏を返せばそれだけ単純なので複雑な処理に不向きとも。
その反面実行時にコンピューターがソースを1行ずつ翻訳しなければいけないのでパフォーマンスは比較的低いとされています。

そのため最初はスクリプト言語(に近い)コマンドプロンプトやJavaScriptで記述できるWSH、Windows7から標準機能となったPowerShellなどのほうが取っつきやすいのではないかと思います。

あと、コマンドプロンプトで記述したバッチファイルの拡張子が「.bat」のため、これを称して「Windowsバッチ」と呼ぶ人もおり、歴史やノウハウの面からもまずはここからやったほうが良いのではないかと思う。

尚、当ブログでは各サービスのコマンドの詳細なリファレンス等は紹介する予定はありません。
(事例として一部紹介する場合はある)
それぞれ多くの文献やサイトがあるので、そちらに譲ろうと思います。

そもそも「Windows標準」が何故3つもある?

厳密な話をすると膨大な長さになるので端折って説明すると、「時代の変遷」です。

Windows 3.1から搭載されたのがコマンドプロンプト(cmd.exe)。
Windows98から提供されたのがWSH。
Windows7から標準搭載されたのがPowerShellです。
厳密にはWSHだけ少し毛色が違って、VBScriptやJScript(Microsoft製のJavaScript)をWindows上で実行するための実行環境で、必ずスクリプトファイル(.vbs、.js)が必要なのに対して、コマンドプロンプトやPowerShellは画面に直接コマンドを入力して実行させることができます。
今回はバッチの説明なので、どちらにしてもバッチファイルを作りますからあまり関係ありませんが。

実行可能な処理等にもそれぞれ違いはありますが、ファイルの移動、コピー、削除などの簡単な動きであればどれでも可能です。
またコマンドプロンプトは歴史が長いのでナレッジも豊富です。
私もコマンドプロンプトである程度の処理を作って、コマンドプロンプトでできない部分をWSHやPowerShellの助けを借りる、というような作り方をよくします。

私がよく使うバッチ処理:コマンドプロンプト編

ここからは具体例をお見せしながら説明していきます。
(GitHubGistが使ってみたかっただけというのは内緒)

テキストファイルから特定の文字列を含む行を別ファイルへ抜き出し、元ファイルからその行を削除する

バッチを2つに分けています。実行するのは1つ目のバッチです。
1つ目のバッチが「抽出対象.txt」というテキストファイルから1行ずつ文字を読込んで2つ目のバッチに引数として渡しています。


2つ目のバッチは「抽出対象.csv」から引数で渡された文字列を含む行を別ファイルに書き出し、「抽出対象.csv」からは対象行を削除します。

「抽出対象.txt」の内容は以下の通り。

バッチ実行前の「抽出対象.csv」は以下の通り。

バッチ実行後の「抽出対象.csv」及び書き出されたファイルは以下の通り。

アイコンのせいなのかCSVファイルをExcelで開く人が多いのですが、CSVはテキストファイルなのでコマンドプロンプトでこうした操作を行うことができます。
抽出条件が都度変わったりするといちいち条件ファイルを書き直すのが面倒くさいですが、ある程度固定的な条件であればInputファイルだけ置いて実行すれば仕分けてくれます。

for文はコマンドプロンプトで比較的よく使うループ処理で、引数に指定したファイルから1行ずつデータを抜いてきて処理に渡すことができます。
読み込むファイルによってはカンマ区切りのCSVの特定の位置の文字だけ読み込むことも可能です。

私がよく使うバッチ処理:WSH(VBScript)編

Excelを開いてマクロを実行する

VBS

VBSを呼び出すコマンドプロンプト

VBSは第一引数にExcelファイル名、第二引数に実行するマクロ名を指定することでマクロが実行されます。
「VBSを呼び出すコマンドプロンプト」ではVBAに第一引数=「C:\batch\ProgramFiles\CSV変換.xlsm」、第二引数に「全実行」を渡しており、このバッチを実行することで「CSV変換.xlsm」というブックの「全実行」というマクロが実行されます。
いちいちExcelファイルを開いてマクロを実行する、というボタンを押さなくてよいのがメリットです。
ExcelVBAとの組み合わせになりますが、これができればRPAが無くてもCSVファイルをExcelに読み込んで加工して出力のような操作を行うことができます。

私がよく使うバッチ処理:PowerShell編

テキストファイルの文字コードをUTF-8→Shift-JISに変換する

他システム連携ファイルの文字コードを揃えるのに使うものです。
作り方を変えれば逆(Shift-JIS→UTF-8)にすることもできます。

ちなみにコマンドプロンプトからPowerShellを呼び出して文字コードを変える方法もあります。

…はじめからこっちを紹介しろよと言われそうな短さです。
前者は「C:\Convert\01_Input」配下にあるファイルをUTF-8→Shift-JISに変換して「C:\Convert\02_Output」に格納しており、格納先のフォルダが無い場合はフォルダも作ってあげています。
後者はバッチファイルと同じ階層にあるUnicordの「Unicord.csv」というファイルをShift-JISの「SJIS.csv」に変換しています。
つまり他の名前のファイルは変換してくれません。こうした理由で処理の複雑さに違いが出ています。

Windows標準バッチはファイル操作が得意。PowerShellならWindowsの設定変更もできる

上記例は「テキストファイルを条件で切り分ける」や「Excelファイルを開いてマクロを実行する」ですが、他にも単純にファイルの移動、コピー、削除などがバッチの得意とするところです。
毎日同じ場所に同じ名前のファイルを置いておけばバッチが自動的に処理してくれるようにできます。

今回は紹介していませんが、PowerShellならWindowsOSの設定の変更もできます。
例えばネットワーク系ならプロキシやIPアドレス、DNSの設定なども可能です。

このような処理を組み合わせるだけでも色々な処理の自動化が可能になります。

 

 

この記事をシェアする

この記事が気に入ったら
いいね!をお願いします

システム・サービス・ソフトカテゴリの最新記事