好吧,对于我所问的任务,根据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
应该复制或全部Shapes.atc
在J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file
.
xcopy /?
可以通过打开命令提示符窗口并在此窗口中运行以获取XCOPY的帮助输出来阅读参数说明。
但是,所提供的解决方案均不适用于文件复制任务,在该任务中,应将单个文件复制到与源文件相同的目录中,但由于当前日期和时间在文件扩展名之前的文件名中插入了不同的文件名,因此文件名不同。
源文件可以具有隐藏或系统属性集,不包括使用COPY命令。
用于创建时间戳文件的批处理文件也应该在不包括ROBOCOPY的 Windows XP 上工作,因为默认情况下在 Windows XP 上不可用。
批处理文件应该适用于任何文件,包括非典型文件,例如.gitconfig
或.htaccess
没有文件扩展名的文件,以在 *nix 系统上隐藏它们的点开头。Windows 命令处理器将此类文件解释为没有文件名且仅具有文件扩展名的文件,因为最后一点之后的所有内容都是文件的扩展名,最后一点之前的所有内容都是文件名。
有关完整的任务描述和最终的、完整评论的解决方案,请参阅帖子在 UltraEdit 论坛中创建文件的备份副本。
Patrick's,Tirtha R's,Interociter Operator's和CharlesB's解决方案不起作用,因为/Y
如果目标文件不存在,则使用不会避免文件或目录提示。
Andy Morris和grenix 的解决方案不能用于单个文件复制任务,因为destination 必须是目标文件的名称,而不是目标目录的名称。目标目录与源目录相同,但目标文件名与源文件名不同。
DosMan和Govert 的解决方案根本不适用于以点开头且没有文件扩展名的文件。
例如命令
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 的解决方案有一个限制,即必须知道用于自动回答文件 OR 目录提示的操作系统语言相关字符。
因此,我考虑了在英语 Windows 上F
获取File或在德语 Windows 上获取 Datei 或D
for ...?
on ... Windows 自动获取的方法。
并且确实有可能确定自动回答提示的语言相关字符。
hack 用于从提示文本中获取与语言相关的字母,而无需真正复制任何文件。
命令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 论坛中创建文件的备份副本以获取类似的、完全注释的批处理文件,该文件解释了批处理代码的所有部分。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
del /?
echo /?
exit /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?
wmic OS get /?
xcopy /?
此外,还应阅读有关使用命令重定向运算符的 Microsoft 文章。