Windowsのバッチとスクリプトの書き方|Yes/no分岐・画面を閉じない・エイリアス
/ 6 min read
Table of Contents
はじめに
Windowsで定型作業を自動化しようとすると、バッチファイルかPowerShellを書くことになります。どちらも普段使わないので毎回書き方を忘れるのですが、実際に必要になった処理をまとめました。
実行後にコマンドプロンプトを閉じない
バッチファイルをダブルクリックで実行すると、処理が終わった瞬間にウィンドウが閉じてしまい、結果もエラーも読めません。
最後のコマンドの前に cmd /k を付けると、実行後もウィンドウが残ります。
cmd /k cd C:\hoge\fuga/k は「コマンドを実行した後もコマンドプロンプトを継続する」という意味です(/c だと実行後に終了します)。
バッチファイルでYes/no分岐を作る
実行前に確認を挟みたいときのパターンです。
@echo off:RESTARTset /p yn="処理を実行しますか?(Y/n): "
if /i "%yn%"=="y" ( rem Yesの場合の処理 echo 実行します) else if /i "%yn%"=="n" ( rem Noの場合の処理 echo 中止します exit /b) else ( echo YかNで回答してください goto RESTART)pause書き方のポイントは3つです。
- **
"%yn%"とダブルクォートで囲む。**囲まないと、何も入力せずEnterを押したときに変数が空になり、if ==yという不正な構文になって構文エラーで落ちます。 - **
/iを付ける。**大文字と小文字を区別しなくなるため、Yでもyでも受け付けられます。 - **
gotoで先頭に戻す。**想定外の入力のときに、やり直しをさせられます。
PowerShellで引数付きのエイリアスを登録する
Linuxのbashでは alias ll='ls -la' のように引数込みで登録できますが、PowerShellの Set-Alias はコマンド名しか登録できません。引数を渡したい場合は、エイリアスではなく関数を定義します。
プロファイルを開きます。
> notepad $PROFILE関数を書きます。
# 引数なしのショートカットfunction .. { cd ..}
# 任意の引数をそのまま渡すfunction dc { docker compose $args}
# 引数が不要なら Set-Alias でよいSet-Alias -Name v -Value nvim$args には、呼び出し時に渡された引数がすべて入ります。dc up -d と実行すれば、docker compose up -d が実行されます。
おわりに
バッチファイルは、変数をクォートで囲むかどうかだけで挙動が変わるのが厄介なところです。分岐を書くときは、何も入力せずEnterを押した場合を必ず試しておくと、想定外のエラーを避けられます。
