xcopy不会创建目录结构

时间:2011-11-29 05:58:23

标签: batch-file windows-xp copy xcopy

我在Windows XP Professional中对xcopy有一个奇怪的问题。我不知道它是否是一个愚蠢的问题,因为我只指定一个文件作为源,所以我是否应该期待任何其他行为?就是这样:

我正在使用xcopy <src> <dest> /s/y

<src>=C:\sourcefolder\a\b\c\d\something.java

<dest>=C:\destinationfolder

现在xcopy复制文件但不在\a\b\c\d\内创建目录结构C:\destinationfolder

我想要的是C:\destinationfolder\a\b\c\d\something.java

我得到的是C:\destinationfolder\something.java


  1. 我已尝试通过为目标文件夹指定C:\destinationfolder来在目标文件夹.中运行它
  2. 在上面没有任何目标的情况下尝试了它
  3. 我有一个脚本,它迭代地调用xcopy所以我留下了C:\destinationfolder\many java files没有任何目录结构。

    一个。是的,我已经xcopy /?查看了所有选项

    B中。 /T也不会创建任何空目录结构

    ℃。我无法访问源文件夹a\b\c\d\并运行xcopy . <dest>

6 个答案:

答案 0 :(得分:8)

更新

我删除了之前使用ROBOCOPY的答案。我相信以下内容将使用XCOPY执行您想要的操作。

假设您的文件夹结构如下:

SOURCE = C:\MyJavaStuff\A\B\C\D\something.java
DEST   = C:\MyDestination

像这样运行XCOPY

XCOPY C:\MyJavaStuff\something*.java C:\MyDestination /S /E

请注意*中的something*.java

答案 1 :(得分:3)

问题是您要指定要在源中复制哪个文件。在这种情况下,xcopy不会创建文件夹结构。但是,如果您将对xcopy的调用更改为

xcopy *.java C:\myfolder /s/y

它也将复制.java文件和文件夹结构。您需要为此调用指定通配符才能按预期工作。如果您只想复制特定文件,则必须将调用调整为xopy,例如:

xcopy something.jav* C:\myfolder /s/y

修改

您说您从另一个命令获取要复制的文件列表。如果您可以在文本文件中输出此文件列表,则可以执行以下操作:

FOR /F "tokens=* delims=," %F in (d:\test\list.txt) DO xcopy src\%~nxF* .\dest /S /Y

这个命令的作用是读取一个文本文件(本例中为“d:\ test \ list.txt”),读取每一行,对于每个文件,运行xcopy,在文件名末尾添加一个通配符确保它创建文件夹结构。

我在这里假设:

  • 您可以在文本文件中获取文件列表,只包含文件名(最好是路径)
  • 您知道源文件夹(示例中为“C:\ sourcefolder”,文件夹结构“a \ b \ c \ d”不需要知道)并且可以在FOR命令中使用它

您还可以使用以下表格:

FOR /F "tokens=* delims=," %F in ('cmd') DO xcopy src\%~nxF* .\dest /S /Y

其中 cmd 需要替换为您用来生成要复制的文件列表的命令。

请注意,如果您在批处理文件中使用此FOR命令,则需要将%F替换为%%F(并将%~nxF*替换为%%~nxF*)。

答案 2 :(得分:2)

我查看了xcopy开关,您可以使用/ T复制目录结构,虽然这不会复制空目录,您可以用/ E覆盖它。所以你的命令看起来像这样:

xcopy C:\sourcefolder\a\b\c\d\something.java C:\destinationfolder /T /E /S /Y

希望这有帮助!

答案 3 :(得分:1)

为了得到C:\destinationfolder\a\b\c\d\something.java,XCOPY需要知道有多少C:\sourcefolder\a\b\c\d\something.java要复制。

您可以使用:

C:
cd \sourcefolder
XCOPY something.java* C:\destinationfolder\ /S

请注意,这可能会产生副作用,同时将C:\sourcefolder\oops\something.java复制到C:\destinationfolder\oops\something.java以及something*.javaC:\sourcefolder\的任何其他匹配。

答案 4 :(得分:1)

我使用xcopy编写了非常相似的批处理文件。也许我所做的会为您提供帮助。

这是我使用的命令:

xcopy "c:\Data Files\Dave's Data\*.*"   "m:\Dave's Data"      /R/D /E/H

在这种情况下,源上的Dave数据包含整个目录树,其中包含至少50,000个文件和超过75GB的数据。它可以在Windows XP上完美运行

我发现/T是不必要的,因为复制了目录树。我还发现/S是不必要的,因为/E复制了目录和子目录,包括空目录。我添加了/R来复制和覆盖目标上的只读文件。 /H复制了隐藏目录。 /D仅复制了较新的文件。我将其用作数据的日常备份工具。

我唯一的问题是,此命令将首次在Windows 7上运行,而当目标目录树存在时,它将在后续运行中不起作用。我怀疑这是由于特权问题引起的,因为xcopy命令将在cmd.exe窗口中的Windows 7上的后续运行中起作用。

答案 5 :(得分:1)

在我看来,xcopy通常用于复制目录树,而不是单个文件(尽管它可以工作)。并且,xcopy将在 target 文件夹中 source 文件夹下的 下重新创建目录结构。如果为xcopy提供了/ i开关,则将 target 文件夹假定为目录。即使不存在多个父项,也要创建它。

您有C:\ MyJavaStuff \ A \ B \ C \ D \ something.java-这是您的。您想要得到一个something.java而不是C:\ destinationfolder,而是C:\ destinationfolder \ A \ B \ C \ D-因此,这就是您的 target 。您甚至没有C:\ destinationfolder。可以,使用/ i将创建整个路径。

xcopy /i c:\MyJavaStuff\A\B\C\D\something.java C:\destinationfolder\A\B\C\D

如果something.java是C:\ MyJavaStuff下的唯一文件,您也可以使用

xcopy /sei c:\MyJavaStuff C:\destinationfolder

这将重新创建整个树结构,并复制文件。但是,如果MyJavaStuff下还有其他文件(和文件夹),它们也将被复制。