这一组一共五篇,把命令提示符里真正每天会摸到的命令按用途拆开,全部用表格列出来:命令、作用、参数、示例,要用哪条直接抄。
本文是第一篇,只讲文件和目录——怎么进目录、怎么复制移动删除、怎么在文件里搜字符串、怎么改属性和权限。磁盘维护、网络、进程服务那几块分别在后面几篇里。
表里的语法和参数名全部照微软官方 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 命令详解(二):系统信息、进程与服务管理命令速查表
- Windows 命令详解(三):网络诊断与配置命令速查表
- Windows 命令详解(四):磁盘与系统维护命令速查表
- Windows 命令详解(五):批处理与 PowerShell 常用写法速查表
九、出处
本文所有语法、参数说明、示例与返回码,均取自微软官方 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,别搞混)。
其中几条重点命令的完整地址:
cmd:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmdrobocopy(含 Exit codes 表):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopyxcopy:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopyicacls(含权限掩码列表):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/icaclsattrib(含属性字母表):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/attrib