0

我一直在努力尝试让下面的(示例)批处理文件在 Windows XP SP3 上运行。该IF NOT EXIST部分似乎有效,但"Does <path\filename.ext> specify a file name or directory name on the target"尽管使用了以下/I标志,我仍然收到消息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 上。

有任何想法吗?

4

3 回答 3

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 来复制单个文件 - 这既过分杀伤力,也充满了小问题,例如提示它是文件还是目录。

于 2013-04-30T20:09:25.493 回答
0

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

  1. 回声 F | xcopy ....(将“F”答案提供给 xcopy)
  2. 复制 ....(您不需要对单个文件使用 xcopy)
于 2013-04-30T20:11:13.683 回答
0
 echo f|XCOPY "\\SERVER\PATH\TO\ORIG FILE\FILE TEMP.XLSM" "\\SERVER\PATH\TO\FILE DIR\FILE FINAL.XLSM"

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

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

于 2013-04-30T21:10:16.710 回答