window的dos命令學習筆記 六

一、dos歷史學習筆記(後期整合到這裏,我想能學到這裏的應該不多了,嘿嘿,加油)

這個是我所以的dos學習筆記,希望對感興趣的你有所幫助,如有錯誤,還望不吝賜教。如果對你有幫助,希望給我點個贊哈,Thanks♪(・ω・)ノ

學習主要還是靠堅持,如果真的覺得學一個知識,就堅持下去;三天打魚倆天曬網,真的不如躺着歇,刷刷劇,或者玩倆局遊戲。。。

window的dos命令學習筆記 一

window的dos命令學習筆記 二

window的dos命令學習筆記 三

window的dos命令學習筆記 四

window的dos命令學習筆記 五

window的dos命令學習筆記 六

window的dos命令學習筆記 七

window的dos命令學習筆記 八— bat文件打包成exe程序(實現腳本加密)

window的dos命令學習筆記 九— bat使用小工具

二、dos變量的擴展學習

1、系統變量

批處理的一些變量是由操作系統事先定義好的,可以適用於任何批處理,我們稱這些特殊的變量爲“系統變量”。系統變量有很多個,包括硬件類、操作系統類、文件路徑類、系統時間類等。

要查看所有的系統變量,請新打開一個cmd窗口,輸入set回車即可。
查看當前window系統的變量。

set

返回的除了path佔的多,其他都是=前面的環境變量的名稱,後面是變量的,可以理解前面就是key後面是value。電腦裏面固定的。
如果批處理中需要使用某個變量,可以使用%變量名%進行使用。
比如:
在這裏插入圖片描述

對幾個比較常用的變量解釋如下:

%ALLUSERSPROFILE% 本地 返回“所有用戶”配置文件的位置。
%APPDATA% 本地 返回默認情況下應用程序存儲數據的位置。
%CD% 本地 返回當前目錄字符串。
%CMDCMDLINE% 本地 返回用來啓動當前的 Cmd.exe 的準確命令行。
%CMDEXTVERSION% 系統 返回當前的“命令處理程序擴展”的版本號。
%COMPUTERNAME% 系統 返回計算機的名稱。
%COMSPEC% 系統 返回命令行解釋器可執行程序的準確路徑。
%DATE% 系統 返回當前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關 date 命令的詳細信息,請參閱 Date。
%ERRORLEVEL% 系統 返回上一條命令的錯誤代碼。通常用非零值表示錯誤。
%HOMEDRIVE% 系統 返回連接到用戶主目錄的本地工作站驅動器號。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%HOMEPATH% 系統 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%HOMESHARE% 系統 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%LOGONSERVER% 本地 返回驗證當前登錄會話的域控制器的名稱。
%NUMBER_OF_PROCESSORS% 系統 指定安裝在計算機上的處理器的數目。
%OS% 系統 返回操作系統名稱。Windows 2000 顯示其操作系統爲 Windows_NT。
%PATH% 系統 指定可執行文件的搜索路徑。
%PATHEXT% 系統 返回操作系統認爲可執行的文件擴展名的列表。
%PROCESSOR_ARCHITECTURE% 系統 返回處理器的芯片體系結構。值:x86 或 IA64基於Itanium
%PROCESSOR_IDENTFIER% 系統 返回處理器說明。
%PROCESSOR_LEVEL% 系統 返回計算機上安裝的處理器的型號。
%PROCESSOR_REVISION% 系統 返回處理器的版本號。
%PROMPT% 本地 返回當前解釋程序的命令提示符設置。由 Cmd.exe 生成。
%RANDOM% 系統 返回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系統 返回包含 Windows server operating system 根目錄(即系統根目錄)的驅動器。
%SYSTEMROOT% 系統 返回 Windows server operating system 根目錄的位置。
%TEMP% 和 %TMP% 系統和用戶 返回對當前登錄用戶可用的應用程序所使用的默認臨時目錄。有些應用程序需要 TEMP,而其他應用程序則需要 TMP。
%TIME% 系統 返回當前時間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關 time 命令的詳細信息,請參閱 Time。
%USERDOMAIN% 本地 返回包含用戶帳戶的域的名稱。
%USERNAME% 本地 返回當前登錄的用戶的名稱。
%USERPROFILE% 本地 返回當前用戶的配置文件的位置。
%WINDIR% 系統 返回操作系統目錄的位置。

2、用戶變量

編寫批處理程序時,用戶根據需要自己定義的變量稱之爲用戶變量。用戶變量類似於C語言裏面的變量,僅僅在定義該變量的程序中有效。
用戶變量由set命令定義,這是批處理中非常非常重要的一個操作,從而使set命令成爲批處理裏面使用頻率最高的幾個命令之一。

比如:

set aa=123

這裏的aa就可以成爲用戶變量。也可以理解爲除了系統變量剩下的都是用戶變量。

3、變量引用

前面的學習筆記裏面,我們已經看到了如何引用變量,即直接用變量名操作變量,通過"%“或”!“來獲取變量的值。其中,只有在for語句裏面重複對同一變量多次賦值時才需要使用"!",並且在使用”!“調用變量時,要首先“啓用延遲環境變量擴充”,啓動命令爲:SetLocal EnableDelayedExpansion另外需要說明的是,“啓用延遲環境變量擴充”後,所有的”!“都將被視爲“取變量值”的特殊符號,即使用”^!“也不能輸出符號”!"。若要輸出"!",則需要“停用延遲環境變量擴充”,
命令爲:SetLocal DisableDelayedExpansion

提到這裏使用!來替代%進行變量賦值的時候,有沒有想到我們前面學習筆記裏,學習for的用法的時候,需要使用!來代替的。

這裏既然替代我就再帶着一起鞏固一下。

比如第一種:(可不要完全複製,要改地址:e:\000dos)

@echo off
setlocal enabledelayedexpansion
FOR /R e:\000dos  %%i IN (*.*) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
SetLocal DisableDelayedExpansion
pause
exit

執行效果:
這個都是我dos學習時的筆記文件。

在這裏插入圖片描述

如果我們不替換,看看是什麼效果:

@echo off
::setlocal enabledelayedexpansion
FOR /R e:\000dos  %%i IN (*.*) DO (
set aa=%%i
echo %aa%
)
::SetLocal DisableDelayedExpansion
pause
exit

不知道爲什麼結果是這樣,然後我就好奇,尋找是不是替換之前就有問題吶?
在這裏插入圖片描述

第三個代碼:

@echo off
::setlocal enabledelayedexpansion
FOR /R e:\000dos  %%i IN (*.*) DO (
echo %%i
)
::SetLocal DisableDelayedExpansion
pause
exit

在這裏插入圖片描述
可以看出,第三個代碼和第二個代碼的區別,就是中間沒有了一個賦值,肯定賦值的地方出了問題。

至此我們就應該理解下面這句話了:
其中,只有在for語句裏面重複對同一變量多次賦值時才需要使用"!",並且在使用"!"調用變量時,要首先“啓用延遲環境變量擴充”,啓動命令爲:SetLocal EnableDelayedExpansion

其實這個地方就是需要使用

setlocal enabledelayedexpansion
中間可以加入for循環邏輯語句。
SetLocal DisableDelayedExpansion

需要理解點:

  1. setlocal enabledelayedexpansion是爲了!替換%生效,不然報錯。
  2. for語句中的變量前面不加!不能多次對一個變量多次賦值,當然goto除外,因爲之前我們使用goto的時候,是可以多次賦值的。(這個賦值應該只限於for語句中吧,這個屬於小編猜測,具體還不確定)
  3. %%i 不知道for語句中你們看到上面代碼有沒有疑惑,不是應該是%i麼?其實我之前也有這個疑問,剛剛又看到,加上昨天學習了轉義,我感覺就是因爲轉義的問題。

4、變量的直接傳遞

直接傳遞參數,即在使用call命令時,不使用任何參數,在子函數或子批處理裏面直接對主函數(也稱父批處理)裏面的變量進行修改。就相當於python的函數中加入global,然後都外部的變量進行修改,最後函數執行完畢影響外部的變量。

直接傳遞參數舉例:

@echo off
setlocal enabledelayedexpansion
set var=aCdehiM,?mnrstW y
echo %var%
call :deal
setlocal disabledelayedexpansion
set var=%var:?=!%
echo %var%
pause>nul
exit


:deal
set tm=!var!
set var=
for %%i in (6,3,11,11,16,15,1,4,11,5,12,13,9,0,12,7,15,14,5,10,2,16,18,8) do (
set var=!var!!tm:~%%i,1!
)
goto :eof

上面的代碼涉及到函數,變量的多次賦值,可以發現,當我們把變量var作爲參數賦予子函數:deal後,子函數對var的值進行了修改;當子函數返回後,主函數裏面的var的值就已經是子函數裏面var被修改後的值了。
函數執行完畢後,又可以對變量var進行一個字符串的替換操作。

在這裏插入圖片描述

5、變量的間接傳遞

間接傳遞參數,即在使用call命令時,在其後面添加參數,形如call {[:label][ChildBatch]} Parameter1 Parameter2 ... ParameterN。這跟python或者其他語言裏面傳遞參數的格式類似。不同於python語言,批處理中的子函數不需要定義形參,更不需要指定參數的個數。傳遞過來的參數,在子函數或子批處理裏面是以%1~%9的形式表示的,即%1~%9分別表示傳遞過來的第1~9個參數。%*代表除了%0%0是當前執行的bat腳本文件地址)的所有參數。

例子:

@echo off
call :deal aaa bbb "c c" ddd eee
pause>nul
exit


:deal
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5

在這裏插入圖片描述
通過這個例子就可以清晰的看到%n參數表示法的用法。參數列表中包含空格的依舊要用雙引號(")引起來;另外,也可以看到,%0已經變成了子函數的標號了,而不是父批處理的文件名全稱。

三、for小總結(感覺之前的一個筆記學習的有點模糊,再仔細學習學習for命令)

既然上面又提到for語句了,我這裏想對for做些總結,也算是複習鞏固一下吧。

1)、bat文件中需要轉義)for語句的bat腳本中%%i

在這裏插入圖片描述

從上面的例子中,可以發現,在cmd環境中執行for循環目錄時,只能用單個%來代表。

但是在bat文件中必須要用%%i 來表示cmd中的%i,我感覺就是因爲轉義的問題,昨天的學習筆記中,我們學習了轉義問題,發現除了%%轉義成%,這一個特殊外,其餘在bat文件中都需要使用^來轉義後面的字符。

2)、循環目錄 /d 參數:

語法格式:

FOR /D  %i IN (參數) DO  @echo %i

/d參數的意思我現在才更懂了一點,學習就是這樣嘛,慢慢的學,不能一下子學到什麼都理解的樣子(除非倆種可能:①你是天才,這方面有天賦;②是你學的知識本來就簡單,很多人一看也懂

/d在for循環中,就遍歷當面目錄或者指定目錄下,循環匹配到的文件夾,不匹配文件。
其實上面語法中的參數有一下幾種:

①. 指定的目錄:

E:\000dos>FOR /D  %i IN (e:\000dos\*) DO  @echo %i
e:\000dos\1筆記一
e:\000dos\2筆記二
e:\000dos\3筆記三
e:\000dos\4筆記四
e:\000dos\5筆記五
e:\000dos\6筆記六

其中這裏的*代表所有字符,長度不限。
順便把也講解一下吧,一個問號代表一個任意字符,

E:\000dos>FOR /D  %i IN (e:\000dos\1???) DO  @echo %i
e:\000dos\1筆記一

代碼中我的三個???就是代表匹配到的筆記一三個字符。

②、* 號表示:

E:\000dos>FOR /D  %i IN (*) DO  @echo %i
1筆記一
2筆記二
3筆記三
4筆記四
5筆記五
6筆記六

這裏執行之後會把當前的所有目錄匹配到,位置是當前執行的目錄。
比如:

E:\000dos\4筆記四>FOR /D  %i IN (*) DO  @echo %i
demo1

③、?表示

新建三個文件夾
在這裏插入圖片描述
測試代碼:

E:\000dos>FOR /D  %i IN (????) DO  @echo %i
1筆記一
2筆記二
3筆記三
4筆記四
5筆記五
6筆記六

E:\000dos>FOR /D  %i IN (??????????) DO  @echo %i
12demo
13demo
14demo
1筆記一
2筆記二
3筆記三
4筆記四
5筆記五
6筆記六

從上面的號的數量可以看出,匹配到的文件夾名稱的字符長度可以比的長度少,但是不能多。

④、字符+*+表示:

測試代碼:

E:\000dos>FOR /D  %i IN (13*) DO  @echo %i
13demo

E:\000dos>FOR /D  %i IN (1?demo) DO  @echo %i
12demo
13demo
14demo

3)、匹配一個目錄下文件(不匹配目錄,不進入子目錄匹配)

看了上面的這個,只是匹配當前的地址下的文件夾,卻不能匹配文件,如何匹配一個目錄下文件吶,也不進入子目錄?

其實也簡單,不帶參數就好了,自己寫幾個代碼測試測試就懂了:

下面倆個代碼時我測試可以匹配當前目錄的所有文件,如果需要一些條件篩選匹配,自己根據上面的*?字符靈活使用進行匹配吧。

E:\000dos>FOR  %i IN (*.*) DO  @echo %i
cd_help.txt
del_help.txt
for1.txt
for_help.txt
name.txt
start_help.txt
保留命令幫助文檔.bat
當前目錄打開cmd.bat

E:\000dos>FOR  %i IN (*) DO  @echo %i
cd_help.txt
del_help.txt
for1.txt
for_help.txt
name.txt
start_help.txt
保留命令幫助文檔.bat
當前目錄打開cmd.bat

4)、循環目錄樹/r

語法結構:

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

其實這個/r 參數就是進入當前目錄或者給定目錄的目錄樹(子目錄也進入匹配)。

①、匹配目錄樹的文件**.*

經過測試發現,**.*都是匹配目錄樹的文件的,如果需要固定名稱,可以自己根據需要結合:*?字符靈活使用進行匹配。

E:\000dos>FOR /r  %i IN (*) DO  @echo %i
E:\000dos\cd_help.txt
E:\000dos\del_help.txt
E:\000dos\for1.txt
E:\000dos\for_help.txt
E:\000dos\name.txt
E:\000dos\start_help.txt
E:\000dos\保留命令幫助文檔.bat
E:\000dos\當前目錄打開cmd.bat
E:\000dos\1筆記一\10set.bat
E:\000dos\1筆記一\1hello.bat

這裏我只複製了前面幾個結果,看懂就行了。

E:\000dos>FOR /r  %i IN (*.*) DO  @echo %i
E:\000dos\cd_help.txt
E:\000dos\del_help.txt
E:\000dos\for1.txt
E:\000dos\for_help.txt
E:\000dos\name.txt
E:\000dos\start_help.txt
E:\000dos\保留命令幫助文檔.bat

②、匹配目錄樹的文件夾.

經過測試發現,在/r目錄樹下,.就代表匹配目錄(文件夾)

E:\000dos>FOR /r  %i IN (.) DO  @echo %i
E:\000dos\.
E:\000dos\12demo\.
E:\000dos\13demo\.
E:\000dos\14demo\.
E:\000dos\1筆記一\.
E:\000dos\1筆記一\444\.
E:\000dos\1筆記一\444\111\.
E:\000dos\2筆記二\.
E:\000dos\3筆記三\.
E:\000dos\4筆記四\.
E:\000dos\4筆記四\demo1\.
E:\000dos\4筆記四\demo1\deep2\.
E:\000dos\5筆記五\.
E:\000dos\6筆記六\.

③、指定目錄:

把需要匹配的目錄放在參數/r後面即可。
示例代碼:

E:\000dos>FOR /r E:\000dos\4筆記四  %i IN (.) DO  @echo %i
E:\000dos\4筆記四\.
E:\000dos\4筆記四\demo1\.
E:\000dos\4筆記四\demo1\deep2\.

5)、參數/L(就是相當於python的rang()功能)

這個地方比較好理解,和其他語言的用法類似。

FOR /L %%variable IN (start,step,end) DO command

1、其中,start爲開始計數的初始值,step爲每次遞增的值,end爲結束值。當end小於start時,step需要設置爲負數。
2、該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5)將產生序列 1 2 3 4 5,(5,-1,1)將產生序列(5 4 3 2 1)

打印出10以內的奇數:

E:\000dos>echo off
for /l %i in (1,2,10) do echo %i
1
3
5
7
9

6)、參數/f(可以匹配文件每行的每一列)

FOR /F ["options"] %%variable IN (set) DO command

其中,set爲(“string”、‘command’、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組合。各選項的意義參見for /f。一般情況下,使用較多的是skip、tokens、delims三個選項。

  1. 用 /f 參數將文本文件內容作爲循環範圍
  2. 用 /f 參數將某一命令執行結果作爲循環範圍(其實命名結果也可以理解爲文本內容,都是字符串)

①、將文本文件內容作爲循環範圍

新建一個demo1.txt文件,查看內容:

e:\000dos\6筆記六>type demo1.txt
2019/12/19  16:31    <DIR>          .
2019/12/19  16:31    <DIR>          ..
2019/12/19  16:27               173 1!.bat
2019/12/19  16:33               157 2.bat
2019/12/19  16:21               152 3.bat
2019/12/19  16:35               143 4.bat
               4 個文件            625 字節
               2 個目錄 35,105,640,448 可用字節

讀取每一行tokens=*

options爲"tokens=*"時表示讀取每一行

e:\000dos\6筆記六>for /f "tokens=*"  %i in (demo1.txt) do @echo %i
2019/12/19  16:31    <DIR>          .
2019/12/19  16:31    <DIR>          ..
2019/12/19  16:27               173 1!.bat
2019/12/19  16:33               157 2.bat
2019/12/19  16:21               152 3.bat
2019/12/19  16:35               143 4.bat
4 個文件            625 字節
2 個目錄 35,105,640,448 可用字節

讀取每行的第一列tokens=1

options爲"tokens=1"或者不寫參數時表示讀取每一行的第一列,默認情況下,分隔符爲空格和製表符(tab鍵)

e:\000dos\6筆記六>for /f "tokens=1"  %i in (demo1.txt) do @echo %i
2019/12/19
2019/12/19
2019/12/19
2019/12/19
2019/12/19
2019/12/19
4
2

e:\000dos\6筆記六>for /f %i in (demo1.txt) do @echo %i
2019/12/19
2019/12/19
2019/12/19
2019/12/19
2019/12/19
2019/12/19
4
2

跳過第二行,讀取每一行skip=2

options爲"skip=2 tokens=*" 表示跳過前2行,讀取之後的每一行。

e:\000dos\6筆記六>for /f "skip=2 tokens=*" %i in (demo1.txt) do @echo %i
2019/12/19  16:27               173 1!.bat
2019/12/19  16:33               157 2.bat
2019/12/19  16:21               152 3.bat
2019/12/19  16:35               143 4.bat
4 個文件            625 字節
2 個目錄 35,105,640,448 可用字節

如果"skip=2 tokens=3"則表示跳過前2行,讀取後面的每行的第三列。

e:\000dos\6筆記六>for /f "skip=2 tokens=3" %i in (demo1.txt) do @echo %i
173
157
152
143
625
35,105,640,448

指定分割符

"skip=2 tokens=2 delims=/"代表的是跳過前倆行,分隔符爲/,讀取後面每行的第二列。

e:\000dos\6筆記六>for /f "skip=2 tokens=2 delims=/" %i in (demo1.txt) do @echo %i
12
12
12
12

7)、總結:

從上週開始學到現在,發現dos命令,最重要的有這麼幾個命令:
set、for和if。
感覺這幾個比較難掌握,只能沒事時多看多敲點代碼,多些幾個小腳本熟練熟練了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章