用指南:從文件操作到系統(tǒng)排查一次講透)
DOS 命令這個(gè)東西很多人第一反應(yīng)是“上個(gè)世紀(jì)的老古董”。但你如果有機(jī)會(huì)進(jìn)到生產(chǎn)環(huán)境、維護(hù)一臺(tái) Windows 服務(wù)器或者單純想在一堆文件里快速找點(diǎn)東西、批量改個(gè)名你很快就會(huì)知道能敲命令行的和只能點(diǎn)鼠標(biāo)的工作效率完全是兩個(gè)緯度。我這些年做過系統(tǒng)運(yùn)維、寫過批處理腳本也帶過不少新人每次帶人第一步就是強(qiáng)制他們把手從鼠標(biāo)上拿開先把我下面寫的這些命令吃透。DOS 命令在 Windows 的 CMD 里仍然是實(shí)打?qū)嵉幕A(chǔ)能力掌握它不丟人反而能救命。這篇文章從最常用的文件、目錄操作開始一路講到文本搜索、管道重定向再到批處理循環(huán)和系統(tǒng)排查命令。不管你是剛接觸 CMD 的新手還是想系統(tǒng)補(bǔ)全命令行知識(shí)的老手照著敲一遍再去看你自己的實(shí)際需求思路會(huì)很不一樣。全程全部是實(shí)操經(jīng)驗(yàn)沒有紙面廢話。1. DOS 命令的定位與理解1.1 為什么現(xiàn)在還要學(xué) DOS 命令先說一個(gè)很多人沒想明白的事實(shí)我們平時(shí)說的“DOS 命令”在今天的 Windows 里并不是真正的 MS-DOS 系統(tǒng)而是運(yùn)行在 CMD命令行解釋器里的一套命令環(huán)境。它借用了 DOS 時(shí)代留下來的語法和習(xí)慣但實(shí)際執(zhí)行文件都是 32 位或 64 位的 Windows 小工具比如dir、copy背后對(duì)應(yīng)的是cmd.exe內(nèi)置指令findstr、where則是獨(dú)立的可執(zhí)行文件。我為什么還建議你學(xué)最直接的一個(gè)原因你在圖形界面里要做三次以上的重復(fù)操作基本都可以寫成一條命令或者一個(gè)小腳本。比如要給 200 個(gè)文件統(tǒng)一加前綴資源管理器里改名到崩潰而一行for循環(huán)三秒搞定。再比如排查網(wǎng)絡(luò)故障圖形界面里點(diǎn)半天看不到完整信息CMD 里一條ipconfig /all全部列清楚。對(duì)于做運(yùn)維、做技術(shù)支持、和經(jīng)常和電腦死磕的人來說這屬于必備技能。另外一個(gè)場景是無人值守和遠(yuǎn)程管理。很多服務(wù)器為了安全根本不開圖形桌面或者你遠(yuǎn)程過去只有命令行端口能用。這時(shí)候你如果只會(huì)點(diǎn)鼠標(biāo)等于徹底失能。我面試新人時(shí)總會(huì)問一句“你怎么批量殺進(jìn)程”能說出taskkill的基本都有過實(shí)操只搜索“任務(wù)管理器里面一個(gè)個(gè)找”的我基本心里有數(shù)了。1.2 DOS 命令的執(zhí)行方式與基礎(chǔ)規(guī)則敲命令前先明確幾個(gè)最基礎(chǔ)的執(zhí)行規(guī)則很多坑都出在細(xì)節(jié)上命令大小寫不敏感Dir、DIR、dir都執(zhí)行同一個(gè)操作。文件名同樣不區(qū)分大小寫。參數(shù)使用斜杠/例如dir /w、copy /y。注意DOS 路徑用的是反斜杠\參數(shù)用的是右斜杠/兩者別混。通配符*和?*匹配任意長度字符?匹配單個(gè)字符。比如*.txt表示所有 txt 文件file?.doc表示像file1.doc、fileA.doc這樣的文件。路徑帶空格必須加雙引號(hào)如果你訪問C:\Program Files這樣的目錄直接寫路徑系統(tǒng)會(huì)拆成“C:\Program”和“Files”兩段必須寫成C:\Program Files。一條命令就是一行邏輯CMD 不像編程語言有那么多語法結(jié)構(gòu)但你可以用、、|等連接符把多個(gè)命令串起來這個(gè)后面專門講。要查看某個(gè)命令的完整參數(shù)和示例幾乎所有命令都支持/?參數(shù)。比如dir /?會(huì)全屏輸出 dir 的詳細(xì)幫助。別背參數(shù)學(xué)會(huì)問命令本身這才是高效路子。2. 文件與目錄操作的精講2.1 目錄切換與查看cd、dir 的核心用法先講cdchange directory也就是切換當(dāng)前目錄。進(jìn)入子目錄就是cd 文件夾名返回上一級(jí)是cd ..回當(dāng)前盤的根目錄是cd \。這里有個(gè)老手都會(huì)碰到的坑比如你當(dāng)前在C:\Windows\System32想直接切到D:\Tools直接敲cd D:\Tools會(huì)執(zhí)行成功但當(dāng)前盤符還是 C 盤你會(huì)發(fā)現(xiàn)提示符根本沒過過去。這是 CMD 的一個(gè)“正常現(xiàn)象”cd不帶/d參數(shù)時(shí)它只切換目錄不切盤符。想連盤符一起切必須寫成cd /d D:\Tools我敢說新人第一次遇到的“為什么命令沒反應(yīng)”十有八九是這個(gè)原因。服務(wù)器上用這條命令配合路徑跳轉(zhuǎn)非常頻繁。再看dir。它不光是“看當(dāng)前目錄有哪些文件”參數(shù)很多很有用。推薦幾個(gè)實(shí)戰(zhàn)頻率高的dir ::查看當(dāng)前目錄下的文件和子目錄 dir /w ::寬行格式顯示適合屏幕查看 dir /a ::顯示全部文件包括隱藏文件和系統(tǒng)文件 dir /s ::遞歸列出所有子目錄下的文件 dir /b ::只輸出文件名不顯示日期大小等額外信息 dir /o:d ::按日期排序顯示 dir /s /b *.log ::遞歸查找所有 log 文件只輸出路徑實(shí)際排查問題時(shí)我用得最多的是dir /s /b 文件名在全盤范圍快速定位某個(gè)文件在哪。比如你忘了某個(gè)配置文件放哪兒了直接到盤符根目錄執(zhí)行dir /s /b nginx.conf立即把完整路徑打出來。圖形界面的搜索如果索引沒建好慢到你懷疑人生CMD 反而干脆利落。2.2 新建、刪除目錄和文件時(shí)的安全邊界md即mkdir用于創(chuàng)建目錄。一個(gè)常用小技巧md a\b\c在舊版里如果父目錄不存在會(huì)報(bào)錯(cuò)但 Windows 10 之后的 CMD 里可以一次創(chuàng)建多級(jí)目錄所以別覺得必須一級(jí)一級(jí)建。刪除操作就要嚴(yán)肅對(duì)待了。rdrmdir刪目錄del刪文件。這兩個(gè)命令不像回收站刪了就是真刪了沒有后悔藥。千萬別小看這個(gè)提醒我見過太多人把rd /s /q敲錯(cuò)路徑一天白干。rd 目錄名 ::刪除空目錄 rd /s 目錄名 ::遞歸刪除該目錄及其所有子目錄、文件 rd /s /q 目錄名 ::刪除過程不再提示確認(rèn)靜默執(zhí)行 del 文件名 ::刪除文件 del *.tmp ::刪除當(dāng)前目錄下所有 tmp 文件 del /s *.bak ::同時(shí)刪除子目錄中的 bak 文件 del /q *.temp ::靜默刪除不逐一確認(rèn)這里必須說一句任何帶/s的刪除、帶/q的強(qiáng)制操作敲回車前默念三遍“路徑對(duì)不對(duì)”。我以前清理一個(gè)項(xiàng)目臨時(shí)文件本想del /s /q D:\work\temp\*.tmp結(jié)果手一快路徑寫成了D:\work萬幸沒有帶通配符系統(tǒng)問都不問就把這個(gè)目錄下的非只讀文件清了一部分教訓(xùn)慘痛。寧可多敲一次dir確認(rèn)路徑也不要盲目執(zhí)行刪除。2.3 復(fù)制與移動(dòng)copy、move、xcopy、robocopy 怎么選copy是最基礎(chǔ)的文件復(fù)制命令適合單文件或少量文件。常用參數(shù)copy 源文件 目標(biāo)位置 copy 1.txt D:\backup\ ::復(fù)制到目標(biāo)目錄文件名保持不變 copy 1.txt D:\backup\2.txt ::復(fù)制并重命名 copy /y 1.txt D:\backup\ ::目標(biāo)存在時(shí)直接覆蓋不提示 copy *.txt D:\txt\ ::批量復(fù)制當(dāng)前目錄所有 txt 文件move用來移動(dòng)文件或目錄也可以用來做“改名”。因?yàn)橐苿?dòng)的本質(zhì)就是改路徑所以move 舊文件名 新文件名相當(dāng)于重命名move 1.txt D:\backup\ ::移動(dòng)文件 move 1.txt 2.txt ::原地重命名 move D:\work\a.log D:\logs\ ::跨盤移動(dòng)真正的批量復(fù)制強(qiáng)者是xcopy和robocopy。xcopy適合處理帶子目錄的復(fù)制xcopy D:\conf\*.* E:\bak\ /s /e /y參數(shù)含義/s復(fù)制目錄結(jié)構(gòu)/e連空目錄一起復(fù)制/y覆蓋不詢問。robocopy是微軟強(qiáng)推的增強(qiáng)版專為大型文件同步設(shè)計(jì)具備斷點(diǎn)續(xù)傳、多線程復(fù)制和完整日志記錄能力。我最常用的是鏡像同步robocopy D:\source E:\backup /mir /mt/mir會(huì)把源目錄的文件樹完整鏡像到備份目錄連刪除的文件也一并同步刪除/mt表示多線程復(fù)制速度明顯更快。別擔(dān)心參數(shù)記不住執(zhí)行后它會(huì)把“復(fù)制了幾個(gè)文件、失敗幾個(gè)、跳過了幾個(gè)”列得明明白白。如果你需要定期備份我建議直接用robocopy加計(jì)劃任務(wù)比任何第三方小工具都省心。清理和維護(hù)磁盤時(shí)這些命令配合起來就是一套工作流先dir看有什么再robocopy做備份最后rd /s /q清理臨時(shí)目錄。整個(gè)過程五分鐘完成圖形界面做同樣的事情至少半小時(shí)。3. 文本查看、搜索與重定向3.1 用 type 和 more 快速查看文本文件很多人查看日志文件第一反應(yīng)是雙擊打開。但日志動(dòng)輒幾百 MB編輯器打開直接卡死。這個(gè)時(shí)候 CMD 里就能輕松查看。type命令把整個(gè)文件內(nèi)容直接輸出到屏幕type run.log type D:\my project\config.ini文件內(nèi)容太長的話屏幕會(huì)瞬間滾完你根本來不及看。這時(shí)用more分屏顯示more run.log它會(huì)一屏一屏地顯示按空格鍵翻下一頁按q鍵退出。這個(gè)命令對(duì)大文件非常友好還有兩個(gè)變通玩法type run.log | more作用等同more run.log。要看文件開頭幾十行怎么辦可以用findstr加正則也可以截取前 N 行powershell -command Get-Content run.log -TotalCount 50這算跨進(jìn)了 PowerShell 的門不過在 CMD 里調(diào)用它沒有任何限制需要時(shí)直接拿來用就行。3.2 findstr比想象中強(qiáng)大的文本搜索命令說實(shí)話findstr是我 Windows 命令行里使用率最高的命令。最開始我也覺得它只是find的替代品后來發(fā)現(xiàn)它的實(shí)用范圍完全超出預(yù)期?;居梅╢indstr error run.log在當(dāng)前文件里找包含 error 的行。多文件搜索findstr ERROR *.log遞歸搜索子目錄findstr /s timeout D:\logs\*.log忽略大小寫findstr /i error run.log顯示行號(hào)findstr /n exception app.log還支持正則表達(dá)式匹配一批類似文本。比如想找日志里的 IP 地址findstr /n /r [0-9]*\.[0-9]*\.[0-9]*\.[0-9]* access.log/r表示啟用正則模式。我用這一招排查過配置錯(cuò)誤、分析過訪問日志比人工肉眼掃快太多。還有個(gè)使用場景批量檢查多個(gè)配置文件里是否都存在某個(gè)參數(shù)。比如想知道哪些 nginx 配置里沒有加gzipfindstr /v gzip D:\nginx\conf\*.conf/v輸出不包含指定文本的行。注意它只顯示文件內(nèi)容對(duì)應(yīng)的行不會(huì)給你“哪個(gè)文件缺少”的匯總列表但把文件名和上下文打印出來你一眼就能判斷問題范圍。3.3 輸出重定向把命令結(jié)果保存下來這是命令行思維里最值得掌握的一個(gè)概念所有命令的輸出默認(rèn)進(jìn)“標(biāo)準(zhǔn)輸出”也就是屏幕。你可以用重定向符把輸出改道到文件這樣數(shù)據(jù)就留下來了。表示覆蓋寫入文件dir /b filelist.txt echo hello note.txt表示追加寫入文件echo 第一行 note.txt管道|是把一條命令的輸出作為下一條命令的輸入dir | findstr txt type run.log | findstr error這兩種方式結(jié)合能寫出很“順手”的命令。比如我要把所有進(jìn)程列表按內(nèi)存占用排序后保存到文件tasklist /v | sort /r /60 process.txt再比如將當(dāng)前目錄下所有文件大小匯總寫入日志dir /a /s | findstr 個(gè)文件 sizesummary.txt我經(jīng)常用重定向來采集一堆服務(wù)器的運(yùn)行信息。服務(wù)器上跑一條命令比如systeminfo c:\info_%COMPUTERNAME%.txt然后把生成的文件統(tǒng)一拷回去分析全程不用一臺(tái)臺(tái)打開圖形界面。這種半自動(dòng)化的方式簡單到不需要腳本效果卻立竿見影。4. 批處理與循環(huán)技巧4.1 for 循環(huán)重復(fù)操作的一把鑰匙很多人一聽for就覺得難其實(shí)它在 DOS 命令里的語法是固定的你只要背住一種寫法剩下的就是替換字段。最常用的格式for %i in (集合) do 命令 %i注意在 CMD 命令行里寫循環(huán)變量用%i如果寫進(jìn) .bat 批處理文件里必須寫成%%i。這個(gè)差別我當(dāng)年栽過跟頭明明命令行里跑得好好的存成腳本就報(bào)錯(cuò)。看幾個(gè)實(shí)際例子。批量列出當(dāng)前目錄所有 .txt 文件全路徑for %i in (*.txt) do echo %~fi批量改文件名。給所有 .txt 加上.bak后綴for %i in (*.txt) do copy %i %i.bak批量創(chuàng)建一個(gè)數(shù)字序列目錄for /l %i in (1,1,10) do md folder_%i/l是循環(huán)序列語法是(起始值,步長,結(jié)束值)。上面這條命令會(huì)生成folder_1到folder_10。用圖形界面手動(dòng)新建十個(gè)文件夾手得抽筋命令行一行搞定。如果要對(duì)文件內(nèi)容做處理配合管道也可以for /f %i in (iplist.txt) do ping %i/f表示從文件讀取每一行然后對(duì)每行執(zhí)行一次后面的命令。這個(gè)寫法在批量 ping 多個(gè) IP、批量執(zhí)行遠(yuǎn)程命令時(shí)極有用。4.2 命令連接符、、|| 的分工CMD 里支持多個(gè)命令寫在一行但連接符不同語義完全不同。不管前一條是否成功都執(zhí)行后一條前一條成功才執(zhí)行后一條||前一條失敗才執(zhí)行后一條這個(gè)區(qū)別非常實(shí)戰(zhàn)。比如我們做部署時(shí)先編譯編譯成功才重啟服務(wù)msbuild Project.sln net stop MyService net start MyService如果編譯失敗后面兩條根本不會(huì)執(zhí)行避免“帶著壞代碼重啟服務(wù)”這種災(zāi)難。再比如判斷文件存不存在存在就執(zhí)行備份if exist D:\data\db.bak (echo 找到備份 copy D:\data\db.bak E:\backup\) else (echo 未找到備份)if exist搭配括號(hào)可以把條件邏輯寫得非常順手。新手容易忽略括號(hào)后面必須和命令在同一行換行就會(huì)報(bào)語法錯(cuò)誤。||適合做容錯(cuò)。比如某個(gè)命令執(zhí)行失敗時(shí)補(bǔ)一條記錄findstr admin userlist.txt || echo admin不存在 missing.log在批處理腳本里這三類連接符構(gòu)成了基本流程控制。我自己寫部署腳本時(shí)整個(gè)邏輯就靠它們串聯(lián)起來檢查目錄、編譯、備份、重啟、清理十幾行完成一套流程。4.3 DOSKEY、F7 和命令歷史減少重復(fù)輸入手動(dòng)敲命令最煩的事情就是重復(fù)。你可能會(huì)問有沒有“別名”有DOSKEY 就是干這個(gè)的。doskey mkmkdir $* doskey qexit doskey lldir /w設(shè)置后以后輸入mk project就相當(dāng)于執(zhí)行mkdir project。不過 DOSKEY 的別名只在當(dāng)前窗口生效想永久生效得把它們寫進(jìn)批處理或注冊(cè)表環(huán)境里等你學(xué)會(huì) .bat 后可以自行折騰。除了別名CMD 本身還有很多快捷鍵↑↓翻閱歷史命令F7彈出歷史命令列表選擇后回車執(zhí)行F8向后搜索匹配的歷史命令Tab自動(dòng)補(bǔ)全文件名或目錄名連著按可以在多個(gè)候選項(xiàng)間切換還有一個(gè)知識(shí)點(diǎn)命令歷史是保存在當(dāng)前進(jìn)程里的新開窗口就沒了。但 CMD 的進(jìn)程歷史可以通過注冊(cè)表保存需要恢復(fù)上次關(guān)閉前輸入的命令可以看一下本機(jī)注冊(cè)表里HKEY_CURRENT_USER\Console的相關(guān)值不過一般沒必要知道有這回事就行。實(shí)際工作中我習(xí)慣把常用的復(fù)雜命令做成 DOSKEY比如一鍵切換到我常操作的項(xiàng)目目錄doskey workcd /d D:\Projects\WebApp dir每次打開 CMD先執(zhí)行一次work直接進(jìn)入工作目錄并且列出內(nèi)容省掉一堆重復(fù)操作。5. 系統(tǒng)、任務(wù)與網(wǎng)絡(luò)診斷命令5.1 用 systeminfo 與 tasklist 摸清電腦底細(xì)排查問題第一步永遠(yuǎn)是“問系統(tǒng)要信息”。systeminfo把整個(gè)系統(tǒng)的基礎(chǔ)信息全部列出來包括 OS 版本、補(bǔ)丁、硬件配置、內(nèi)存情況、網(wǎng)卡信息、啟動(dòng)時(shí)間等等。systeminfo輸出很長可以用重定向歸檔systeminfo sysinfo_%date:~0,10%.txt%date:~0,10%是變量的截取語法在批處理里經(jīng)常用到作用是從日期變量里取前 10 個(gè)字符通常就是2025-01-31這樣的格式用它拼文件名很順手。看進(jìn)程信息用tasklist基本格式tasklist按內(nèi)存占用排序找出吃內(nèi)存的大戶tasklist /fo csv | sort /r用tasklist結(jié)合findstr精確查找某個(gè)進(jìn)程是否存在tasklist | findstr nginx.exe進(jìn)程怎么殺一個(gè)命令taskkill /f /im nginx.exe/f強(qiáng)制終止/im表示按映像名稱匹配也就是按進(jìn)程名殺。按 PID 殺也一樣taskkill /f /pid 2764注意taskkill結(jié)束進(jìn)程前務(wù)必確認(rèn) PID 沒認(rèn)錯(cuò)否則會(huì)誤殺系統(tǒng)關(guān)鍵進(jìn)程。我曾經(jīng)在一個(gè)同事的機(jī)器上殺錯(cuò)了一個(gè)服務(wù)進(jìn)程人家運(yùn)行半天的程序數(shù)據(jù)全丟了非常尷尬。先用tasklist /v看清楚該進(jìn)程對(duì)應(yīng)的窗口標(biāo)題再動(dòng)手。5.2 網(wǎng)絡(luò)診斷ipconfig、ping、tracert 的逐層排查網(wǎng)絡(luò)問題是最常見的求助場景DOS 命令里有一套從本地到目標(biāo)地址的完整排查鏈路順序別亂一亂就浪費(fèi)時(shí)間。第一步看本機(jī)網(wǎng)絡(luò)配置ipconfig /all這條命令輸出 IP 地址、子網(wǎng)掩碼、網(wǎng)關(guān)、DNS、MAC 地址、DHCP 是否開啟等很多配置類問題都是從這里看出端倪的。第二步測(cè)試本機(jī)到網(wǎng)關(guān)的連通性ping 192.168.1.1如果你網(wǎng)關(guān)都不通說明物理鏈路、網(wǎng)卡驅(qū)動(dòng)或者交換機(jī)端口有問題。如果網(wǎng)關(guān)通繼續(xù)測(cè)試外網(wǎng)地址ping 8.8.8.8 ping www.example.com這里有個(gè)常見誤區(qū)能 ping 通 IP 但 ping 不通域名說明 DNS 解析有問題不是網(wǎng)絡(luò)斷。檢查 DNS 配置必要時(shí)手動(dòng)指定。第三步看路由走向tracert www.example.com它會(huì)逐跳顯示你到目標(biāo)經(jīng)過的每一層路由節(jié)點(diǎn)及響應(yīng)時(shí)間。哪一跳開始超時(shí)問題基本就在那一段。我之前排查過一個(gè)“網(wǎng)頁打開慢”的老大難企業(yè)出口帶寬充足本地 ping 也沒問題但 tracert 發(fā)現(xiàn)中間某跳延遲飆到兩百多毫秒鏈路劣化實(shí)錘后來換了線路解決。還有一個(gè)高頻命令netstat查看端口監(jiān)聽和連接狀態(tài)netstat -ano-a顯示所有連接和監(jiān)聽端口-n用數(shù)字顯示地址和端口-o顯示對(duì)應(yīng)的 PID。想找出誰占用了 8080 端口三條命令組合netstat -ano | findstr 8080 tasklist | findstr 對(duì)應(yīng)的PID新人在這一步容易慌為什么findstr經(jīng)常查不到因?yàn)閚etstat輸出里端口前面有大量空格用精確匹配沒匹配上。這種情況可以直接用 findstr 加引號(hào)包含空格的部分或者只看輸出列手動(dòng)對(duì)一下也行不影響大局。5.3 用命令看系統(tǒng)時(shí)間、環(huán)境變量與快捷工具有時(shí)候需要快速獲取時(shí)間、路徑變量而這些不一定會(huì)靈活使用。常用time /t date /t echo %PATH% echo %USERPROFILE% where pythonwhere命令非常厲害它會(huì)從 PATH 環(huán)境變量里搜索可執(zhí)行文件并返回完整路徑。如果你想知道系統(tǒng)到底用的哪個(gè) Pythonwhere python這個(gè)命令能直接把你從“不知道裝到哪里去了”的深淵里撈出來。配合 Windows 應(yīng)用商店版 Python 的坑我寫過不少排查筆記每臺(tái)機(jī)器裝的路徑可能不一樣where一執(zhí)行答案清清楚楚。6. 常見問題與避坑實(shí)戰(zhàn)6.1 “不是內(nèi)部或外部命令”的真實(shí)原因這是新手遇到最多的報(bào)錯(cuò)xxx 不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件。這不是命令不存在大概率是以下原因命令拼寫錯(cuò)誤或者手滑多打了空格命令對(duì)應(yīng)的 exe 不在 PATH 環(huán)境變量里你在某個(gè)目錄下運(yùn)行的程序該目錄沒有加入 PATH命令本身是內(nèi)部命令但被當(dāng)前修改的環(huán)境遮蔽了排查方式很簡單先用where 命令名看看能不能找到找不到就檢查 PATH。如果 PATH 里沒有可以帶完整路徑運(yùn)行比如C:\Windows\System32\findstr.exe臨時(shí)在當(dāng)前窗口追加 PATHset PATH%PATH%;D:\tools注意這個(gè)設(shè)置只在當(dāng)前命令行窗口生效關(guān)掉窗口就恢復(fù)。想永久生效去系統(tǒng)設(shè)置里改環(huán)境變量。這也是命令行使用中的一個(gè)核心思想環(huán)境變量決定了一堆命令的可見性學(xué)會(huì)看echo %PATH%很多疑難雜癥就迎刃而解。6.2 中文亂碼的根源與處理CMD 顯示中文亂碼是另一個(gè)高頻問題尤其當(dāng)文件內(nèi)容是 UTF-8 編碼時(shí)。原因是 CMD 默認(rèn)代碼頁是 936GBK而很多現(xiàn)代文件用的是 UTF-8。解決方法是切換代碼頁為 65001chcp 65001執(zhí)行完再重新查看文件中文基本就正常了。但要注意切代碼頁只影響當(dāng)前窗口新開的 CMD 窗口會(huì)重置為默認(rèn)。想讓某個(gè)登錄會(huì)話全程 UTF-8可以考慮修改注冊(cè)表里的默認(rèn)代碼頁不過這個(gè)操作要慎重改完可能影響一些老程序非必要不建議動(dòng)。另外保存批處理腳本時(shí)建議直接用 UTF-8 編碼。但這里有個(gè)讓人抓狂的點(diǎn)Windows 自帶記事本保存 UTF-8 文件時(shí)會(huì)帶上 BOM 頭部分命令解析 BOM 時(shí)會(huì)多出一個(gè)隱藏字符導(dǎo)致腳本第一行命令報(bào)錯(cuò)。后來我寫 .bat 一律用 VS Code 或者 Notepad3 保存編碼選 UTF-8 無 BOM問題徹底消失。6.3 參數(shù)、引號(hào)與空格的那些坑路徑帶空格是用copy、xcopy、robocopy之類命令時(shí)最容易踩的坑。比如copy D:\my documents\a.txt E:\backup這條命令執(zhí)行時(shí)D:\my會(huì)被解釋為一個(gè)路徑后面documents\a.txt就成了另一個(gè)參數(shù)命令會(huì)報(bào)錯(cuò)說找不到文件。正確寫法copy D:\my documents\a.txt E:\backup所有帶空格的路徑一律用雙引號(hào)包起來。這一條規(guī)則適用于絕大多數(shù) DOS 命令從cd到findstr到robocopy都一樣。還有ping這類命令連域名都可以不加引號(hào)但如果域名里帶點(diǎn)并且后面還有參數(shù)格式稍微混亂也不行。多練幾次就能形成肌肉記憶。6.4 正確看待 DOS 命令與 PowerShell有人會(huì)問“現(xiàn)在都有 PowerShell 了我為什么還要學(xué) DOS 命令”我的回答是DOS 命令是基礎(chǔ)通行證PowerShell 是超級(jí)加強(qiáng)版。很多場景里你的服務(wù)器既有老的批處理腳本也有新的 PowerShell 腳本兩者需要互調(diào)。PowerShell 里面可以直接執(zhí)行大部分 DOS 命令比如dir、copy它把命令輸出轉(zhuǎn)成對(duì)象處理功能更強(qiáng)大但同時(shí)也多了學(xué)習(xí)成本。我的觀點(diǎn)很明確你必須先知道 DOS 命令怎么拼、怎么組合才能真正理解 PowerShell 里那些依賴別名和管道的寫法。兩個(gè)都學(xué)不沖突先用 DOS 把命令感和排查思維練出來再上 PowerShell 體會(huì)對(duì)象化管道的解放感會(huì)平滑很多。如果一上來就啃 PowerShell 的Where-Object、ForEach-Object很容易被語法勸退。最后分享一個(gè)我實(shí)際工作中的習(xí)慣每次接到一臺(tái)新的 Windows 服務(wù)器我都會(huì)先執(zhí)行這一串命令把機(jī)器“摸一遍底”systeminfo ipconfig /all netstat -ano tasklist /v不是每個(gè)環(huán)境都會(huì)遇到同樣的問題但有了這些基礎(chǔ)信息很多臨時(shí)出現(xiàn)的故障排查起來不會(huì)兩眼一抹黑。DOS 命令不是高高在上的炫技工具它是你手邊最務(wù)實(shí)、最底層的電腦操作能力。敲得越多你越能感覺到圖形界面能做的它幾乎都能做圖形界面做不了的它也照樣能做。