2013-04-30 272 views
0

我一直在努力尝试让下面的(例如)批处理文件在Windows XP SP3上工作。该IF NOT EXIST部分似乎工作,但我一直收到"Does <path\filename.ext> specify a file name or directory name on the target"消息,尽管使用/I国旗XCOPYWindows XP批处理IF和XCOPY

@IF NOT EXIST "\\SERVER\PATH\TO\FILE DIR" (
     MKDIR "\\SERVER\PATH\TO\FILE DIR" 
     XCOPY "\\SERVER\PATH\TO\ORIG FILE\FILE TEMP.XLSM" "\\SERVER\PATH\TO\FILE DIR\FILE FINAL.XLSM" /I 
    ) ELSE (
     XCOPY "\\SERVER\PATH\TO\ORIG FILE\FILE TEMP.XLSM" "\\SERVER\PATH\TO\FILE DIR\FILE FINAL.XLSM" /I 
    ) 

我的理解是,与/I开关,XCOPY应该创建的目录结构,如果它不存在 - 至少当我没有指定文件名的时候它会这样。不幸的是,对于这个项目的需求,我必须指定一个文件名,并且不能保留原始文件,因为它是一个模板文件,每天都会通过自动化过程进行操作。

所以,我试图让周围XCOPY的问题,而不是通过检查路径的存在现有的目录路径,如果它不存在,与MKDIR命令来创建它,然后复制文件 - 但XCOPY仍然会提示目标是否是文件或目录,这是没有道理的,但也许我错过了一些东西。

只是要清楚,这是在Windows XP SP3。

任何想法?

回答

0

您可能会发现更容易做这样的事情:

md "\\SERVER\PATH\TO\FILE DIR" 2>NUL 
copy "\\SERVER\PATH\TO\ORIG FILE\FILE TEMP.XLSM" "\\SERVER\PATH\TO\FILE DIR\FILE FINAL.XLSM" 

最初的“MD”会尝试创建目录。如果它已经存在,它会向STDERR输出一条错误信息。该2>NUL重定向到Windows的内置“空设备”,这就是说,它只是吞下错误信息。假设你有适当的权限,你可以确定这个目录现在存在。

复制命令只是复制您的文件。不需要使用xcopy来复制单个文件 - 这既是矫枉过正又充满了小问题,比如提示它是文件还是目录。

+0

我没有使用'COPY',因为上次我尝试使用UNC路径时会抛出一个错误,并且不会让我。这就是说,我只是试过这个,它的工作原理。我的理解是'XCOPY'更适合在NTFS卷之间复制文件 - 显然这是不正确的。我怪我的IT组织。 – DigitalNoise 2013-04-30 21:46:35

+0

很高兴你能工作。一般来说,'xcopy'最适用于复制整个目录树,而'copy'只是复制文件的一部分。 :-) 不要忘记把你的问题标记为答案! – Mark 2013-04-30 21:52:35

0

由于目标文件在复制之前不存在,因此xcopy无法确定是否需要创建一个名为“FILE FINAL.XLSM”的新目录,并将文件放在该目录中。顺便说一下,由于您已经创建了目标目录,因此您不需要xcopy上的/ I。这里有几种方法可以做你想做的事:

  1. echo F | XCOPY ......(喂“F”的答案XCOPY)
  2. 副本......(你不需要使用XCOPY单个文件)
0
echo f|XCOPY "\\SERVER\PATH\TO\ORIG FILE\FILE TEMP.XLSM" "\\SERVER\PATH\TO\FILE DIR\FILE FINAL.XLSM" 

要复制的文件并创建目录。不知道为什么指定“这是一个文件”的选项不可用,但RTFM - /i开关仅在复制多个文件时有效,并且指定\作为目标名称的最后一个字符告知XCOPY在任何情况下目标是一个目录名,所以/i sems多余。

但是,如果您遵循copy路线,请小心。一般来说,使用copy /b会更好,因为普通copy可能无法正确复制某些文件类型(如.MPG) - 它可能会停止在第一个^ Z上。然而,copy /b看起来很安全。