upd
老掉牙的玩意,powershell是windows下更好的腳本語言
建議右轉powershell
說明
用來提高工作效率
cmd里面help findstr
啥用法都出來了
常用的命令
:: 我是注釋
exitst 檢查文件,符號是否存在,注意空字符串判斷不存在
defined 檢查變量是否定義
find、findstr 文本搜索命令
cd cd不能直接切換到某個位置,用pushd即可
pushd
popd
exit 退出腳本
more 顯示模式
sort
call 本窗口調用
start 新開窗口調用
md mkdir 新建文件夾
echo=>1.txt 新建文件
echo. 輸出換行
dir 顯示所有文件
dir /b 純文件名
ren 1.txt 2.txt 改名字
for %%i in (...) do ( //空格必須打,否則解析失敗
...
)
系統常識
批處理對命令格式很敏感,比如多一個空格少一個空格都影響很大
當你學習的時候,發現一模一樣的批處理命令運行不了,一般就是細節不會,比如
in(*.*)不合法
in (*.*)合法
延遲擴展
執行完一條語句,才對變量重新賦值
@echo off
set a=4
set a=5&echo %a% // 這里輸出 4,因為運行到這條語句時,a采用上一條語句運行完的值
pause
關閉延遲
@echo off
setlocal enabledelayedexpansion // 寫上該語句
set a=4
set a=5&echo !a! // 同時,采用 !a! ,%a%保持延遲
pause
強化實踐,輸出1 2 3 4 5
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!)
pause
@echo off // 這樣也可以,因為for中的i是不延遲的
for /l %%i in (1,1,5) do (
echo %%i)
pause
關系運算符,不區分大小寫
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
%0 代表批處理文件的路徑
%1 ~ %9 傳遞進來的1-9個參數 // call指令可以調用別的批處理並傳遞參數
echo. 換行
echo %PATH% 輸出環境變量
echo %DATE%
echo %RANDOM% 輸出一個隨機數
echo %TIME%
echo %num%
set /p num=input a number:
ERRORLEVEL 調用完命令后可以通過ERRORLEVEL拿到返回值、錯誤碼
REM 我是注釋
con 屏幕
nul 空設備
prn 打印機
>> 產生的內容將追加進文件中
> 則將原文件內容覆蓋
< 輸入重定向
<<代表當前標准輸入來自命令行的一對分隔號的中間內容
& 順序執行多條命令,而不管命令是否執行成功
&& 順序執行多條命令,當碰到執行出錯的命令后將不執行后面的命令
|| 順序執行多條命令,當碰到執行正確的命令后將不執行后面的命令(即:只有前面命令執行錯誤時才執行后面命令)
| 管道命令 前一個命令的執行結果輸出到后一個命令 如:help|more
字符串操作
正則表達式
. 通配符: 任何字符
* 重復: 以前字符或類出現零或零以上次數
^ 行位置: 行的開始
$ 行位置: 行的終點
[class] 字符類: 任何在字符集中的字符
[^class] 補字符類: 任何不在字符集中的字符
[x-y] 范圍: 在指定范圍內的任何字符
\x Escape: 元字符 x 的文字用法
\<xyz 字位置: 字的開始
xyz\> 字位置: 字的結束
基本的字符串操作
截取
@echo off
// echo %str:~pos,len%
set str=abcdefg123456789
echo %str%
echo %str:~3,1%
echo %str:~,-5%
pause
字符串替換
@echo off
set str=hello,mzb,mzb,aaaaa
echo %str%
echo %str:aa=bb%
pause
拼接
@echo off
set str=hello
set mzb=mzb
echo %str%,%mzb%
pause
其他命令
findstr
strlen 莫得庫函數,得自己實現
@echo off
set /p str=Input:
if not defined str goto :eof
set num=0
:label
set /a num+=1
set str=%str:~,-1%
if defined str goto :label
echo %num%
pause
既定
if
goto end
:end
goto :eof
直接退出
用戶選擇 + if
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errotlevel 1 goto defrag
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
pause
普通if
@echo off
set a="123.txt"
if exist %a% (
echo file exist
) else (
echo file not found
)
pause
for
注意for (str)的時候,會按空格或者,分割字符串然后執行
@echo off
for %%c in (*.bat,*.txt) do (type %%c)
pause
for /D %%i in (*) do echo %%i 顯示文件夾
for /L %%i in (1,1,100) do echo %%i 范圍for
for /R %%i in ([路徑]) do echo %%i 枚舉路徑下的所有文件夾
for /F
是用來處理文本的,所以花樣比較多
指定分割符
for /f "delims=.," %%i in (test.txt) do echo %%i 按'.'或者','切割字符串
for /f 簡單來說,默認每行按分隔符分割成一個,單詞數組(下標從1開始),然后默認返回每行第1個單詞
定點提取
for /f "tokens=3" %%i in (123.txt) do echo %%i 輸出每行第3個單詞
tokens=2,3
tokens=2-3,5
tokens=2,* 1丟棄,%a = 2,%b = 剩下的
for /f "tokens=3,4" %%i in (123.txt) do echo %%i %%j
%%i,%%j,%%k分別接受tokens=3,4...
for /f "tokens=3,4" %%a in (123.txt) do echo %%a %%b
%%a,%%b,%%c...按順序走就行了
跳過前n行
for /f "skip=2 tokens=2" %%i in (123.txt) do echo %%i 跳過前n行
過濾以;開頭的行
for /f "eol=; tokens=1" %%i in (123.txt) do echo %%i
處理"123 123.txt"無法識別的問題
for /f "usebackq" %%i in ("test 1.txt") do echo %%i