よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

コマンド操作の自動化 / バッチファイルとシェルスクリプト【メモ】

ショッピングサイトなどでお買い物をすると、サイトから受注確認のメールが届いたりします。
このような芸当ができるショッピングサイトの事務員さんは何と仕事のさばける人たちでしょう!

いいえ、もちろんコンピュータが自動で行っています。
注文があれば注文者に対して受注履歴のコピーをメールで送る作業が一連で自動化されている。


自分のパソコンやスマホでそのような自動化ができないだろうか?

どうやらできそう。
Windowsではバッチファイル、Unix系OSではシェルスクリプトを使うとよさそうです。
この回では主にWindowsのバッチファイルについてざっくりと書きます。
(ざっくりとしか書けない。当人は訳が分かっていない。)


なお、具体的なバッチファイルの作り方や説明は一切ありません。
(作り方や具体的なファイル作成ができない。当人は訳が分かっていない。)

目次

【バッチファイルの説明】

バッチファイルとは

Windows上の処理を自動化するプログラムファイル。
コマンドプロンプト上での手作業を省略し、自動実行できる。
例)

  • コマンド操作をログファイルに書き出す
  • タスクスケジューラーと組み合わせて、時間ごとにECサイトから受注履歴をダウンロードさせる

【バッチファイルのメリット/デメリット】

バッチファイルのメリット
  • プロセスの起動処理を簡略化できる(起動引数などをまとめて保管しておける)
バッチファイルのデメリット
  • 構造型プログラムが書けない、極めて書きづらい
  • 複雑な処理は困難。別のプログラムを呼び出して処理させる

【バッチファイルの作り方】

メモ帳などエディタで記述する。拡張子は .bat

(参考) Windows以外
Unix系OS(UbuntuやAndoroid、MacOSなどLinuxFreeBSD系、等)では、bash等のシェルコマンドを操作するシェルスクリプトで作る。拡張子は.sh


「@」

コマンドの先頭に @ を付けるとバッチ実行時にそのコマンド自体は表示されなくなる。

「@echo off」

実行しているコマンド自体の表示を全面的にoffにできる。
つまり、すべての行の先頭に @ をつけなくて済む。

rem

コメント行。バッチの目的などを記載する際に使う。

set

環境変数の定義。フォルダのパスとかを定義する。
後から変更しやすいように、バッチの先頭部分にまとめて記述する。

pushd

ディレクトリの移動。

  • cd だと異なるドライブに移動できない。
  • cd/d とすれば異なるドライブに移動できるが、UNICパス上でネットワークの

共有フォルダ上を移動できない。

  • ドライブの違いや、ネットワークの違いを気にせずに必ず移動できる。
  • cd ではなく、pushd を使う。
%0

バッチファイルのファイルパス。
%0\..とすれば、このバッチファイルが存在するフォルダを指す。
したがって、バッチファイルの存在するフォルダをカレントディレクトリにすることができる。

cls

画面の消去。前回のコマンドの実行結果などを削除して、まっさらな画面でバッチの実行を開始できる。

pause

何かのキーを押すまで待機する。バッチの終了を目視でよく確認したうえで次に進みたい場合などに使う。
突然ウィンドウが消えてしまうと、処理が成功したのか失敗したのかわからない。

exit

バッチの終了。


【batファイル サンプル】

【batファイル サンプルコード1】

@echo off

:start
cls
rem -------- メイン処理 ---------

ゴニョゴニョ~~~~

rem ------- キー入力で分岐 ---------

echo.
set usrekey=
set /p userkey=終了する(Enter) / メイン処理を再度実行(o + Enter) / サブ処理を実行(p + Enter) ?

if not '%userkey%'=='' set userkey=%userkey:~0,1%
if '%userkey%'=='o' goto start
if '%userkey%'=='p' goto exec
goto quit

rem -------- サブ処理 ---------

:
exec

~~~ゴニョゴニョ~~~

rem ---- 終了 -------


:
quit

exit

【サンプルコード1の解説】

コロン : で始まる行はラベル。goto文はラベルにジャンプすることができる。

ラベル名は「goto~~」と書いたときに分かりやすく、処理の流れを理解しやすいものにする。

set/p

ユーザー入力値を環境変数に格納する。

%変数名:~0,1%で、文字列の0文字目から1文字分を切り出して抽出する。

つまり先頭の文字を判別する。

if文とgotoを上手く組み合わせて、特定の条件で振り出しに戻るようにする。

その際に cls してあげると親切。



【batファイル サンプルコード2】

@echo off

rem メイン処理 : サブルーチンのテスト
call :routine_hello ヘンドリックス
call :routine_hello ベック
call :routine_hello エディ

pause
rem メイン処理はここで終了
exit


rem 引数を受け取って、Hello と表示するルートン。
:routine_hello

echo Hello, %1!

exit /b

【サンプルコード2 実行結果】

Hello,ヘンドリックス!
Hello ベック!
Hello,エディ!
続行するには何かキーを押してください・・・

【サンプル2 解説】

call

ラベルを goto ではなく call で呼び出せば、サブルーチンになる。

サブルーチンには、そのサブルーチン独自の引数を渡すことが可能。

サブルーチン内では%1などで参照。

サブルーチンからメインルーチンに戻る際には、exit/b する。

/bオプションをつけないと、バッチ全体が終了してしまう。

ルーチンからの戻り値は数値のみ。
バッチ内のルーチンから、呼び出し元に値を返却するには errorlevel を使う。
call文で外部のバッチファイルを呼べる。

しかし、外部バッチで「exit 0」とかがあったりすると、処理が終わってしまう。

exit/b 数字

この記述のある外部バッチファイルをcallで呼び出せば、数字を%errolevel%に設定して
ちゃんと戻ってきてくれる。


おわりに

バッチファイルやシェルスクリプトコマンドプロンプトやターミナル上でのコマンド操作を自動化するテクニックである以上は、コマンドの使い方を若干でも覚える必要がある。