好吧,对于just me 提出的任务,根据Andy Morris 的不完整建议,也许最好的解决方案是以下命令:
xcopy "J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc" "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\" /Q /R /S /Y
这适用于这个简单的文件复制任务,因为
- 仅指定目标目录而不是目标文件和
- 用反斜杠结束目标目录,这一点非常重要,否则 XCOPY 甚至会在
/I 提示输入文件或目录时仅复制一个文件。
与问题无关的其他参数有:
-
/Q ... 安静
-
/Y ... 是(与操作系统语言无关)覆盖现有文件
-
/R ... 也覆盖只读、隐藏和系统文件
-
/S ...来自指定目录和所有子目录。
好吧,我不知道这里是否真的需要/S,因为目前还不清楚是应该复制J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc,还是应该在J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file 的目录树中的任何位置找到所有Shapes.atc。
可以通过打开命令提示符窗口并在此窗口中运行xcopy /? 来阅读参数说明,以获取XCOPY 的帮助输出。
但所提供的解决方案均不适用于文件复制任务,在该任务中,应将单个文件复制到与源文件相同的目录中,但由于当前日期和时间在文件扩展名之前的文件名中插入了不同的文件名,因此文件名不同.
源文件可以设置隐藏或系统属性,不包括 COPY 命令的使用。
用于创建时间戳文件的批处理文件应该也可以在不包括 ROBOCOPY 的 Windows XP 上工作,因为默认情况下在 Windows XP 上不可用。
批处理文件应该适用于任何文件,包括非典型文件,如.gitconfig 或.htaccess,这些文件没有文件扩展名,以在 *nix 系统上隐藏它们的点开头。 Windows 命令处理器将此类文件解释为没有文件名且只有文件扩展名的文件,因为最后一点之后的所有内容都是文件的扩展名,最后一点之前的所有内容都是文件名。
有关完整的任务描述和最终的完整评论解决方案,请参阅 UltraEdit 论坛中的帖子Create a backup copy of files。
Patrick's、Tirtha R's、Interociter Operator's 和 CharlesB's 解决方案不起作用,因为如果目标文件不存在,使用 /Y 不会避免文件或目录提示。
Andy Morris' 和grenix's 解决方案不能用于单个文件复制任务,因为destination 必须是目标文件的名称,而不是目标目录的名称。目标目录与源目录相同,但目标文件名与源文件名不同。
DosMan's 和 Govert's 解决方案根本不适用于以点开头且没有文件扩展名的文件。
例如命令
xcopy C:\Temp\.gitconfig C:\Temp\.gitconfig_2016-03-07_15-30-00* /C /H /K /Q /R /V /Y
执行时会出现以下错误消息:
英文:无法扩展第二个文件名以匹配第一个。
德语:Zweiter Dateiname konnte nicht so erweitert werden, dass er zum ersten passt。
最后Denis Ivin's 解决方案的限制是必须知道用于自动回答文件或目录提示的操作系统语言相关字符。
所以我想到了在英语 Windows 上为 File 获取 F 或在德语 Windows 上为 Datei 获取 D 或为 ... on 获取 ? 的方法... Windows 自动。
确实有可能确定自动回答提示的语言相关字符。
黑客用于从提示文本中获取与语言相关的字母,而无需真正复制任何文件。
命令 XCOPY 用于开始将批处理文件本身复制到临时文件的文件夹中,文件扩展名为目标文件的 TMP。如果临时文件夹中还没有具有该名称的文件,这将导致 XCOPY 提示,这不太可能。
设备 NUL 的处理程序用作 XCOPY 的输入处理程序,导致 XCOPY 输出提示后中断复制过程两次。
此输出在 FOR 循环中处理,该循环在第一行以左括号开始退出。这是第二个字符定义用于指定目标是文件的字母的行。
这是一个批处理文件,它使用 XCOPY 代码来确定自动回答文件或目录提示所需的字母,从而在与源文件,即使源文件是隐藏文件或系统文件,即使源文件以点开头且没有文件扩展名。
@echo off
rem Batch file must be started or called with name of a single file.
if "%~1" == "" exit /B
for /F "delims=*?" %%I in ("#%~1#") do if not "%%I" == "#%~1#" exit /B
if not exist "%~1" exit /B
if exist "%~1\" exit /B
setlocal EnableDelayedExpansion
rem Determine the character needed for answering prompt of
rem XCOPY for destination being a file and not a directory.
del /F "%TEMP%\%~n0.tmp" 2>nul
for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%~f0" "%TEMP%\%~n0.tmp" ^<nul') do (
set "PromptAnswer=%%I"
if "!PromptAnswer:~0,1!" == "(" (
set "PromptAnswer=!PromptAnswer:~1,1!"
goto CopyFile
)
)
echo ERROR: Failed to determine letter for answering prompt of XCOPY.
exit /B
:CopyFile
rem This is a workaround for files starting with a point and having no
rem file extension like many hidden files on *nix copied to Windows.
if "%~n1" == "" (
set "FileNameWithPath=%~dpx1"
set "FileExtension="
) else (
set "FileNameWithPath=%~dpn1"
set "FileExtension=%~x1"
)
rem Get local date and time in region and language independent format YYYYMMDDHHmmss
rem and reformat the local date and time to format YYYY-MM-DD_HH-mm-ss.
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS get LocalDateTime /format:value') do set "LocalDateTime=%%I"
set "LocalDateTime=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2%_%LocalDateTime:~8,2%-%LocalDateTime:~10,2%-%LocalDateTime:~12,2%"
rem Do the copy with showing what is copied and with printing success or
rem an error message if copying fails for example on sharing violation.
echo Copy "%~f1" to "%FileNameWithPath%_%LocalDateTime%%FileExtension%"
for /F %%I in ('echo %PromptAnswer% ^| %SystemRoot%\System32\xcopy.exe "%~f1" "%FileNameWithPath%_%LocalDateTime%%FileExtension%" /C /H /K /Q /R /V /Y') do set "FilesCopied=%%I"
if "%FilesCopied%" == "1" (
echo Success
) else (
echo ERROR: Copying failed, see error message above.
)
此批处理代码已在德语 Windows XP SP3 x86 和英语 Windows 7 SP1 x64 上测试。
请参阅 UltraEdit 论坛中的 Create a backup copy of files 帖子以获取类似的、完整注释的批处理文件,该文件解释了批处理代码的所有部分。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
del /?
echo /?
exit /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?
wmic OS get /?
xcopy /?
还应阅读有关 Using command redirection operators 的 Microsoft 文章。