13

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. 在上面没有任何目标的情况下尝试过

我有一个xcopy迭代调用的脚本,所以我C:\destinationfolder\many java files没有任何目录结构。

A. 是的,我已xcopy /?查看所有选项

B./T也不创建任何空目录结构

C. 我无法进入源文件夹a\b\c\d\并运行xcopy . <dest>

4

6 回答 6

8

更新

我删除了我之前关于 using 的答案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.

于 2011-11-29T12:13:49.650 回答
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*

于 2011-11-29T15:18:20.833 回答
2

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

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

希望这可以帮助!

于 2011-11-30T09:32:58.450 回答
1

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

您可以使用:

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

C:\sourcefolder\oops\something.java请注意,这可能具有复制toC:\destinationfolder\oops\something.java以及something*.javaunder的任何其他匹配项的副作用C:\sourcefolder\

于 2011-11-30T21:58:53.840 回答
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 上的后续运行中起作用。

于 2018-08-07T16:04:42.540 回答
1

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

你有 C:\MyJavaStuff\A\B\C\D\something.java - 那是你的source。你想在 C:\destinationfolder 中而不是在 C:\destinationfolder\A\B\C\D 中得到 something.java - 所以这就是你的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 下还有其他文件(和文件夹),它们也会被复制。

于 2018-08-07T16:33:52.540 回答