本帖最后由 CrLf 于 2014-7-25 15:15 编辑
写了一个 :xcopy 来模拟 xcopy 的主要功能,仅粗略实现了 /s /t /y /h 四个常用选项:- @echo off
- call :xcopy /h
- rem 显示 usage
- call :xcopy /t "d:\tmp" e:\test\
- rem 将 d:\tmp 目录下的目录结构复制到 e:\test\ 路径下
- call :xcopy /s /y "d:\tmp" e:\test\
- rem 将 d:\tmp 目录下的所有文件和文件夹复制到 e:\test\ 路径下,不显示提示
- pause&exit
-
- :xcopy [/s] [/t] [/y] [/h] 源文件夹 目标文件夹
- setlocal disabledelayedexpansion
- set n=0
- for %%a in (源文件夹 目标文件夹 开关[/s] 开关[/y] 开关[/t] 开关[/h]) do set "%%a="
- rem 环境初始化
-
- for %%a in (%*) do (
- set "开关="
- if %%a gtr / if %%a lss : set 开关=true
- if defined 开关 (
- set 开关[%%a]=true
- ) else (
- if not defined 源文件夹 (
- set "源文件夹=%%~dpa"&set "源文件名=%%~nxa"
- if exist %%~a\nul (
- set "源文件夹=%%~a\"&set "源文件名=*"
- )
- ) else (
- set "目标文件夹=%%~fa"
- set "目标文件夹=%%~dpa"&set "目标文件名=%%~nxa"
- if exist %%~a\nul (
- set "目标文件夹=%%~fa\"&set "目标文件名="
- )
- )
- )
- )
- rem 解析开关和源文件夹、目标文件夹
-
- if defined 开关[/h] echo call :xcopy [/s] [/t] [/y] [/h] 源文件夹 目标文件夹&exit /b
- if defined 开关[/y] (set 开关[/y]=/y) else (set 开关[/y]=/-y)
- if defined 开关[/s] set 开关[/s]=/r /d
- if defined 开关[/t] set 开关[/s]=/r /d&set 开关[/t]=rem
- rem 为各开关设置宏
-
- if not defined 源文件夹 exit /b 1
- if not defined 源文件名 set "源文件名=*"
- if not defined 目标文件夹 set "目标文件夹=."
- if not exist %目标文件夹% md "%目标文件夹%"||exit /b 1
- rem 为未指定的 源文件夹 与 目标文件夹 变量做默认操作
-
- for /f "tokens=31 delims=\" %%a in (
- "%源文件夹%\30\29\28\27\26\25\24\23\22\21\20\19\18\17\16\15\14\13\12\11\10\9\8\7\6\5\4\3\2\1\0"
- ) do set 源文件夹深度=%%a
- rem 获取目标文件夹深度
-
- pushd "%源文件夹%"
- rem 切换路径
-
- (for %开关[/s]% %%a in (%源文件名%) do (
- for /f "tokens=%源文件夹深度%* delims=\" %%b in ("%%a") do (
- md "%目标文件夹%%%c" >nul
- %开关[/t]% copy %开关[/y]% "%源文件夹%%%c\%源文件名%" "%目标文件夹%%%c\%目标文件名%"
- )
- )) 2>nul
- rem 核心代码
-
- popd
- exit /b
复制代码
|