いつも当ブログをご覧くださりありがとうございます。
以前にExcelの自動化についてお話ししたことがありますが、今回はWindowsの自動化についてです。
尚、この記事はプログラムをかじったことがある人向けの記事なので難しいかもしれません。
ただ、これを機にプログラミングの便利さを知ってもらえたら、とも思っております。
記事をご覧になってご自身で試される場合は自己責任でお願いします。
概要
なぜバッチを作るに至ったのか、バッチプログラムでどういうことができるのかを簡単に説明します。
なぜバッチを作ろうと思ったのか
私は某企業の情報システム部門に勤めており、日々システムの開発を通じて業務改善に努めております。
その業務の一つに、パソコンのセッティング作業(キッティングとも言う)があります。
社員の皆さんが使うパソコンの初期設定のことですが、これがそこそこ大変で、1台につき1時間半近くの時間がかかります。
それはもちろん手作業で行いますが、1時間半x台数なので、10台入荷したときは気が滅入ります・・・。
それをExcelVBAのようにプログラムで自動化できたら最高だなと思っていました。
どういうことができるのか
バッチを使えばどういうことが自動化できるのかというと、
- ユーザアカウントの追加
- IPやDNSサーバのアドレス設定
- スクリーンセーバーの設定
- 拡張子の表示をデフォルトに
- リモートアシスタンスの無効
- リモートデスクトップの有効
- ファイルを指定場所へ移動
- フォルダを作成
- フォルダの共有化
- フォルダのパーミッションを変更
- フルコンピュータ名の変更
- ワークグループの変更
- 各種アプリケーションのインストール
- 不要アプリケーションのアンインストール
などが自動化できます。
ExcelVBAでお話しした時と同じ表現ですが、手で行う作業はプログラムで書くこともできるということです。
セッティングでやることの一覧なので、もちろん他にもできることはたくさんあります。
バッチプログラムの効果
もちろん破壊力抜群です。
1時間半かかる作業が45分以下に短縮しました。
案外短縮できていないように見えますが、それはWindowsUpdateやアプリインストールのための実質的な待ち時間なので、私がパソコンを操作している時間はもっともっと少ないです。
というか、私がほとんどパソコンに触ることは無くなりました。
私はバッチプログラムをダブルクリックするだけです。
バッチできなかったことは
私の経験で出来なかったことを挙げると、
- WindowsUpdateの実施と完了
- 外字の登録
- 既定のプログラムの設定
- 電源の設定
- アプリ内部で行う設定
です。
私がやり方を知らないだけかもしれません。
バッチプログラムを書く前に
基礎の前に、プログラムを書くソフト、お作法、注意点などをご紹介します。
プログラムを書くソフト
TeraPadなどのエディタソフトを使いましょう。Windows標準のメモ帳は避けたほうがいいです。
TeraPadは無料で安全ですし、インストール作業も次へ次へで終了するので簡単です。
上記リンクからダウンロードできない場合は「Terapad」で検索してください。
もちろん有名な「サクラエディタ」や「SublimeText」でも構いません。
先頭には@echo offをつけること
エディタを開いてプログラムを書いていくのですが、決まり文句があります。
行頭には必ず@echo offと書きましょう。
こんな感じです。
書かないと余計な文字が表示されて見にくくなるので、必ずつけるようにしましょう。
文字コードと改行コード
特段の理由がなければ、文字コードはSHIFT-JIS(SJIS)、改行コードはCRLFで作ります。
TeraPadの右下には文字コードと改行コードが表示されるので確認できるはずです。
ファイルメニューの中に、文字/改行コード指定保存というのがあるので、そこで指定することもできます。
Windows標準のメモ帳は、画面上にその表示がなく指定も曖昧なので使わない方がいいのです。
名前を付けてファイルを保存
プログラムは名前を付けてファイルとして保存しますが、拡張子は.batにします。
こんな感じのアイコンになります。
ダブルクリックするとプログラムが実行されます。
コメントアウトrem
プログラムを知ってる方なら基礎の基礎、コメントアウトの書き方です。
コメントアウトとはプログラムの間に書くメモのことです。
プログラムは基本英語ですし、どんな動きをするのか読み解かなければならないのは作り手としても不便です。
コメントアウトの書き方はプログラミング言語によって異なりますが、バッチの場合は行頭にremと書きます。
:でもいいそうですが、まれに効かない場合があるそうです。
正式は「rem」です。
rem コメントだよ
管理者権限で実行する
管理者権限が必要な命令は普通にダブルクリックするだけではダメです。
バッチファイルを右クリックして管理者として実行をクリックして実行しましょう。
ちなみに、私のやりたいことは、ほとんど管理者権限が必要でした。
ディレクトリを意識すること
当たり前の話ですが、コマンドプロンプトなどのCUIではディレクトリの意識が必要です。
相対パスや絶対パスは意識しましょう。
バッチファイルをデスクトップに置いて実行すれば、カレントディレクトリはデスクトップです。
C:\Users\ユーザー名\Desktop>
管理者権限で実行すれば、カレントディレクトリはsystem32です。
C:\WINDOWS\system32>
使い手と作り手の概念
プログラミングでは当たり前の話ですが、プログラムを書く人は作り手です。
出来上がったプログラムを実行する人は使い手です。
私の場合は自分が使うために作るのですが、やはり使い手のことを考えて作る方が望ましいです。
バッチプログラムは見えない
こんなバッチプログラムがあったとします。
これを実行すると、まずウインドウが開きます。
そして、中に書かれているプログラムが上から順に処理され、処理が終わったら問答無用でウインドウは閉じられます。
ゆえに、プログラマーの入門であるHello Worldなどを書いたところで、人間には見えません。
なぜなら、
- ウインドウが開く
- Hello Worldが表示される(処理)
- ウインドウが閉じる
この1~3が一瞬で行われるためです。
内容を確認したければ、途中でプログラムを止める命令を入れる必要があります。
それは後で出てくるプログラム記述編で書きます。
プログラム記述編
書き方の基礎です。
文字を表示する echo
画面上に文字を表示するにはechoを使います。前述したとおり先頭行の@echo offはマストです。
@echo off echo Hello World
空行・改行を空けたい echo.
改行の書き方は、
@echo off echo.
です。「echo」と「.」の間は空いていたらダメです。
処理を一旦止める pause
前述した、途中プログラムを止める命令です。
echoを使ってhello worldと書いたところで、pauseが無ければ目視する前にウインドウは消えてしまいます。
書き方はこんな感じです。
@echo off pause
こちらが実行結果です。
これはつまり、プログラムを一旦止めて、使い手側に続けるか否かを問うているわけです。
使い手側が何かキーを押せば、プログラムは続行します。
逆にキャンセルしたければ、キーボードの「Ctrl+C」と「Y」でキャンセルできます。
尚、続行するには何かキーを押してください...を表示したくない場合は、
@echo off pause > nul
と書きます。
一旦ここまでで出来ることです。
そもそもechoって何のために使うの?と思うかもしれません。
バッチファイルは私やあなたが作ったところで、自分だけが使うかどうかはわかりません。あまりに便利に感じたら知人に使ってほしいと思うこともあるでしょう。
しかし、プログラムが解らない人間からみれば、何が起きるか不安になります。
ゆえに、作り手は使い手のために、echoを使って随所にこういう文章を入れてあげると親切です。
これだと何が行われるのかが判るので親切ですよね。
このコードは下記です。
@echo off echo. echo ----------------------------------------- echo ○○株式会社 セッティングプログラム vol.1 echo ----------------------------------------- echo このプログラムではアカウントの追加と echo セッティングのため一時的に仮のIPアドレスを振ります。 echo. echo. echo 処理(1/2) アカウントを追加します。 echo 続行するには何かキーを押してください... echo (キャンセルの場合はCtrl+Cで抜けて下さい) pause > nul
ディレクトリの移動 cd
カレントディレクトリの移動。
@echo off cd パス名
ちなみにユーザーディレクトリやデスクトップへの移動は
@echo off rem ユーザーディレクトリ c:\Users\User cd %UserProfile% rem デスクトップ c:\Users\User\Desktop cd %UserProfile%\Desktop
ファイルの移動 move
ファイルなどオブジェクトの移動。
@echo off move 移動元 移動先
変数の使い方
もちろん変数も使えます。書き方は
set 変数名= 初期値
です。「変数名」と「=」の間は空けてはいけません。
こんな感じです。
@echo off set NAME= HOGEHOGE
使い手の入力値を使いたい
プログラムの中で、使い手側に入力させたい時があります。
- 名前を入力させて、その名前でアカウント名を作りたい。
- 0や1を入力させ、その値によってプログラムを分岐させたい。
そういうとき、一旦プログラムを止め、使い手であるユーザーに入力させる方法です。
こう書きます。
set /p 変数名=
するとこの行でプログラムは停止し、画面上に入力のカーソルが表示されます。
pauseが無くてもプログラムはこの行でストップします。
ユーザーが値を入力してEnterキーを押すと、変数に値が入ります。
変数を使いたければ%で挟み下記のようにします。
%変数名%
変数を表示したければ
@echo off echo %変数名%
とします。
こんな感じです。変数は日本語でもいいですが基本的に1バイト文字の英語が望ましいです。
指定した秒数間バッチを止める timeout
プログラムとプログラムの間隔を空けたいときに使います。
@echo off timeout /t 秒数
IF文
もちろんIF文も書けます。
社員宛の電話を受けたときの文例です。
@echo off echo. echo 折り返しお願いします=ブランク echo 電話があったことお伝えください=1 echo 追って連絡します= 2 echo. set /p ANS= if "%ANS%" equ "" ( echo 折り返しお願いします ) else if "%ANS%" equ "1" ( echo 電話があったことお伝えください ) else if "%ANS%" equ "2" ( echo 追って連絡します ) else ( echo エラー )
その他
その他です。
引数を渡してバッチ実行する
バッチファイルをコマンドで実行するときに引数を与えられます。
これを使えばバッチファイルをまとめるバッチを作ってユーザー入力や条件分岐を使って色んなことができそうです。
こんな感じ。
test.bat ARIGATO SAYONARA
そして与えた引数をプログラムの中で、%数字%で使うことができる。
echo off rem 1番目の引数(ARIGATO) echo %1% rem 2番目の引数(SAYONARA) echo %2%
プログラム内からファイル名を取得する
尚、%0%と指定すればファイル名が取得できる。
echo %0%
一旦この辺で、気が向いたら続きを書きます。
尚、私が作ったセッティング用のプログラムは応用編として別記事で出すつもりです。
応用編を書きました。コードの実例です。
リファレンス本はこちらがオススメです。私はサッと引ける紙版を持っています。
ExcelVBAの記事はこちらです。よろしければご覧ください。
コメント