2010-11-26 167 views
57

我有一个简单的复制,从脚本为谁是从我的办公桌上缺少一个文件20公里我们的球员之一批处理文件要求提供的文件或文件夹

测试脚本时出提示我,如果我的文件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 
+1

使用管道命令 – 2016-03-12 10:52:51

回答

10
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 
+0

我有一个类似的问题涉及.zip文件,而不是.atc,这是在这里发布的3实际工作的唯一答案。 – 2012-07-23 15:44:44

+2

此解决方案可能无法在某些Windows本地化上运行。或者,您可以将星号附加到目标文件名,并且xcopy不会询问任何内容。在这里稍微详细一点:http://stackoverflow.com/a/14022309/532647。 – 2013-01-29 12:00:46

+1

虽然这在本地化上打破了,但它是使用管道的一个很好的例子。 – 2015-05-20 21:44:23

17

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

为了防止XCOPY从问这个,只是告诉他的目标文件夹,所以没有歧义:

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

如果你想改变目标文件名只使用拷贝(这是比XCOPY时更适应复制文件):

copy /y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support\Shapes-new.atc 
+1

对于`copy`而不是`xcopy`建议:) – 2013-12-24 16:26:34

+9

但是`copy`当然不会创建路径,如果它不存在的话。 – 2014-04-29 13:28:00

3

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

从xcopy /?

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

151

一个看似无证窍门是把一个*目的地结束 - 那么xcopy将复制的文件,像这样

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

echo f | xcopy ...招不上的Windows,其中的本地化版本工作提示是不同的。

0
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. 
0

虚拟母招

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

%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\). 

我来到这个想法时,我绊了一些非常疯狂../..-在构建过程中生成的命令行中构造。

2

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

xcopy foo.shtml "foo.html *" 

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

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

7

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

例子:

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

嗯,如要求通过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是(OS语言无关)..覆盖也是只读,隐藏和系统文件
  • /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命令。

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

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

欲了解完整的任务描述和最终完整评论的解决方案,请参阅UltraEdit论坛中的文章Create a backup copy of files

Patrick'sTirtha R'sInterociter Operator'sCharlesB's解决方案不起作用,因为使用/Y不避文件或目录的提示,如果目标文件不存在。

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

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

所以我想到的方法来自动获取F文件在英语Windows或DDatei上德语Windows或?为... ...上的Windows。

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

黑客攻击被用来从提示文本依赖于语言的信件并没有真正复制任何文件。

命令XCOPY用于开始将批处理文件自身复制到临时文件的文件夹,文件扩展名为目标文件的TMP。这导致提示符XCOPY如果没有已经在临时文件夹这个名字,这是非常不可能的文件。

NULL被用作输入处理程序为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应该读了。

2

引用XCopy Force File

迫使文件,我们可以使用管道“回声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或使用反斜杠()在目的地文件夹的结尾。

0

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

我的复制命令是这样的:

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

你一样,我四处寻找替代交换机或其它副本键入命令,但没有真正的工作,就像我想要的那样。 然后,我想通过在复制命令之前添加一个make目录(MD或MKDIR)命令来拆分两个不同的需求。

所以现在我有

MKDIR d:\ DESTFOLDER

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

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

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

正如我所说,该错误信息不会停止批处理文件的工作,这是一个非常简单的解决问题的办法。

希望这可以帮助。

相关问题