windows的set命令使用簡介
windows的set命令使用簡介
本部落格(http://blog.csdn.net/livelylittlefish)貼出作 者(三二一@小魚)相關研究、學習內容所做的筆記,歡迎廣大朋友指正!
windows的set命令使用簡介
作用:顯示、設定或刪除 cmd.exe 環境變數。
格式:
SET [variable=[string]]
variable 指定環境變數名。
string 指定要指派給變數的一系列字串。
要求:SET命令不允許變數名含有等號。
1. 顯示當前環境變數及其值
格式:set (不帶引數)
如:
C:/Users/yuzubo>set
ACE_ROOT=F:/opensource/ACE-5.6.4/ACE_wrappers
...
OS=Windows_NT
Path=C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/Program File
s/Common Files/Thunder Network/KanKan/Codecs;C:/Program Files/Microsoft SQL Server/90/Tools/binn/;D:/Program Files/Micro
soft Visual Studio/Common/Tools/WinNT;D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin;D:/Program Files/Micro
soft Visual Studio/Common/Tools;D:/Program Files/Microsoft Visual Studio/VC98/bin;D:/Program Files/UltraEdit/;D:/Program
Files/UltraCompare;F:/opensource/ACE-5.6.4/ACE_wrappers/lib;D:/Program Files/UltraCompare/
...
VBOX_INSTALL_PATH=D:/Program Files/VirtualBox/
VS100COMNTOOLS=D:/Program Files/Microsoft Visual Studio 10.0/Common7/Tools/
VS80COMNTOOLS=D:/Program Files/Microsoft Visual Studio 8/Common7/Tools/
VS90COMNTOOLS=D:/Program Files/Microsoft Visual Studio 9/Common7/Tools/
windir=C:/Windows
2. 顯示以str打頭的環境變數及其值
格式:set str
如:
C:/Users/yuzubo>set ACE ACE_ROOT=F:/opensource/ACE-5.6.4/ACE_wrappers
C:/Users/yuzubo>set boost BOOST_1_43_ROOT=F:/opensource/boost_1_43_0 |
如果在當前環境中找不到該變數名稱,SET命令將把ERRORLEVEL設定成1。如:
C:/Users/yuzubo>echo %ERRORLEVEL%
0
C:/Users/yuzubo>set abcd
環境變數 abcd 沒有定義
C:/Users/yuzubo>echo %errorlevel%
1
如果只是現實其值,使用echo命令即可。例如:
C:/Users/yuzubo>echo %ACE_ROOT%
F:/opensource/ACE-5.6.4/ACE_wrappers
3. 設定/修改環境變數
格式:set variable=string
如:
//設定
C:/Users/yuzubo>set abcd=aaaaaaaa
C:/Users/yuzubo>echo %abcd%
aaaaaaaa
C:/Users/yuzubo>set abcd
abcd=aaaaaaaa
//修改
C:/Users/yuzubo>set abcd=bbbbbbbb
C:/Users/yuzubo>echo %abcd%
Bbbbbbbb
C:/Users/yuzubo>set abcd
abcd=bbbbbbbb
4. 清空環境變數
格式:set variable=
如:
//假設環境變數abcd的初始值為bbbbbbbb
C:/Users/yuzubo>echo %abcd%
bbbbbbbb
//清空
C:/Users/yuzubo>set abcd=
C:/Users/yuzubo>echo %abcd%
%abcd%
C:/Users/yuzubo>set abcd
環境變數 abcd 沒有定義
5. 命令列開關/a
格式:SET /A expression
/A 命令列開關指定等號右邊的字串為被評估的數字表達式。該表示式評估器很簡單並以遞減的優先權順序支援下列操作:
() - 分組(grouping)
! ~ - - 一元運算子(unary operators)
* / % - 算術運算子(arithmetic operators)
+ - - 算術運算子(arithmetic operators)
<< >> - 邏輯移位(logical shift)
& - 按位“與”(bitwise and)
^ - 按位“異或”(bitwise exclusive or)
| - 按位“或”(bitwise or)
= *= /= %= += -= - 賦值(assignment)
&= ^= |= <<= >>=
, - 表示式分隔符(expression separator)
如:
C:/Users/yuzubo>set /a abcd=4+6
10
C:/Users/yuzubo>set /a var=12&9
12'9' 不是內部或外部命令,也不是可執行的程式
或批處理檔案。
C:/Users/yuzubo>set /a var="12&9"
8
C:/Users/yuzubo>echo %var%
8
C:/Users/yuzubo>set /a var=18%5
3
C:/Users/yuzubo>set /a var="18%5"
3
貌似邏輯操作符需要用雙引號(不能使用單引號)。
6. 命令列開關/p
格式:SET /P variable=[promptString]
/P 命令列開關允許將變數數值設成使用者輸入的一行輸入。讀取輸入行之前,顯示指定的 promptString。promptString 可以是空的。
如:
//promptString為空
C:/Users/yuzubo>set /p var=
ssssss
C:/Users/yuzubo>set var
var=ssssss
C:/Users/yuzubo>echo %var%
ssssss
//promptString不為空
C:/Users/yuzubo>set /p var=please input the value:
please input the value:cccccccccc //在此提示輸入
C:/Users/yuzubo>set var
var=cccccccccc
C:/Users/yuzubo>echo %var%
cccccccccc
7. 環境變數擴充套件
(1) 替換
格式:%PATH:str1=str2%
會擴充套件PATH環境變數,用"str2"代替擴充套件結果中的每個"str1"。要有效地從擴充套件結果中刪除所有的"str1","str2"可以是空的。"str1" 可以以星號打頭;在這種情況下,"str1"會從擴充套件結果的開始到str1剩餘部分第一次出現的地方,都一直保持相配。
(2) 提取子字串1
格式:%PATH:~10,5%
會擴充套件PATH環境變數,然後只使用在擴充套件結果中從第11個(偏移量10)字元開始的五個字元。如果沒有指定長度,則採用預設值,即變數數值的餘數。如果兩個數字(偏移量和長度)都是負數,使用的數字則是環境變數數值長度加上指定的偏移量或長度。
(3) 提取子字串2
格式:%PATH:~-10%
會提取PATH變數的最後十個字元。
(4) 提取子字串3
格式:%PATH:~0,-2%
會提取PATH變數的所有字元,除了最後兩個。
如:
//設定
C:/Users/yuzubo>set mystring=abcdefgabcdefg
C:/Users/yuzubo>echo %mystring%
abcdefgabcdefg
//替換cde為hhh
C:/Users/yuzubo>echo %mystring:cde=hhh%
abhhhfgabhhhfg
C:/Users/yuzubo>echo %mystring%
abcdefgabcdefg
//取從第6個字元開始的3個字元
C:/Users/yuzubo>echo %mystring:~5,3%
fga
//取最後4個字元
C:/Users/yuzubo>echo %mystring:~-4%
defg
//取所以字元,除了最後4個(與上一個命令恰好相反)
C:/Users/yuzubo>echo %mystring:~0,-4%
abcdefgabc
8. 動態環境變數
如果命令擴充套件被啟用,有幾個動態環境變數可以被擴充套件,但不會出現在SET顯示的變數列表中。每次變數數值被擴充套件時,這些變數數值都會被動態計算。如果使用者用這些名稱中任何一個定義變數,那個定義會替代下面描述的動態定義。
%CD% - 擴充套件到當前目錄字串。
%DATE% - 用跟 DATE 命令同樣的格式擴充套件到當前日期。
%TIME% - 用跟 TIME 命令同樣的格式擴充套件到當前時間。
%RANDOM% - 擴充套件到 0 和 32767 之間的任意十進位制數字。
%ERRORLEVEL% - 擴充套件到當前 ERRORLEVEL 數值。
%CMDEXTVERSION% - 擴充套件到當前命令處理器擴充套件版本號。
%CMDCMDLINE% - 擴充套件到呼叫命令處理器的原始命令列。
如:
C:/Users/yuzubo>echo %cd%
C:/Users/yuzubo
C:/Users/yuzubo>echo %date%
2010/11/26 週五
C:/Users/yuzubo>echo %time%
23:40:35.62
C:/Users/yuzubo>echo %time%
23:40:41.71
C:/Users/yuzubo>echo %random%
18528
C:/Users/yuzubo>echo %random%
2589
C:/Users/yuzubo>echo %cmdcmdline%
"C:/Windows/system32/cmd.exe"
9. 再深入一點
(1) 這些環境變數在哪裡?
windows系統最大的特點就是將絕大多數系統配置資訊儲存在自己的資料庫中,這個資料庫就是登錄檔。
整個系統都有效的環境變數在登錄檔中的位置:
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment
對當前使用者有效的環境變數在登錄檔中的位置:
HKEY_CURRENT_USER/Environment
(2) 值得注意的事:環境變數的生效
修改環境變數的方法:
方法 |
步驟 |
是否立即生效 |
命令列 |
set命令 |
否 |
指令碼 |
|
否 |
修改登錄檔 |
如(1) |
否 |
設定系統屬性 |
系統->屬性->高階->環境變數 |
是 |
當然,如果寫程式,先修改登錄檔,在呼叫win32 API,傳送一個訊息來更新系統的變數,也可以使之生效,在此不多敘述,只列出呼叫API的方法:
//傳送一個廣播訊息,等待各自迴應後,立即生效。
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,LPARAM("Environment"), SMTO_ABORTIFHUNG, 5000, &MsgResult);
Reference
set/?
註釋:
在設計一個軟體時,若我們把該軟體(原始碼)上的一些變數的取值放在登錄檔(windows作業系統)上設定【即在登錄檔上有一個與該變數相同名字的變數】的話,則稱該形式取值的變數為環境變數。
環境變數讀取其值的過程如下:
作業系統在記憶體有一塊記憶體區域是存放這些環境變數的值,環境變數只要在該記憶體區域上找到同名的變數讀取其值即可給自己賦值了。set命令所作用的範圍就是這塊記憶體區域。不帶引數的set是顯示在該記憶體區域上所有與環境變數同名的變數的值。而通過set設定的值,如set ad=tt形式,其有效期只是在執行該set命令的程序對應的會話期間,即臨時性的,還有ad這個變數名是你可以隨意設定的,無論在作業系統內有否哪個環境變數與之同名。 如果在該記憶體區域上找不到同名的變數, 才會去磁碟上的登錄檔檔案上查詢與該環境變數相同名字的變數並讀取其值到這塊記憶體區域上。當然,在登錄檔上,假如在本文下一節所說的兩個位置裡都有同名的變數,則會優先讀取第一個位置裡變數的值,即在應用程式安裝時本軟體寫入在登錄檔裡的位置那個變數。這個位置沒有存在該同名變數,才會讀取第二個位置裡變數的值,即在“系統屬性”-》“高階”-》“環境變數”這個介面對應在登錄檔裡的位置內的那個變數。
註釋:
在登錄檔上,對一個變數的描述分三個部分:變數名,變數型別,變數值。其實,無論變數是那種型別,記錄在在登錄檔上都是以字串型別來分別記錄一個變數的三個資訊:變數名,變數型別,變數值。
格式:
SET [variable=[string]]
variable 指定環境變數名。
string 指定要指派給變數的一系列字串。
從set的語法裡的string也可看出記錄在在登錄檔上都是以字串型別來分別記錄一個變數的三個資訊:變數名,變數型別,變數值。
參考:windows set命令 百度