<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SETLOCAL アーカイブ - nyanblog ~にゃんぶろぐ~</title>
	<atom:link href="https://nyanblog2222.com/tag/setlocal/feed/" rel="self" type="application/rss+xml" />
	<link>https://nyanblog2222.com/tag/setlocal/</link>
	<description>ちょっとしたことを調べているよ</description>
	<lastBuildDate>Fri, 03 Sep 2021 13:26:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://nyanblog2222.com/wp-content/uploads/2021/09/cropped-favicon-32x32.png</url>
	<title>SETLOCAL アーカイブ - nyanblog ~にゃんぶろぐ~</title>
	<link>https://nyanblog2222.com/tag/setlocal/</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/>	<item>
		<title>SETLOCAL・ENDLOCALの使い方【BAT・サンプル付き】</title>
		<link>https://nyanblog2222.com/programming/cmd/402/</link>
					<comments>https://nyanblog2222.com/programming/cmd/402/#respond</comments>
		
		<dc:creator><![CDATA[nyan2222]]></dc:creator>
		<pubDate>Mon, 11 May 2020 09:00:01 +0000</pubDate>
				<category><![CDATA[コマンドプロンプト]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[ENDLOCAL]]></category>
		<category><![CDATA[SETLOCAL]]></category>
		<guid isPermaLink="false">https://nyanblog2222.com/?p=402</guid>

					<description><![CDATA[<p><img src="https://nyanblog2222.com/wp-content/uploads/2022/11/4.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://nyanblog2222.com/wp-content/uploads/2022/11/4.png 1280w, https://nyanblog2222.com/wp-content/uploads/2022/11/4-300x157.png 300w, https://nyanblog2222.com/wp-content/uploads/2022/11/4-1024x536.png 1024w, https://nyanblog2222.com/wp-content/uploads/2022/11/4-768x402.png 768w" sizes="(max-width: 1280px) 100vw, 1280px" />今回はBATの&#8221;おまじない&#8221;的なSETLOCAL・ENDLOCALの使用方法についてご紹介します。 目次 SETLOCAL・ENDLOCALとは？SETLOCAL・ENDLOCALを使わないと起こ [&#8230;]</p>
<p>投稿 <a href="https://nyanblog2222.com/programming/cmd/402/">SETLOCAL・ENDLOCALの使い方【BAT・サンプル付き】</a> は <a href="https://nyanblog2222.com">nyanblog ~にゃんぶろぐ~</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<img src="https://nyanblog2222.com/wp-content/uploads/2022/11/4.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" srcset="https://nyanblog2222.com/wp-content/uploads/2022/11/4.png 1280w, https://nyanblog2222.com/wp-content/uploads/2022/11/4-300x157.png 300w, https://nyanblog2222.com/wp-content/uploads/2022/11/4-1024x536.png 1024w, https://nyanblog2222.com/wp-content/uploads/2022/11/4-768x402.png 768w" sizes="(max-width: 1280px) 100vw, 1280px" />
<p>今回はBATの&#8221;おまじない&#8221;的なSETLOCAL・ENDLOCALの使用方法についてご紹介します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SETLOCAL・ENDLOCALとは？</a></li><li><a href="#toc2" tabindex="0">SETLOCAL・ENDLOCALを使わないと起こる不具合</a><ol><ol><li><a href="#toc3" tabindex="0">メインバッチ</a></li><li><a href="#toc4" tabindex="0">サブバッチ</a></li><li><a href="#toc5" tabindex="0">処理結果</a></li><li><a href="#toc6" tabindex="0">サブバッチ</a></li><li><a href="#toc7" tabindex="0">処理結果</a></li></ol></li></ol></li><li><a href="#toc8" tabindex="0">SETLOCAL・ENDLOCALを使った場合</a><ol><ol><li><a href="#toc9" tabindex="0">サブバッチ</a></li><li><a href="#toc10" tabindex="0">処理結果</a></li></ol></li></ol></li><li><a href="#toc11" tabindex="0">SETLOCAL ENDLOCALは先頭・末尾でないといけない？</a><ol><ol><li><a href="#toc12" tabindex="0">メインバッチ</a></li><li><a href="#toc13" tabindex="0">サブバッチ</a></li><li><a href="#toc14" tabindex="0">処理結果</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">SETLOCAL・ENDLOCALとは？</span></h2>



<p><strong><span style="color:#b78d4a" class="has-inline-color">BAT内だけで使用するローカル環境変数を扱う</span></strong>もので、主に</p>



<ul class="wp-block-list"><li>コマンドプロンプトを開いた状態で、複数のBATファイルを実行する場合</li><li>メインBATからサブBATを呼びだす場合</li></ul>



<p>に使われます。</p>



<p><strong><span style="color:#b78d4a" class="has-inline-color">・SETLOCAL</span></strong>とは<br>BAT内で使用するローカル環境変数を作成します。<br>ローカル環境変数はENDLOCAL又はBATの終わりに達したとき終了します。</p>



<p><strong><span style="color:#b78d4a" class="has-inline-color">・ENDLOCAL</span></strong>とは<br>ローカル環境変数を終了します。</p>



<p>それでは次項から具体例で説明します。</p>



<h2 class="wp-block-heading"><span id="toc2">SETLOCAL・ENDLOCALを使わないと起こる不具合</span></h2>



<p>不具合の例として、メインバッチとサブバッチの環境変数名が同じで、サブバッチ内でも値をセットしてしまったものを紹介します。</p>



<h4 class="wp-block-heading"><span id="toc3">メインバッチ</span></h4>



<pre class="wp-block-code dos"><code>@ECHO OFF
SET TMP1=TEST END

@REM 処理実行
CALL TEST.BAT
ECHO %TMP1%</code></pre>



<h4 class="wp-block-heading"><span id="toc4">サブバッチ</span></h4>



<pre class="wp-block-code dos"><code>SET TMP1=C:\Windows

REM ～～～処理～～～</code></pre>



<h4 class="wp-block-heading"><span id="toc5">処理結果</span></h4>



<pre class="wp-block-code plaintext"><code>C:\Windows</code></pre>



<p>このように同じ環境変数を使用してしまったせいで、本来であれば、処理終了を示す「TEST END」と表示するはずでしたが、サブバッチでセットした「C:\Windows」が表示されてしまいました。</p>



<p>今回の例であればサブバッチを１つしか呼び出しておらず、セットした内容も全く異なるため、簡単にバグだと発見できました。ただこれが複数のサブバッチでセットする内容も似たような値であれば、<strong><span style="color:#b78d4a" class="has-inline-color">原因分析が困難な上に、処理結果を見ても間違いに気づかない可能性</span></strong>があります。</p>



<p>もちろん、サブバッチでセットした値をサブバッチ終了時に解放しても同じです。</p>



<h4 class="wp-block-heading"><span id="toc6">サブバッチ</span></h4>



<pre class="wp-block-code dos"><code>SET TMP1=C:\Windows

REM ～～～処理～～～

SET TMP1=</code></pre>



<h4 class="wp-block-heading"><span id="toc7">処理結果</span></h4>



<pre class="wp-block-code plaintext"><code>ECHO は &lt;OFF&gt; です。</code></pre>



<p>このように、サブバッチ内で解放してもNULLがメインバッチの環境変数に反映されてしまいました。</p>



<p>開放もできないとなると、メインバッチとサブバッチで環境変数名が被らないように注意するしかない？と思うかもしれませんが、そこで使用するのが<strong><span style="color:#b78d4a" class="has-inline-color">SETLOCAL・ENDLOCAL</span></strong>になります。</p>



<h2 class="wp-block-heading"><span id="toc8">SETLOCAL・ENDLOCALを使った場合</span></h2>



<p>先ほどの例にSETLOCAL・ENDLOCALを使いました。メインバッチは先ほどと同じです。</p>



<h4 class="wp-block-heading"><span id="toc9">サブバッチ</span></h4>



<pre class="wp-block-code dos"><code>SETLOCAL

SET TMP1=C:\WINDOWS

REM ～～～処理～～～

ENDLOCAL</code></pre>



<h4 class="wp-block-heading"><span id="toc10">処理結果</span></h4>



<pre class="wp-block-code plaintext"><code>TEST END</code></pre>



<p>この通り、期待していた処理結果となりました！</p>



<h2 class="wp-block-heading"><span id="toc11">SETLOCAL ENDLOCALは先頭・末尾でないといけない？</span></h2>



<p>結論から申し上げますと、<strong><span style="color:#b78d4a" class="has-inline-color">SETLOCAL・ENDLOCALの位置はどこでも構いません</span></strong>。ローカル環境変数を始めたい箇所にSETLOCALを設定し、終わりたい箇所でENDLOCALを設定すれば問題ありません。</p>



<p>なので、以下のような使い方ができます。</p>



<h4 class="wp-block-heading"><span id="toc12">メインバッチ</span></h4>



<pre class="wp-block-code dos"><code>@ECHO OFF
SET TMP1=～～～処理～～～

@REM 処理実行
CALL TEST.BAT</code></pre>



<h4 class="wp-block-heading"><span id="toc13">サブバッチ</span></h4>



<pre class="wp-block-code dos"><code>ECHO %TMP1%

SETLOCAL

SET TMP1=！！処理中！！
ECHO %TMP1%

REM ～～～処理～～～

ENDLOCAL

ECHO %TMP1%</code></pre>



<h4 class="wp-block-heading"><span id="toc14">処理結果</span></h4>



<pre class="wp-block-code plaintext"><code>～～～処理～～～
！！処理中！！
～～～処理～～～</code></pre>



<p>このように、<br>　<strong><span style="color:#b78d4a" class="has-inline-color">SETLOCALまではメインバッチの環境変数</span></strong><br>　<strong><span style="color:#b78d4a" class="has-inline-color">SETLOCALからはサブバッチのローカル環境変数</span></strong><br>　<span style="color:#b78d4a" class="has-inline-color"><strong>ENDLOCAL後はメインバッチの環境変数</strong></span><br>が使われます。</p>



<p>ただ、バッチ間で環境変数を共有すること自体がバグに繋がる可能性がありますので、当サイトでは<strong><span style="color:#b78d4a" class="has-inline-color">SETLOCAL ENDLOCALは先頭・末尾であることを推奨</span></strong>します。</p>
<p>投稿 <a href="https://nyanblog2222.com/programming/cmd/402/">SETLOCAL・ENDLOCALの使い方【BAT・サンプル付き】</a> は <a href="https://nyanblog2222.com">nyanblog ~にゃんぶろぐ~</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nyanblog2222.com/programming/cmd/402/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
