Windows 命令详解(一):文件与目录操作常用命令速查表

2026-07-25 Windows

这一组一共五篇,把命令提示符里真正每天会摸到的命令按用途拆开,全部用表格列出来:命令、作用、参数、示例,要用哪条直接抄。

本文是第一篇,只讲文件和目录——怎么进目录、怎么复制移动删除、怎么在文件里搜字符串、怎么改属性和权限。磁盘维护、网络、进程服务那几块分别在后面几篇里。

表里的语法和参数名全部照微软官方 Windows Commands 参考抄录,没有自己编的写法;每一条的出处在文末。你本机敲 命令 /? 看到的就是同一份帮助,具体输出以本机版本为准。

一、先看懂语法里的这几个记号

官方参考里的语法块用一套固定记号,先记住它们,后面所有表都通用。

记号 含义
不带括号的文字 必须原样输入
<尖括号里的文字> 占位符,要换成你自己的值(文件名、路径、用户名等)
[方括号里的内容] 可选项,可以不写
{大括号里的内容} 必选项,多选一
竖线 互斥项之间的分隔,左边右边只能挑一个
…(省略号) 这一项可以重复出现多次

一个实际例子:del [/p] [/f] [/s] [/q] [/a[:]<attributes>] <names>——<names> 是必填(要删什么),方括号里的 /p、/f 这些是可选的开关,{+|-} 这种大括号写法表示「加号或减号二选一」。

一次敲多条命令、把输出送到别处

这几条写法出自官方 cmd 参考的 Remarks 一节:

写法 作用
命令1 | 命令2 管道:把命令 1 的输出当作命令 2 的输入
命令1 > 文件.txt 把命令 1 的输出写进文件(覆盖原内容)
命令1 & 命令2 把两条命令组合在一起执行
命令1 && 命令2 命令 1 成功后才执行命令 2
命令1 || 命令2 命令 1 失败后才执行命令 2

路径里带空格必须加双引号,官方 cd 参考给的正是这个例子:cd "username\programs\start menu"。命令内容里要出现 & 这种有含义的字符时用 ^ 转义,官方 set 参考的例子里写 set testVar=TEST^&1 才能在变量里放进一个 &。

二、目录与路径

命令 作用 基本写法 示例
cd / chdir 显示当前目录,或切换目录 cd [/d] [<drive>:][<path>] cd \Windows\System32
cd .. 回到上一级 cd [..] cd ..\..
cd /d 同时切换盘符和目录 cd /d D:\Data cd /d D:\Data
md / mkdir 新建目录,可一次建多层 md [<drive>:]<path> md \Taxes\Property\Current
rd / rmdir 删除目录 rd [<drive>:]<path> [/s [/q]] rd /s /q test
dir 列出目录下的文件和子目录 dir [<drive>:][<path>][<filename>] [...] dir /s /b *.log
tree 以树形图显示目录结构 tree [<drive>:][<path>] [/f] [/a] tree C:\Users /f
pushd 记住当前目录并切到新目录 pushd [<path>] pushd D:\Project
popd 回到 pushd 记住的那个目录 popd popd
subst 把一个路径映射成盘符 subst <drive1>: [<drive2>:]<path> subst Z: D:\Very\Long\Path
where 按搜索模式找出文件所在位置 where [/r <Dir>] [/q] [/f] [/t] <Pattern> where /r C:\ notepad.exe

几个容易踩的点:

  • md 默认开启了命令扩展,所以 md \Taxes\Property\Current 一条就能把中间层一起建出来,不用一层一层敲。
  • rd 删的是目录本身;目录非空时必须 /s(连子目录一起删),再加 /q 就不再逐条问你要不要确认。rd 不能删文件。
  • dir /b 是「bare」纯名称列表,适合接到别的命令后面;dir /s 会连子目录一起列,输出量大时配合 | more 一屏一屏看。

dir 常用参数

参数 作用
/p 满一屏停一次,按键继续
/q 显示文件的属主信息
/w 宽格式(多列)
/d 与 /w 同格式,但按列排序
/a[:<attributes>] 只列出符合指定属性的项,如 dir /a:d 只看目录
/o[:<sortorder>] 按指定字段排序
/t[:<timefield>] 指定显示/排序用的时间字段
/s 连同所有子目录一起列出
/b 只输出名称,不带表头和汇总
/x 显示非 8.3 文件名的短名
/c 文件大小显示千位分隔符
/4 年份用四位数显示
/r 显示文件的备用数据流(ADS)

tree 与 where 的参数

命令 参数 作用
tree /f 连文件名一起显示(默认只显示目录)
tree /a 用文本字符代替图形字符画树(适合把输出粘到 txt 里)
where /r <Dir> 从指定目录开始递归查找
where /q 只返回退出码(0 找到、1 没找到),不打印路径
where /f 输出时带引号
where /t 一并显示文件大小和最近一次修改时间

tree C:\ /f > D:\list.txt 这种写法很常用:先 tree /a /f 让图形字符变成普通字符,生成的清单在记事本里也不会错位。

三、复制、移动、改名与删除

命令 作用 基本写法 示例
copy 复制一个或多个文件 copy [/d] [/v] [/y] [/z] <source> [<destination>] copy memo.doc D:\bak\letter.doc
xcopy 复制文件与目录(含子目录) xcopy <Source> [<Destination>] [/s [/e]] xcopy D:\data E:\bak /s /e /h /i /y
robocopy 大目录/可续传的目录级复制 robocopy <source> <destination> [<file>] [<options>] robocopy D:\Records E:\Backup /E /ZB /LOG:D:\backup.log
move 移动文件或目录 move [{/y | /-y}] [<source>] [<target>] move D:\data\*.xls D:\second_q\reports\
del / erase 删除一个或多个文件 del [/p] [/f] [/s] [/q] [/a[:]<attributes>] <names> del /f /s /q D:\temp\*.tmp
ren / rename 给文件或目录改名 ren [<drive>:][<path>]<filename1> <filename2> ren chap10 part10
replace 用源文件替换目标目录里的同名文件 replace <源文件> [<目标目录>] [/a] [/p] [/r] [/w] replace A:\phones.cli C:\ /s

copy、xcopy、robocopy 三个的关系值得说清楚,它们的定位不一样:

  • copy 最轻,单文件或一批文件,官方参考里特别提示它会把「文件复制到自己身上」判为错误(File cannot be copied onto itself)。想把某个文件的修改时间刷成当前时间,官方给的写法是 copy /b <source> +,,。
  • xcopy 能带子目录、能带隐藏和系统文件、能按改动日期挑文件(/d),但目录树很深、文件很多时它容易中断且不会续传,这是它和 robocopy 最大的区别。
  • robocopy 是专门为大批量复制写的:可续传(/z)、可多线程(/mt)、跳过已相同的文件、能写日志、有明确的返回码。

robocopy 常用选项

选项 作用
/s 复制子目录,但跳过空目录
/e 复制子目录,连空目录一起复制
/mir 镜像目录树(等于 /e 加上 /purge),目标端多出来的文件会被删
/z 可续传模式
/zb 可续传;访问被拒时自动改用备份模式
/b 备份模式(需要相应权限)
/j 无缓冲 I/O,适合超大文件
/mt:<n> 多线程复制,n 为线程数
/copy:<copyflags> 指定要复制哪些文件属性
/dcopy:<copyflags> 指定目录属性复制方式
/sec / /copyall 连安全信息一起复制
/purge 删除目标端源端已经没有的文件和目录
/r:<n> / /w:<n> 重试次数与重试间隔秒数
/log:<文件> / /log+:<文件> 写日志 / 追加日志
/l 只列出将要复制的文件,不真的复制(试跑)
/create 只建目录树和零长度文件

/mir 和 /purge 会删东西,正式跑之前先用同样的参数加 /l 试一遍,确认要删的清单再执行——这是这一条最省事的安全阀。

robocopy 的返回码(官方 Exit codes 表)

robocopy 的返回值和普通命令不一样:小于 8 都算正常结束,只有 ≥ 8 才是真出错。在批处理里用 errorlevel 判断时要按这个口径写。

返回值 含义
0 没有文件被复制,没有失败,也没有不匹配——目标端文件已存在,跳过
1 所有文件都复制成功
2 目标端有源端没有的额外文件,没有文件被复制
3 部分文件被复制,并且存在额外文件,没有失败
5 部分文件被复制,存在不匹配的文件,没有失败
6 既有额外文件也有不匹配文件,没有文件被复制,没有失败
7 有文件被复制,同时存在不匹配文件和额外文件
8 有若干文件没有复制成功

官方备注写明:任何 ≥ 8 的值都表示复制过程中至少出现过一次失败。

xcopy 与 copy 常用参数

命令.参数 作用
xcopy /s 复制目录和子目录(空目录除外)
xcopy /e 连空目录一起复制
xcopy /i 目标不存在且要复制多个文件时,直接按目录处理,不再问 F/D
xcopy /h 连隐藏和系统文件一起复制
xcopy /r 复制只读文件
xcopy /k 复制后保留目标文件的只读属性
xcopy /d[:MM-DD-YYYY] 只复制该日期及以后改动过的源文件
xcopy /u 只复制目标端已存在的文件
xcopy /l 只列出将复制的文件,不实际复制
xcopy /exclude:<文件> 按清单排除文件
xcopy /y / /-y 不提示覆盖 / 提示覆盖
copy /v 写入后校验
copy /y / /-y 不提示覆盖 / 提示覆盖
copy /z 网络复制时可续传
copy /a / /b 按 ASCII 文本 / 二进制文件处理

del 只删文件不删目录,且官方参数里 /f 用来强删只读文件、/s 从当前目录往下递归、/q 静默——del /f /s /q 这三个连用等于「不问任何问题地清空一棵树的文件」,敲之前看清楚路径。

ren 的语法里第二个参数只有文件名(<filename2>),没有盘符和路径部分,所以它只能改名,把文件挪到别的目录要用 move。

四、查看与查找文件内容

命令 作用 基本写法 示例
type 显示文本文件内容 type [<drive>:][<path>]<filename> type holiday.mar | more
more 一屏一屏地看输出 <command> | more [/c] [/s] dir /s | more
find 在文件里搜字符串 find [/v] [/c] [/n] [/i] <"string"> [<filename>] find /i "PROMPT" *.bat
findstr 用模式(支持正则)在文件里搜 findstr [/b] [/e] [/s] [/i] [/n] [/c:<string>] <strings> <filename> findstr /s /i /n /c:"hello there" *.txt
fc 比较两个文件并显示差异 fc /a [... ] <文件名1> <文件名2> fc /a monthly.rpt sales.rpt
comp 逐字节比较两个文件 comp [<data1>] [<data2>] [/d] [/a] [/l] comp C:\a.bin D:\b.bin
sort 读入数据排序后输出 sort [/r] [/+<N>] [/o <输出文件>] find "Jones" maillist.txt | sort
clip 把命令输出送进剪贴板 <command> | clip dir | clip

find 和 findstr 别混:find 只按字面字符串找,多个词必须用引号括成一段;findstr 默认按正则找,多个词是「或」的关系,要按整段字面找得用 /c:"..."。官方例子正好说明了这点:findstr hello there x.y 是找 hello 或 there,findstr /c:"hello there" x.y 才是找连续的 hello there。

findstr 常用参数

参数 作用
/b 只匹配行首
/e 只匹配行尾
/l 按字面处理搜索串
/r 按正则处理搜索串
/s 连当前目录下的所有子目录一起搜
/i 忽略大小写
/x 只打印完全匹配的行
/v 只打印不匹配的行
/n 每条匹配行带行号
/m 只打印含匹配内容的文件名
/o 每个匹配前打印字节偏移
/p 跳过含不可打印字符的文件
/f:<file> 从指定文件读文件清单
/c:<string> 把整个字符串当作一个字面搜索串
/g:<file> 从指定文件读取搜索串
/d:<dirlist> 在指定的目录清单里搜索
/a:<colorattribute> 用两个十六进制字符指定颜色属性
/off[line] 不跳过带脱机属性的文件

返回码(写脚本判断时用)

命令 返回值 含义
find 0 找到了搜索串
find 1 没找到
find 2 文件没找到或命令行无效
fc 0 两个文件相同
fc 1 两个文件不同
fc 2 比较过程中出错

五、属性、权限与链接

命令 作用 基本写法 示例
attrib 查看、设置或清除文件属性 attrib [{+|-}r] [{+|-}a] [{+|-}s] [{+|-}h] [<路径>] [/s [/d] [/l]] attrib -r D:\public\*.* /s
icacls 查看或修改文件/目录的 DACL icacls <name> [/grant[:r] <sid>:<perm>] [/t] [/c] [/q] icacls D:\share /grant User1:M /t
takeown 把文件/目录的所有权拿过来 takeown /f <filename> [/a] [/r [/d {Y|N}]] takeown /f D:\locked.txt
mklink 创建符号链接 / 硬链接 / 目录联接 mklink [[/d] | [/h] | [/j]] <link> <target> mklink /d D:\MyFolder D:\Users\User1\Documents
compact 在 NTFS 上查看或改变文件/目录压缩 compact [/C | /U] [/S[:dir]] [/A] [/I] [/F] [/Q] [/EXE[:algorithm]] compact /c /s D:\logs
expand 展开压缩文件、从 .cab 里取文件 expand [-r] <source> <destination> expand -r setup.cab D:\out
forfiles 按文件属性/日期挑选并执行命令 forfiles [/P pathname] [/M searchmask] [/S] [/C command] [/D [+ | -] {<date> | <days>}] forfiles /P D:\logs /M *.log /D -30 /C "cmd /c del @path"

attrib 的属性字母是成对出现的,写 + 是设置、写 - 是清除。官方参数表里逐个列了:

写法 属性 说明
{+|-}r 只读 Read-only
{+|-}a 存档 标记「上次备份后改动过」,xcopy 就是靠这个属性挑选文件的
{+|-}s 系统 设了系统属性后,要先清掉它才能改这个文件的其它属性
{+|-}h 隐藏 同上,隐藏属性也要先清掉才能改其它属性
{+|-}o 脱机 Offline
{+|-}i 不参与内容索引 Not Content Indexed
{+|-}x 修复(Scrub)
{+|-}p 固定(Pinned)
{+|-}u 取消固定(Unpinned)
{+|-}b SMR Blob

attrib 不带任何参数时,显示当前目录下所有文件的属性;加 /s 会连子目录里的文件一起处理,加 /d 才把目录本身也算进去。

icacls 的权限掩码分「简单权限」和「高级权限」两套。简单权限直接写字母、不用括号:

掩码 含义
N 无访问权
F 完全访问
M 修改
RX 读取并执行
R 只读
W 只写
D 删除

高级权限必须写成括号里的逗号分隔列表,比如 icacls test1 /grant User1:(d,wdac) 里的 d 是删除、wdac 是写 DAC(改权限)。常用高级掩码:DE 删除、RC 读控制、WDAC 改权限、WO 取所有权、RD 读数据、WD 写数据、AD 追加数据、REA/WEA 读写扩展属性、X 执行/遍历、DC 删除子项、RA/WA 读写属性。

takeown 解决的是「文件所有权限都点不动」这种情况:它把所有权换给当前管理员,之后再用 icacls 把权限配回去。官方例子里 /a 是把所有权给 Administrators 组而不是当前用户,/r 是递归,/d 指定递归时对「没有权限的目录」默认回答 Y 还是 N。

mklink 要在 cmd 里用,PowerShell 里对应的是 New-Item -ItemType SymbolicLink。三种链接的区别看参数就清楚:默认是文件符号链接,/d 是目录符号链接,/j 是目录联接(Junction),/h 是硬链接。删除时官方例子是直接 rd 或 del 掉链接本身。

compact 只能用在 NTFS 分区上。用 /EXE 时官方给了四种压缩算法:XPRESS4K(最快,默认)、XPRESS8K、XPRESS16K、LZX(压缩率最高)。它影响的是文件系统层的压缩,跟打包成 zip 是两回事。

六、环境变量与窗口本身

命令 作用 基本写法 示例
set 显示、设置或删除 cmd 环境变量 set [<variable>=[<string>]] set
set /p 把用户输入读进变量 set /p <variable>=[<提示语>] set /p name=请输入名称:
set /a 把数值表达式赋给变量 set /a <variable>=<表达式> set /a n=n+1
setx 在当前用户或系统环境里长期设置变量 setx <variable> <value> [/m] setx MACHINE Brand1 /m
echo 显示消息,或开关命令回显 echo [<message>] / echo [on | off] echo %TEMP%
date 显示或设置系统日期 date [/t | <month-day-year>] date /t
time 显示或设置系统时间 time [/t | [<HH>[:<MM>[:<SS>]] [am|pm]]] time /t
cls 清屏 cls cls
color 改当前会话的前景/背景色 color [attr] color 0a
title 给命令提示符窗口设标题 title [<string>] title 正在复制文件
chcp 改变活动代码页 chcp [<nnn>] chcp 936
doskey 调出历史命令、定义宏 doskey [/history] [/macros] [<macroname>=[<text>]] doskey /history > tmp.bat
start 单开一个窗口运行程序或命令 start <"title"> [/d <path>] [/wait] [/b] <程序> start "Bing" "https://www.bing.com"
exit 退出解释器或当前批处理 exit [/b] [<exitcode>] exit /b 1
pause 暂停批处理,提示「按任意键继续」 pause pause
help 列出可用命令或看某条命令的详细帮助 help [<command>] help robocopy

这里有几条区别要分清楚:

  • set 设的变量只活在当前这个 cmd 窗口里,关掉就没了,而且它设的值会出现在环境里,别拿它存密码。要长期生效用 setx,setx MACHINE Brand1 /m 里的 /m 表示写到系统环境(对这台机器所有用户生效),不加 /m 只对当前用户生效。
  • date 和 time 官方参考都标注了需要管理员权限才能用来改时间;只想看时间就用 date /t、time /t,它们只显示不提示输入。
  • doskey 有两个很实用的用法:doskey /history 把本次窗口敲过的命令列出来(doskey /history > tmp.bat 就是把刚才的操作存成一个批处理),doskey /macros 列出你自己定义的宏。
  • chcp 看当前代码页;chcp 936 是简体中文 GBK,遇到命令行里中文变乱码(尤其是老工具输出)时,切代码页往往比改字体管用。

color 的属性用一个十六进制数表示,高位是背景、低位是前景:

值 颜色 值 颜色
0 黑 8 灰
1 蓝 9 亮蓝
2 绿 a 亮绿
3 青 b 亮青
4 红 c 亮红
5 紫 d 亮紫
6 黄 e 亮黄
7 白 f 亮白

color 0a 就是黑底亮绿,color 单敲一下(不带参数)恢复默认。

chcp 常用代码页(官方表里摘的):437 美国、850 多语言(拉丁 I)、852 斯拉夫(拉丁 II)、855 西里尔(俄语)、866 俄语、869 现代希腊语、936 简体中文。

七、一条命令把这一篇的命令体检一遍

下面两个脚本都是只读的:只做 where、dir、ver、chcp 这类查看动作,不改任何文件,跑完在桌面上留一份 txt 报告,用来确认这些命令在你机器上都存在、当前环境是什么样。

PowerShell 版(存成 win-cmd-check-1.ps1,右键「使用 PowerShell 运行」):

# Windows 命令详解(一)自检脚本:只读,不改动任何文件
$log = Join-Path ([Environment]::GetFolderPath('Desktop')) 'win-cmd-check-1.txt'

Set-Content -Path $log -Value 'Windows 命令自检(一):文件与目录'
Add-Content -Path $log -Value ('生成时间:' + (Get-Date).ToString('yyyy-MM-dd HH:mm:ss'))

function Run([string]$title, [string]$cmd) {
    Add-Content -Path $log -Value ''
    Add-Content -Path $log -Value ('===== ' + $title + ' =====')
    cmd /c $cmd 2>&1 | Add-Content -Path $log
}

Run '解释器版本'   'ver'
Run '活动代码页'   'chcp'
Run '当前用户'     'echo %USERNAME% @ %COMPUTERNAME%'
Run '临时目录'     'echo %TEMP%'
Run '本文命令是否存在' 'where cmd dir tree copy xcopy robocopy move del ren find findstr attrib icacls takeown mklink compact expand forfiles'
Run '当前目录'     'cd'
Run 'Windows 目录前 15 项' 'dir %WINDIR% /b'
Run '临时目录按修改时间排序' 'dir %TEMP% /o-d /b'

Write-Host ('报告已写入:' + $log)

批处理版(存成 win-cmd-check-1.bat,双击运行):

@echo off
chcp 65001 >nul
setlocal
set "LOG=%USERPROFILE%\Desktop\win-cmd-check-1.txt"
(
  echo Windows 命令自检(一):文件与目录
  echo 生成时间:%DATE% %TIME%
  echo.
  echo ===== 解释器版本 =====
  ver
  echo.
  echo ===== 活动代码页 =====
  chcp
  echo.
  echo ===== 当前用户 =====
  echo %USERNAME% @ %COMPUTERNAME%
  echo.
  echo ===== 本文命令是否存在 =====
  where cmd dir tree copy xcopy robocopy move del ren find findstr attrib icacls takeown mklink compact expand forfiles
  echo.
  echo ===== 当前目录 =====
  cd
  echo.
  echo ===== Windows 目录前 15 项 =====
  dir %WINDIR% /b
) > "%LOG%" 2>&1
echo 报告已写入:%LOG%
pause

两个脚本里如果 where 那一行有命令没列出来,说明你的系统里这条命令不可用(多数是精简版系统去掉了某个组件);批处理文件里的中文按 UTF-8 保存,配合 chcp 65001 才不会乱码,如果显示成方块就把文件另存为 ANSI 编码。

八、这个系列的其它几篇

九、出处

本文所有语法、参数说明、示例与返回码,均取自微软官方 Windows Commands 参考(https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/)下的下列页面,页面路径省略公共前缀:

下面这些页面(同属该参考集,公共前缀如上):

command-line-syntax-key(语法记号)、cmd、cd、dir、md、rd、del、ren、copy、xcopy、robocopy、move、type、more、find、findstr、fc、comp、tree、where、attrib、icacls、takeown、mklink、subst、replace、sort、expand、compact、forfiles、echo、setx、date、time、cls、color、title、doskey、chcp、help、start、exit、pause、pushd、popd、clip。

环境变量那条 set 在文档集里对应的是 set_1(另有同名页面属于 vssadmin 的 set,别搞混)。

其中几条重点命令的完整地址: