<?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>UI 網站 &#187; dos</title>
	<atom:link href="http://ui.idv.tw/wordpress/?cat=101&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://ui.idv.tw/wordpress</link>
	<description>個人雜亂筆記用</description>
	<lastBuildDate>Wed, 15 Oct 2025 10:08:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>dos For</title>
		<link>https://ui.idv.tw/wordpress/?p=1098</link>
		<comments>https://ui.idv.tw/wordpress/?p=1098#comments</comments>
		<pubDate>Thu, 05 Jan 2023 14:45:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[dos]]></category>

		<guid isPermaLink="false">http://ui.idv.tw/wordpress/?p=1098</guid>
		<description><![CDATA[http://bigpxuan.blogspot.com/2016/08/dos-for.html FOR %%a IN (xxx,yyy,zzz) DO ( echo %%a ) out: xxx yyy zzzz %%a &#8212; 用來儲存For迴圈產出的值,前面一定要有兩個%%後面加上一個英文字。注意 : 這個英文字有大小寫之分 IN &#8212; 指令文字，後面一定要接 () (xxx,yyy) &#8212; 文字串，在 For 裡面依序使用的東西 (後面會說到裡面還可以放檔案、指令) DO &#8212; 指令文字， 後面一定要接 (echo &#8230;.) (echo &#8230;.) &#8212; 要執行的指令，在這裡可以使用For的變數 %%a。 &#8230; <a href="https://ui.idv.tw/wordpress/?p=1098">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>http://bigpxuan.blogspot.com/2016/08/dos-for.html</p>
<p>FOR %%a IN (xxx,yyy,zzz) DO (<br />
  echo %%a<br />
)</p>
<p>out:<br />
xxx</p>
<p>yyy</p>
<p>zzzz</p>
<p>%%a &#8212; 用來儲存For迴圈產出的值,前面一定要有兩個%%後面加上一個英文字。<strong>注意</strong> : 這個<strong>英文字有大小寫之分</strong><br />
IN &#8212; 指令文字，後面一定要接 <strong>()</strong><br />
(xxx,yyy) &#8212; 文字串，在 For 裡面依序使用的東西 (後面會說到裡面還可以放檔案、指令)<br />
DO &#8212; 指令文字， 後面一定要接 (echo  &#8230;.)<br />
(echo  &#8230;.) &#8212; 要執行的指令，在這裡可以使用For的變數 %%a。<br />
                     如果指令有兩個以上可以像例子中一樣用 ( ) 包起來。</p>
<p><strong>數字的遞增和遞減</strong></p>
<p>For /L %%a in (start,step,stop) DO ( Do something)</p>
<p>例子:<br />
For /L %%a in (1,2,7) DO (<br />
  echo %%a<br />
)</p>
<p>/L &#8212; For後面可以下不同的參數，這會改變For對 IN 後面的 ( ) 所做的動作。<br />
        /L 會讓For 認定 ( ) 內的是數字，並且是遞增或遞減<br />
start &#8212; 起始數字，For迴圈從這個數字開始<br />
step &#8212; 每次迴圈變化的量，1 就是一次加一，-1就是一次減一。<br />
           例子中是每次加二<br />
stop &#8212; 當數字超過stop所設定的數字的時候迴圈就會終止。<br />
           (超過可能是比它大或比它小，端看start的數字與stop的數字的比較)<br />
           當數字等於stop的時候，並不會停止迴圈。</p>
<p><strong>搜索檔案用的迴圈</strong></p>
<p>For /R [[drive:]path] %%a in (檔名,檔名) do (Do something)</p>
<p>例子<br />
For /R c:\users\myaccount\Desktop %%a in (生日*,會議*) do (<br />
echo %%a<br />
)</p>
<p>/R &#8212; 設定為搜索檔案的For迴圈<br />
drive: &#8212; 搜索的磁碟機位置，如C:\或D:\等<br />
              可以省略不輸入，當沒有輸入時會認定為執行目錄的磁碟機，一般是 C:\<br />
path &#8212; 開始搜索的資料夾，重這個資料夾開始往子資料夾搜索<br />
            可以省略不輸入，當drive和path都沒有輸入時，會使用執行目錄為預設路徑<br />
(檔名,檔名&#8230;) &#8212; 輸入要尋找的檔名，其中檔名要加上 * 號<br />
                           * 號代表萬用字元，例子中，生日*，"生日"後面不管接什麼名字都算符合<br />
                           也可以放在前面，*生日.doc，也就變成檔名最後是生日的都算符合</p>
<p>指令或讀取檔案的For迴圈</p>
<p>For /F "option" %%a in (檔案,檔案&#8230;) do (Do something)<br />
For /F "option" %%a in ("字串,字串") do (Do something)<br />
For /F "option" %%a in (&#8216;指令&#8217;) do (Do something)</p>
<p>稍微說明一下，in後面 ( )中 :<br />
不加任何符號 (除了 , )代表這是一個檔案，可以被開啟讀取<br />
前後加上 " " ，表示裡面是字串<br />
前後加上 &#8216; &#8216; ，表示裡面是個指令，For會執行這個指令並收集回傳值</p>
<p>如果檔案的檔名有空白會造成For迴圈的判讀錯誤，因為Dos的For 會把空白當作分行，空白前後是不同檔案，這個時候option要加上 "usebackq"，此時For迴圈的判讀為</p>
<p>For /F "usebackq" %%a in ("檔案,檔案&#8230;") do (Do something)<br />
For /F "usebackq" %%a in (&#8216;字串,字串&#8217;) do (Do something)<br />
For /F "usebackq" %%a in (`指令`) do (Do something)</p>
<p> ( )內用 " "，代表檔案，這樣可以把有空白檔名的檔案包在裡面<br />
&#8216; &#8216;， &#8216; = " + shift， "符號再按shift就是這個符號，這個符號會被判定為字串<br />
` `， 最左上角的按鈕 ( 1 的左邊)，這個符號會被判定為指令</p>
<p>例子:<br />
For /F  "tokens=4,5&#8243; %%A in (&#8216;dir&#8217;) do (<br />
echo 檔名:%%B 檔案大小:%%A<br />
)</p>
<p>其中option有很多選項，整個option要用 " " 包起來，如 "tokens=1,2 eol=+ skip=2&#8243;</p>
<p>eol &#8212; 當碰到設定的符號時，就不會再儲存後面的文字 (只能指定一個字元)</p>
<p>skip &#8212; 略過開頭的 n 行，設定幾行就會跳過幾行</p>
<p>delims &#8212; 設定分隔符號，預設的分隔符號為 空白 ，可以指定多個符號<br />
               如"delims=+=:a "，指定的符號有 +號 =號 :號 a英文字和一個空白</p>
<p>tokens &#8212; 當回傳的文字被分隔符號 (delims)切隔成多個時，就要用tokens來取得想要的文字<br />
               預設是 1 ，可以用"tokens=1,3,5-9,*"，可以一次指定一個或用 &#8211; 符號指定多個<br />
               也可以用 * 符號把從這個以後的文字都設定在同一個變數中。<br />
               (tokens的使用會在下面介紹)</p>
<p>usebackq 改變 /F 讀取的格式            </p>
<p>這邊說明一下tokens<br />
tokens的使用會引用額外的變數，如 :<br />
For /F "tokens=1,2,3 %%d in (aaa bbb ccc ddd) do (<br />
echo %%d<br />
echo %%e<br />
echo %%f<br />
echo %%g<br />
)</p>
<p>會顯示<br />
aaa<br />
bbb<br />
ccc<br />
%g</p>
<p>一旦指定tokens以後，For迴圈會自動增加變數，並依照英文符號第增<br />
如果指定的變數是大寫，如%%C，自動增加的變數也會是大寫%%D、%%E&#8230;<br />
最後一個會顯示 %g 是因為沒有指定token，所以第四個變數沒有文字可以儲存</p>
<p>如果tokens使用 m-n的方式，如:<br />
For /F "tokens=1,2-3,4 %%D in (aaa bbb ccc ddd) do (<br />
echo %%D<br />
echo %%E<br />
echo %%F<br />
echo %%G<br />
)</p>
<p>會顯示<br />
aaa<br />
bbb ccc<br />
ddd<br />
%G</p>
<p>最後一種tokens的用法是tokens=1,*，星號代表從這個 (在這邊是1) 以後的文字都存在同一個變數，如 :</p>
<p>For /F "tokens=1,2,* %%D in (aaa bbb ccc ddd) do (<br />
echo %%D<br />
echo %%E<br />
echo %%F<br />
echo %%G<br />
)</p>
<p>會顯示<br />
aaa<br />
bbb<br />
ccc ddd<br />
%G</p>
<p>這裡做簡單的小結<br />
For 後面代不同的參數會使For有不同的運作和判斷<br />
For &#8212;&#8212; 最基本的For迴圈，筆者還沒用過<br />
For /L &#8212; 讓數字遞增或遞減的For迴圈，像是讓一個指令重複執行10次<br />
For /R &#8212; 搜索檔案，可以搜索特定檔案或全部搜索，並回傳各種檔案的屬性<br />
For /F &#8212; 讀取檔案或執行指令，並儲存回傳的值 (常用)，並且有很多個option可用<br />
For /D &#8212; 使用延伸指令，重來沒用過</p>
<p>底下介紹筆者在用的使用方法</p>
<p>讀取電腦的IP<br />
各位應該有很多種抓取電腦IP的方法，這邊用For迴圈加ipconfig指令的方式<br />
@setlocal<br />
@echo off<br />
for /F "tokens=16&#8243; %%a in (&#8216;ipconfig ^| findstr /R /C:"10.1.1&#8243; ^| findstr /R /C:"IPv4&#8243;&#8216;) do (<br />
 set ip=%%a<br />
)<br />
echo %ip%<br />
endlocal</p>
<p>輸出:<br />
10.1.1.20</p>
<p>更進一步的，只要10.1.1.20裡面的最後一個數字 20 ，可以在迴圈裡面再新增一個迴圈<br />
@setlocal<br />
@echo off<br />
for /F "tokens=16&#8243; %%a in (&#8216;ipconfig ^| findstr /R /C:"10.1.1&#8243; ^| findstr /R /C:"IPv4&#8243;&#8216;) do (<br />
 for /F "tokens=4 delims=." %%c in ("%%a") do (set ip=%%c)<br />
)<br />
echo %ip%<br />
endlocal<br />
輸出:<br />
20</p>
<p>說明一下這邊用到的參數和指令<br />
tokens=16 &#8212; 可能有人會問，為什麼知道是第16個位置，那是因為我用試的試出來的<br />
                      方法有點像 : tokens=1,2,3,4,5,6,7,8,9,10,11,12，然後用echo %%a-1, %%b-2,&#8230;.<br />
                      這樣的方法找出位置<br />
delims=. &#8212;-  因為IP之間是用 . 隔開，因此設定間隔符號為 . 。<br />
ipconfig &#8212; 顯示電腦IP和其它相關資訊<br />
findstr &#8212;- 在文件中尋找文字，在這邊用來尋找 ipconfig 執行的結果<br />
^| &#8212;&#8212;&#8212; 這裡有兩個符號 ^ 和 | 。<br />
                 ^ 在批次檔內代表逃脫符號，會讓下一個符號的特殊能力失效，變成普通的文字。<br />
                 | 這個是管線符號 (pipe) 會把左邊執行的結果傳到右邊當作輸入<br />
                 會用到 ^| ，是因為For裡面會認定 | 為特殊符號，會中斷For的執行</p>
<p>這邊用到兩個迴圈，For裡面還有另一個For，這可以降低撰寫的行數<br />
兩個For所使用的變數建議用不一樣的，比較好區分</p>
<p>For裡面設定(set)變數<br />
這邊用漸進的方式解釋變數在For迴圈理的現象<br />
這邊使用For /R 去累計總檔案的大小，例子中的檔案大小是編出來的</p>
<p>@setlocal<br />
echo off<br />
set size=0<br />
For /R  %%A in (Joo*) do (<br />
echo %%~zA<br />
)<br />
pause<br />
endlocal<br />
輸出:<br />
10<br />
20<br />
30<br />
>40</p>
<p>現在加上一個變數來累加總共的檔案大小<br />
@setlocal<br />
echo off<br />
set size=0<br />
For /R  %%A in (Joo*) do (<br />
set /a size=%size% + %%~zA<br />
echo 這個檔案大小 : %%a<br />
echo 目前累計 : %size%<br />
)<br />
echo 總共累計 : %size%<br />
pause<br />
endlocal<br />
輸出:<br />
這個檔案大小 : 10<br />
目前累計 : 0<br />
這個檔案大小 : 20<br />
目前累計 : 0<br />
這個檔案大小 : 30<br />
目前累計 : 0<br />
這個檔案大小 : 40<br />
目前累計 : 0<br />
總共累計 : 40</p>
<p>這個例子多了set /a size=%size% + %%~zA用來累加每個檔案的大小<br />
並在下一行使用echo %size%告知現在size的累計量</p>
<p>從結果看，在迴圈內的 size 變數沒有被加總的感覺<br />
最後一個檔案大小是 40 ，跟"總共累計"大小一樣，也就是 size變數只有加到最後一次<br />
因為在 For 裡面的 % % 變數，是取用For之前的變數做的位置<br />
因此每次執行set /a size=%size% + %%~zA這個裡面的%size%，是取用最前面set size=0 的這個位置<br />
也就是在For裡面呼叫%size%時，每次呼叫的值都是 0。<br />
底下說明如何在For迴圈裡面使用 set 變數。</p>
<p>新增參數 enableextensions enabledelayedexpansion</p>
<p>@setlocal enableextensions enabledelayedexpansion<br />
echo off<br />
set size=0<br />
For /R  %%A in (Joo*) do (<br />
set /a size=!size! + %%~zA<br />
echo 這個檔案大小 : %%a<br />
echo 目前累計 : !size!<br />
)<br />
echo 總共累計 : %size%<br />
pause<br />
endlocal<br />
輸出:<br />
這個檔案大小 : 10<br />
目前累計 : 10<br />
這個檔案大小 : 20<br />
目前累計 : 30<br />
這個檔案大小 : 30<br />
目前累計 : 60<br />
這個檔案大小 : 40<br />
目前累計 : 100<br />
總共累計 : 100</p>
<p>在 setlocal 後面再加上參數enableextensions enabledelayedexpansion，可以使用 ! ! 呼叫變數<br />
在For裡面呼叫 %size%會一直是零，原因上面有提到，為了要反應迴圈內的變數要使用 !size! 去呼叫變數。<br />
這樣的呼叫方式第一次會取set size=0的值存在另一個位置<br />
而後在迴圈內每次呼叫!size!都會使用這個新的位置進行儲存和讀取</p>
<p>結論就是:<br />
要在回圈中使用變數要增加參數enableextensions enabledelayedexpansion<br />
迴圈中呼叫變數的方法為 !變數!<br />
迴圈外呼叫變數的方法還是 %變數%</p>
<p>最後展示某個資料夾即子資料夾的檔案，超過修改時間7天後會被刪除</p>
<p>@setlocal enableextensions enabledelayedexpansion<br />
echo off<br />
set size=0</p>
<p>For /R  T:\abc\def\ %%A in (*) do (<br />
rem 把檔案的日期存到變數tmp<br />
set tmp=%%~tA</p>
<p>For /F "tokens=1,2,3 delims=/ " %%c in ("%%~tA") do (<br />
  rem 檢查檔案日期的年份，如果比現在的年份小就刪除<br />
  if %date:~0,4% GTR %%c (<br />
    del /f /q "%%A"<br />
 echo %%A<br />
 set /a size=!size! + %%~zA<br />
  ) else (<br />
    rem 檢查檔案日期的月份，如果比現在的月份小就刪除<br />
    if %date:~5,2% GTR %%d (<br />
   del /f /q "%%A"<br />
   echo %%A<br />
   set /a size=!size! + %%~zA<br />
 ) else (<br />
 set tmp_2=%%e<br />
 rem 因為DOS變數的關係，要檢查日期是不是兩位數並做一些處理<br />
 if "!tmp_2:~0,1!" == "0&#8243; (<br />
   set /a tmp_2=!tmp_2:~1,1! + 6<br />
   if  "!tmp_2:~0,1!" == "0&#8243; (set tmp_2=0!tmp_2! )<br />
 ) else (<br />
   set /a tmp_2=!tmp_2:~0,2! + 6<br />
 )<br />
   rem 檢查檔案月份的天數，如果比現在的天數小7天就刪除<br />
   if %date:~8,2% GTR tmp_2 (<br />
     del /f /q "%%A"<br />
        echo %%A<br />
     set /a size=!size! + %%~zA<br />
   )))<br />
)</p>
<p>)<br />
echo 總刪除的檔案大小 : %size%<br />
pause<br />
endlocal<br />
怕有人使用後誤刪檔案，這個例子中的路徑是亂設定的。<br />
例子內並沒有真的準確7天，在年和月的部分有可能差不到7天<br />
可以用類似( set /a xx=30-%date:~8,2%+6) &#038; if xx GTR 7 )的方式比較月的部分有沒有超過7天</p>
]]></content:encoded>
			<wfw:commentRss>https://ui.idv.tw/wordpress/?feed=rss2&#038;p=1098</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dos set</title>
		<link>https://ui.idv.tw/wordpress/?p=1096</link>
		<comments>https://ui.idv.tw/wordpress/?p=1096#comments</comments>
		<pubDate>Thu, 05 Jan 2023 14:37:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[dos]]></category>

		<guid isPermaLink="false">http://ui.idv.tw/wordpress/?p=1096</guid>
		<description><![CDATA[set /a : 在set後面加上 /a ，就可以進行運算相對應的符號有 + 加號，- 減號， / 除號， * 乘號 , %% 為除完後的餘數 set /p : 讓使用者自行填入變數 ex: set /p x=請填入生日: echo %x% SET擴充的功能 整個變數要用 %% (或! !) 包起來 : &#8212;&#8212;&#8212; : 號是分隔線，在這之後就是取代的搜索和取代文字 find &#8212;&#8212; 變數內要備取代的文字 replace &#8230; <a href="https://ui.idv.tw/wordpress/?p=1096">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>set /a</strong> : 在set後面加上 /a ，就可以進行運算相對應的符號有 + 加號，- 減號， / 除號， * 乘號  , %% 為除完後的餘數<br />
<strong>set /p</strong> : 讓使用者自行填入變數<br />
                                        ex: set /p x=請填入生日:  echo %x%<br />
<strong>SET擴充的功能</strong><br />
整個變數要用 %% (或! !) 包起來<br />
 : &#8212;&#8212;&#8212;  : 號是分隔線，在這之後就是取代的搜索和取代文字<br />
find &#8212;&#8212; 變數內要備取代的文字<br />
replace &#8212; 當被find找到的文字會被replace所設定的文字取代</p>
<p><strong>取得子字串</strong><br />
可以把變數的文字切一小塊出來<br />
ex:<br />
%變數:~A,B%<br />
set x=Don`t Do that<br />
echo %x:~3,6%<br />
輸出:<br />
`t Do</p>
<p>在For或If內使用set /a，最好是把運算的部分用 "" 包起來<br />
因為set後面的 ) 符號會影響IF的 ( 符號<br />
ex:<br />
If x = x (<br />
set /a "x=3*(2+2)"<br />
)</p>
<p><strong>實用的內建變數</strong><br />
批次檔<br />
大部分使用Dos指令都是使用批次檔，當執行批次檔時會有內建的變數</p>
<p>%~X  &#8212;  X是0到9，0代表這個批次檔，1到9是後面加的參數</p>
<p>echo %~0   //可能會是 c:\test_dir\test.bat，端看批次檔的位置<br />
test.bat aaa.txt</p>
<p>echo 批次檔 : %~0，第一個參數 : %~1<br />
輸出 : 批次檔 : c:\test_dir\test.bat，第一個參數 : c:\test_dir\aaa.txt</p>
<p>其中這個%~X功能前面可以增加參數<br />
%~X         &#8211; 顯示參數 X 檔案的完整路徑+檔名+副檔名<br />
%~fX        &#8211; 功能同上<br />
%~dX        &#8211; 顯示參數 X 檔案的磁碟機代號<br />
%~pX        &#8211; 顯示參數 X 檔案的路徑<br />
%~nX        &#8211; 顯示參數 X 檔案的檔名<br />
%~xX        &#8211; 顯示參數 X 檔案的副檔名<br />
%~sX        &#8211; 功能類似%~fX，但檔名是短檔名<br />
%~aX        &#8211; 顯示參數 X 檔案的檔案屬性<br />
%~tX        &#8211; 顯示參數 X 檔案的日期/時間<br />
%~zX        &#8211; 顯示參數 X 檔案的檔案大小</p>
<p>這些參數可以複合使用，如<br />
%~dp0  顯示批此檔的完整路徑，但不包含檔名(常用)<br />
%~nx0  顯示批次檔的檔名+副檔名</p>
<p><strong>環境變數</strong><br />
%date%  顯示日期，星期的部分會依照windows設定的語言而改變<br />
%time% 顯示時間，上下午的部分會依照windows設定的語言而改變<br />
%CD%  顯示執行目錄，<br />
%CMDCMDLINE%  執行這個檔案的原執行程式，一般是CMD.exe<br />
%RANDOM%  0到32767之間的亂數</p>
]]></content:encoded>
			<wfw:commentRss>https://ui.idv.tw/wordpress/?feed=rss2&#038;p=1096</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
