<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>遅延環境変数 on qwerty.work</title>
        <link>https://qwerty.work/tags/%E9%81%85%E5%BB%B6%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0/</link>
        <description>Recent content in 遅延環境変数 on qwerty.work</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-JP</language>
        <lastBuildDate>Thu, 05 Oct 2017 22:50:14 +0900</lastBuildDate><atom:link href="https://qwerty.work/tags/%E9%81%85%E5%BB%B6%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>IF文で現在と指定の日時を比較・分岐してコマンドを実行するバッチファイル</title>
            <link>https://qwerty.work/post/2017/10/if-date-time-command-batchfile/</link>
            <pubDate>Thu, 05 Oct 2017 22:50:14 +0900</pubDate>
            <guid>https://qwerty.work/post/2017/10/if-date-time-command-batchfile/</guid>
            <description>&lt;p&gt;指定の日、または指定の時間を越えていたらシャットダウン・再起動をするバッチファイルのメモ。&lt;/p&gt;&#xA;&lt;p&gt;Windowsマシンのクリーンインストールやリカバリを行う機会が多く、Windows Updateを自動で繰り返すバッチファイルを走らせているのですが、一定時間放置していると更新するファイルがないのに延々と再起動を繰り返している状態があったりするので、指定の日時が来たら勝手に止まるように考えてみました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;現在を示すコマンドの参考&#34;&gt;現在を示すコマンドの参考&#xA;&lt;/h3&gt;&lt;h4 id=&#34;現在の日付を表示するコマンド&#34;&gt;現在の日付を表示するコマンド&#xA;&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ps&#34; data-lang=&#34;ps&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%DATE%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;現在の時間を表示するコマンド&#34;&gt;現在の時間を表示するコマンド&#xA;&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ps&#34; data-lang=&#34;ps&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%TIME%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;単純に日または時間だけで比較してコマンドを実行&#34;&gt;単純に日または時間だけで比較してコマンドを実行&#xA;&lt;/h3&gt;&lt;h4 id=&#34;日付のみで比較する場合&#34;&gt;日付のみで比較する場合&#xA;&lt;/h4&gt;&lt;p&gt;現在の日付が指定日またはそれ以降の日の場合、60秒後にシャットダウンします。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ps&#34; data-lang=&#34;ps&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@echo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;off&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;STOPDATE=&amp;#34;2017&lt;/span&gt;/10/06&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%STOPDATE% geq %DATE% shutdown /s /t 60&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;時間のみで比較する場合&#34;&gt;時間のみで比較する場合&#xA;&lt;/h4&gt;&lt;p&gt;現在の時間が指定時間以降の時間の場合、60秒後に再起動します。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ps&#34; data-lang=&#34;ps&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@echo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;off&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;STOPTIME=&amp;#34;20:00:00.00&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%STOPDATE% gtr %TIME% shutdown /r /t 60&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;比較演算子について&#34;&gt;比較演算子について&#xA;&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;  ==&#xA;  等しい&#xA;&#xA;&#xA;  equ&#xA;  等しい&#xA;&#xA;&#xA;  neq&#xA;  等しくない&#xA;&#xA;&#xA;  gtr&#xA;  より大きい&#xA;&#xA;&#xA;  geq&#xA;  以上&#xA;&#xA;&#xA;  leq&#xA;  以下&#xA;&#xA;&#xA;  lss&#xA;  より小さい（＝未満）&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ちなみに、&lt;strong&gt;/i&lt;/strong&gt;を付けると、大文字と小文字を区別しなくなります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;日付と時間の両方で比較したいとき&#34;&gt;日付と時間の両方で比較したいとき&#xA;&lt;/h3&gt;&lt;p&gt;コマンドプロンプトではIF文でANDやORを使って複数の条件を指定できないみたいです。&lt;/p&gt;&#xA;&lt;p&gt;それで、IF文の中にIFにIF分を入れ子にして複数の条件を分岐させる方法もやってみたのですが、書き方が悪かったのかうまくいかなかったので、例えば、&lt;strong&gt;2017/10/05 22:00&lt;/strong&gt;を&lt;strong&gt;201710052200&lt;/strong&gt;のように日付と時間を合体させて比較して分岐する方法でやってみました。&lt;/p&gt;&#xA;&lt;p&gt;もっと短いコードで、いいやり方があると思いますが、とりあえずこれでもうまくいきました。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ps&#34; data-lang=&#34;ps&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@echo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;off&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;setlocal&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;enabledelayedexpansion&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;終了日時を設定&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDDAY=2017&lt;/span&gt;/10/05&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDTIME=23:59&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;現在の日時を数値化&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;YYYY=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%Date:~0,4%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MM=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%Date:~5,2%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DD=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%Date:~8,2%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TT=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%Time:~0,2%%Time:~3,2%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TT=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%TT: =0%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TS=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%YYYY%%MM%%DD%%TT%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;終了の日時を数値化&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDYYYY=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%ENDDAY:~0,4%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDMM=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%ENDDAY:~5,2%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDDD=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%ENDDAY:~8,2%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDTT=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%ENDTIME:~0,2%%ENDTIME:~3,2%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDTT=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%ENDTT: =0%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ENDTS=&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;%ENDYYYY%%ENDMM%%ENDDD%%ENDTT%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%TS%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%ENDTS%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;%%!TS!%% lss %%!ENDTS!%% (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;まだ大丈夫&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&#x9;echo 終了&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;endlocal&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;pause&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IF文の中では変数を**%%!TS!%%&lt;strong&gt;と&lt;/strong&gt;%%!ENDTS!%%**としているのは%TS%と%ENDTS%の値がECHOではちゃんと正常な数値になっているのに、IF文の条件比較では変数の値がリアルタイムに反映されていないみたいで、思ったとおりの動きになりません。&lt;/p&gt;&#xA;&lt;p&gt;そこで、遅延環境変数（変数を！で囲って使う）というものを使います。通常、**!TS!&lt;strong&gt;でうまくいくはずですが、思った通りに反映されなかったので、変数の値を複数回更新するという意味で％を2個付けて&lt;/strong&gt;%%!TS!%%**としています。&lt;/p&gt;&#xA;&lt;p&gt;他のスクリプト言語だと同じ変数にどんどん値を代入すればちゃんとそのとおりの値になっているのに、バッチファイルではなりません。これはバッチファイルならではの仕様のようです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;IF文&lt;/strong&gt;や&lt;strong&gt;FOR文&lt;/strong&gt;では遅延環境変数を使う癖を身に着けていないとドツボにはまりますので覚えておきたいと思います。&lt;/p&gt;&#xA;&lt;p&gt;遅延環境変数と使うときは&lt;strong&gt;setlocal enabledelayedexpansion&lt;/strong&gt;という宣言が必要です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;setlocal&lt;/strong&gt;の説明については省きます。ちなみに&lt;strong&gt;endlocal&lt;/strong&gt;はなくても大丈夫です。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
