Windows命令行腳本編寫


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM