0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsバッチ(.bat)学習メモ お決まりの文言について

Posted at

目次

  1. 先頭に@をつける または echo off
  2. setlocalendlocal
  3. setlocal enableDelayedExpansion

  • 先頭に@をつける または echo off
    コマンド部分の出力をしないようにする。
    コマンドの先頭に@をつけた場合はそのコマンドのみが対象となり、
    echo offの場合は以降全てのコマンドが対象となる。
    再度コマンド部分の出力をするようにしたい場合は、echo onを入力する。
    コード
    rem @でコマンド部分を非表示にする
    @echo using @
    
    rem 何も設定しない状態だと、コマンド部分が表示される
    echo no setting
    
    rem @でコマンド部分を非表示にしたecho offを実行
    @echo off
    rem echo offの後なので、@を付けずともコマンド部分は非表示になる
    echo command is gone
    echo on
    
    rem echo onの後なので、@を付けないとまたコマンド部分が表示されるようになっている
    echo command is return
    
    @pause
    
    結果
    using @
    (パス)>echo no setting
    no setting
    Command is gone
    
    (パス)>echo Command is return
    Command is return
    続行するには何かキーを押してください...
    
    出力結果が煩雑にならず済むため、九分九厘記述必須のキーワードだと思う。
    なお、実際はecho offを含めた全てのコマンドを非表示にしたい場合がほとんどなので、@echo offを頭に記述し、echo onは記述しないことがほぼ常となる。

  • setlocalendlocal
    変数のスコープ範囲を、setlocalendlocal間に限定する。
    つまりここで定めた範囲内における変数への変更は、範囲外では反映されない。

    コード
    @echo off
    
    set a=1
    echo %a% @point1
    
    rem 1つ目のスコープ開始
    setlocal
        echo %a% @point2
        set a=2
        echo %a% @point3
    
        rem 2つ目のスコープ開始
        setlocal
            echo %a% @point4
            set a=3
            echo %a% @point5
        endlocal
        rem 2つ目のスコープ終了
        
        echo %a% @point6
    endlocal
    rem 1つ目のスコープ終了
    
    echo %a% @point7
    
    結果
    1 @point1
    1 @point2
    2 @point3
    2 @point4
    3 @point5
    2 @point6
    1 @point7
    続行するには何かキーを押してください...
    

    スコープを出ると、スコープ突入直前の値に回帰していることがわかる。

    ※なおendlocalは、記述せずともバッチファイル終了時に必ず勝手に実行されるようになっている。
    そのためスコープのネストをしなければ、実際はsetlocalの記述だけで事足りる場合が多い。
    しかし、可読性のためにもendlocalは明記しておくに越したことはないと思う。

    なお環境変数に変更を加えたとしても、末尾の暗黙的なendlocalによってその変更は全て破棄されるので、不必要な影響を与えてしまわないかという心配は無用。


  • setlocal enableDelayedExpansion
    変数は、通常その変数が記述されている "行" が読み込まれた瞬間に、一気に展開される。
    しかしこれを記述すると、変数はその変数が記述されている行が読み込まれた瞬間には展開されず、 少し遅れて "命令(コマンド)" が読み込まれた瞬間に一気に展開されるようになる。
    コード
    @echo off
    
    set a=1
    if %a% == 1 (
        set /a a+=1
        rem if文に入った時点のものが展開されるため、
        rem 1+1は反映されず、1が表示されることになる。
    	echo %%a%% in if is %a%
        rem ただし内部的に計算は完了しているので、
        rem 文外で再度表示させれば、反映後の結果が表示される。
    )
    echo %%a%% out if is %a%
    
    setlocal enableDelayedExpansion
        set b=11
        if %b% == 11 (
            set /a b+=1
            rem enableDelayedExpansionが設定されている時に、
            rem 「%」ではなく「!」で変数を囲むことにより、
            rem 展開タイミングの遅延が発動する。
        	echo %%b%% is %b%
        	echo ^^!b^^! is !b!
        )
    endlocal
    
    pause
    
    結果
    %a% in if is 1
    %a% out if is 2
    %b% is 11
    !%! is 12
    
    これが輝くのは、if文やfor文などを使う時。
    if文やfor文は、始まりのカッコ(から終わりのカッコ)までが1行と見なされる。
    よって文中で変数に対しどのような操作を行ったとしても、これを設定していなければ文に入った時点のもので置換されてしまうことになるため、
    if文やfor文での変更を即時反映させて扱いたい場合は、設定が必須となる。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?