setlocal, endlocal

にメンテナンス済み

setlocalendlocal は、バッチファイル内で環境変数やコマンド拡張の有効範囲を限定するためのコマンドです。

バッチファイルで一時的な変数を使いたいときに setlocal を使うと、endlocal かバッチファイルの終了時点で元の状態に戻せます。

基本構文

setlocal [enableextensions | disableextensions] [enabledelayedexpansion | disabledelayedexpansion]
endlocal
setlocal はバッチファイルの中で使う

setlocal はバッチファイルやスクリプト内で使うのが基本です。 対話的なコマンドプロンプトで単独実行しても、通常は期待する効果を得にくいです。

何がローカルになるのか

setlocal 以降で変更した内容は、そのスコープの中だけで有効です。

  • set で変更した環境変数
  • コマンド拡張の有効 / 無効
  • 遅延環境変数展開の有効 / 無効

基本例

setlocal を使わない場合

@echo off

set VAR=Hello
echo %VAR%

このように setlocal を使わずに設定した環境変数は、同じコマンドプロンプトのセッションに残ります。

setlocal を使う場合

@echo off

set VAR=Before
setlocal
set VAR=Inside
echo スコープ内: %VAR%
endlocal
echo スコープ外: %VAR%
×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>sample.cmd
スコープ内: Inside
スコープ外: Before
C:\users\user>

endlocal の時点で、setlocal の中で行った変更が破棄されていることが分かります。

よくある挙動

未定義の変数を echo すると ECHO は OFF です。 と表示される

@echo off
setlocal
set MESSAGE=Hello
endlocal
echo %MESSAGE%

この例では %MESSAGE% が空文字列に展開されるため、実際には echo だけが実行されます。

その結果、@echo off の状態では次のように表示されます。

×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>sample.cmd
ECHO は <OFF> です。
C:\users\user>
おすすめ書籍※ 広告を含む場合があります
中小企業経営者のためのRPA入門 RPA導入を成功させる方法

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

遅延環境変数展開と組み合わせる

FOR ループや IF (...) ブロックの中で変数を更新しながら参照したいときは、enabledelayedexpansion を併用します。

@echo off
setlocal enabledelayedexpansion

set COUNT=0
for %%F in (*.txt) do (
    set /a COUNT+=1
    echo 現在の件数: !COUNT!
)

endlocal
!変数名! を使う

遅延環境変数展開を有効にしたブロック内では、%COUNT% ではなく !COUNT! のように参照します。

スコープの外へ値を渡したい場合

一時変数を使いつつ、最終結果だけをスコープ外に残したいことがあります。

その場合は endlocalset を同じ行に書くパターンが便利です。

@echo off
set RESULT=Before

setlocal
set RESULT=Done
endlocal & set "RESULT=%RESULT%"

echo %RESULT%
×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>export_value.cmd
Done
C:\users\user>

関連記事

練習問題

練習問題

次のコードを実行したとき、最後に表示される値はどれでしょうか?

@echo off
set VAR=FirstValue
setlocal
set VAR=SecondValue
endlocal
echo %VAR%
回答がサーバーに送信されることはありません
練習問題

setlocal enabledelayedexpansion を使っているブロック内で、更新後の値を参照する書き方はどれでしょうか?

回答がサーバーに送信されることはありません
#コマンドプロンプト #バッチファイル #引数 #コマンドライン #コマンド