BATCH文件要求input文件或文件夹

我有一个从我书桌20公里的文件丢失的文件的简单副本

当testing脚本出我提示如果我的文件shapes.atc是一个文件或文件夹

我可以告诉你,它的一个文件,但我怎么能自动复制我的家伙需要能够只点击批处理完成

 xcopy /s/y 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\Shapes.atc 

一个看似没有logging的技巧是把*放在目的地的末尾 – 然后xcopy将复制为一个文件,就像这样

 xcopy c:\source\file.txt c:\destination\newfile.txt* 

echo f | xcopy ... echo f | xcopy ...技巧在Windows的本地化版本上不起作用,其中提示符不同。

其实xcopy不问你是否存在原始文件,但是如果你想把它放在一个名为Shapes.atc的新文件夹中,或者在文件夹Support(这是你想要的。

为了防止xcopy提出这个问题,只要告诉他目标文件夹,所以没有任何含糊之处:

 xcopy /s/y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support" 

如果你想改变目的地的文件名,只需使用copy(复制文件时比xcopy更适合):

 copy /y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support\Shapes-new.atc 
 echo f | xcopy /s/y 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\Shapes.atc 

真正的技巧是:在复制文件的目标path的末尾使用反斜杠。 / Y用于覆盖现有文件,如果不需要警告的话。

例:

 xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\" 

/ i开关可能是你之后的东西。

从xcopy /?

/ I如果目标不存在并复制多个文件,则假定目标必须是目录。

当新扩展缩短时,可以使附加“*”的技巧工作。 您需要使用空格填充新的扩展名,这只能通过将目标文件名用引号括起来。 例如:

 xcopy foo.shtml "foo.html *" 

这将复制和重命名而不提示。

“这不是一个错误,这是一个function!” (我曾经在微软的停车场里看到过一个VW甲壳虫的“FEATURE”)。这些重命名的语义一直回到我写DOS v.1的时候。 除非新名称中包含通配符(?或*),否则新名称中的字符将逐个replace旧名称中的字符。 不添加空白到新名称,其余字符从旧名称复制。

那么, 就我刚才所说的任务而言,根据安迪·莫里斯 ( Andy Morris)的不完整的build议,最好的解决办法可能是下面的命令:

 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 …是(OS语言无关)覆盖现有文件
  • /R …覆盖也只读,隐藏和系统文件
  • /S …从指定的目录和所有子目录。

那么,我不知道这里是否真的需要/S ,因为目前还不清楚J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc应该被复制或者在目录的任何地方find了所有的Shapes.atc J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file

可以通过打开一个命令提示符窗口并从该窗口内运行xcopy /?来读取参数的解释xcopy /? 得到输出XCOPY的帮助。


但是所提供的解决scheme都不适用于文件复制任务,在这个任务上应该将单个文件复制到与源文件相同的目录中,但由于当前的date和时间而具有不同的文件名,所以在文件扩展名之前插入文件名中。

源文件可以具有隐藏或系统属性设置,排除了COPY命令的用法。

用于创build时间戳文件的batch file也应该在不包括ROBOCOPY的 Windows XP上工作,因为默认情况下在Windows XP上不可用。

该batch file应该可以处理任何文件,包括非典型的文件,如.gitconfig.htaccess ,这些文件是没有文件扩展名的文件,以一个点开始,将它们隐藏在* nix系统上。 Windows命令处理器将这样的文件解释为没有文件名且仅具有文件扩展名的文件,这是因为规则:上一点之后的所有内容都是文件的扩展,并且最后一点之前的所有内容都是文件名。

有关完整的任务描述和最终的完整评论的解决scheme,请参阅文章在UltraEdit论坛中创build文件的备份副本 。

Patrick , Tirtha R , Interociter Operator和CharlesB的解决scheme不起作用,因为如果目标文件尚不存在,使用/Y不会避免文件或目录提示。

Andy Morris'和grenix的解决scheme不能用于单个文件复制任务,因为目标必须是目标文件的名称而不是目标目录的名称。 目标目录与源目录相同,但目标文件的名称与源文件的名称不同。

DosMan和Govert的解决scheme不适用于从一个点开始并且没有文件扩展名的文件。

例如命令

 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的解决scheme有一个限制,即必须知道操作系统语言相关的字符,用于文件或目录提示的自动应答。

所以我想到了在英文Windows上获得F for File的方法,或者在德语Windows上为Datei获得了D的方法? 为…自动启动Windows。

确实可以确定自动回答提示的语言相关字符。

黑客用于从提示文本中获取与语言相关的信件,而不真正复制任何文件。

命令XCOPY用于开始将batch file自身复制到临时文件的文件夹,文件扩展名为目标文件的TMP。 如果在临时文件文件夹中不存在具有该名称的文件,则这会导致XCOPY的提示。

设备NULL的处理程序用作XCOPY的input处理程序,导致XCOPY输出提示两次后中断复制过程。

该输出在FOR循环中处理,该循环从第一行退出,并以左括号开头。 这是第二个字符定义用于指定目标是文件的字母的行。

这是一个batch file,使用XCOPY代码来确定自动回答文件或目录提示的所需字母,以便在源文件的同一目录中创build单个文件的时间戳副本,即使源文件是隐藏的或系统文件,即使源文件以点开始并且没有文件扩展名。

 @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上进行了testing。

查看post在UltraEdit论坛中创build一个文件的备份副本,用于解释批处理代码所有部分的类似的完全注释的batch file。

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
  • wmic OS get /?
  • xcopy /?

此外,有关使用命令redirect操作符的Microsoft文章也应该阅读。

引用XCopy强制文件

为了强制文件,我们可以使用pipe道“echo F |”

 C:\Trash>xcopy 23.txt 24.txt Does 24.txt specify a file name or directory name on the target (F = file, D = directory)? C:\Trash>echo F | xcopy 23.txt 24.txt Does 24.txt specify a file name or directory name on the target (F = file, D = directory)? F C:23.txt 1 File(s) copied 

对于强制文件夹,我们可以使用/ i参数进行xcopy或在目标文件夹末尾使用反斜杠()。

 xcopy /s/y 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\*.*" 

..应该这样做。

好主意做一个:

 IF NOT EXIST "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\Shapes.atc" ECHO/ && ECHO/ && ECHO * * * * * COPY FAILED - Call JustME at 555-555-1212 && ECHO/ && pause 

(假设你已经完成了旧版本的重命名.old)

 XCOPY /Z <----- restartable mode - good for large files. 

虚拟的父母把戏

假设你有你的源文件和目标文件

 %SRC_FILENAME% and %DST_FILENAME% 

你可以使用2步法:

 @REM on my win 7 system mkdir creates all parent directories also mkdir "%DST_FILENAME%\.." xcopy "%SRC_FILENAME% "%DST_FILENAME%\.." 

这将被解决为例如

 mkdir "c:\destination\b\c\file.txt\.." @REM The special trick here is that mkdir can create the parent @REM directory of a "virtual" directory (c:\destination\b\c\file.txt\) that @REM doesn't even need to exist. @REM So the directory "c:\destination\b\c" is created here. @REM mkdir "c:\destination\b\c\dummystring\.." would have the same effect xcopy "c:\source\b\c\file.txt" "c:\destination\b\c\file.txt\.." @REM xcopy computes the real location of "c:\destination\b\c\file.txt\.." @REM which is the now existing directory "c:\destination\b\c" @REM (the parent directory of the "virtual" directory c:\destination\b\c\file.txt\). 

当我偶然发现从构build过程生成的命令行中的一些非常狂野的../..-构造时,我意识到了这一点。

我有完全相同的问题,为了备份的目的,要将文件复制到外部硬盘驱动器。 如果我想复制一个完整的文件夹,那么COPY非常乐意创build目标文件夹并用所有文件填充它。 但是,我想每天复制一次文件,并将今天的date添加到文件中。 COPY很高兴复制文件并以新格式重新命名,但只有目标文件夹已经存在。

我的复制命令是这样的:

COPY C:\ SRCFOLDER \ MYFILE.doc D:\ DESTFOLDER \ MYFILE_YYYYMMDD.doc

就像你,我四处寻找替代开关或其他复制types的命令,但没有真正的工作,像我想要的。 然后,我想通过在复制命令之前简单地添加一个make目录(MD或MKDIR)命令来分解两个不同的需求。

所以现在我有

MKDIR D:\ DESTFOLDER

COPY C:\ SRCFOLDER \ MYFILE.doc D:\ DESTFOLDER \ MYFILE_YYYYMMDD.doc

如果目标文件夹不存在,则创build它。 如果目标文件夹确实存在,则会生成一条错误消息。但是,这不会停止batch file继续执行复制命令。

错误消息说:一个子目录或文件D:\ DESTFOLDER已经存在

正如我所说,错误消息不会停止batch file的工作,这是一个非常简单的解决scheme的问题。

希望这有助于。