为什么使用XCOPY复制* .txt文件会使它们变空?

时间:2017-10-25 23:04:04

标签: batch-file xcopy

我在使用Java编程时使用此批处理脚本,以避免使用类文件混乱我的文件夹。但由于某种原因,它无法复制* .txt文件。

在将其复制到另一个文件夹之前,这是一个* .txt文件内容:

U 450
I 100
I 5000
U 500

批处理文件包含:

@echo off
set TEST=%1
mkdir %TEST%Folder
xcopy *.txt %TEST%Folder
xcopy %TEST%.java %TEST%Folder
cd %TEST%Folder
javac -encoding utf8 %TEST%.java
java %TEST%
cd..
::RD /S /Q %TEST%Folder //is commented out while I'm debugging 

这是复制文件的内容:

 

它是空的。

奇怪的是,如果我自己运行xcopy *.txt DestinationFolder,它就可以正常工作。

编辑: %1变量是程序将编译的java的名称,我的所有路径都设置正确,这部分代码工作正常,唯一有问题的部分是xcopy

2 个答案:

答案 0 :(得分:0)

作为第一个参数传递给使用%1引用的批处理文件的字符串在此问题上最为重要。不幸的是,这个字符串没有发布。

我建议使用这个批处理文件:

@echo off
if "%~1" == "" goto :EOF
%SystemRoot%\System32\xcopy.exe *.txt "%~1Folder\"   /I /C /K /Q /R /Y >nul
%SystemRoot%\System32\xcopy.exe "%~1.java" "%~1Folder\" /C /K /Q /R /Y >nul
pushd "%~1Folder"
javac.exe -encoding utf8 "%~1.java"
java.exe "%~1"
popd
rem rd /S /Q "%~1Folder" & rem Is commented out while I'm debugging.

在第二行,检查是否根据参数字符串调用批处理文件,如果不是这种情况,则批处理正在退出。有关详细信息,请参阅答案:Where does GOTO :EOF return to?

上面的批处理文件引用第一个参数字符串,可能存在的周围双引号总是被删除,因为参数字符串与其他字符串连接成命令和可执行文件的新参数字符串。没有或包含空格或其中一个字符&()[]{}^=;!'+,`~的路径的文件/文件夹名称要求在完整参数字符串周围使用双引号。

建议在批处理文件中指定可执行文件,并始终使用文件扩展名,并且可执行文件的路径也是完整路径,因为这会使批处理文件独立于环境变量PATH和{的当前值{1}}。这就是使用完整路径和文件扩展名指定PATHEXT两次的原因。 xcopyjavac仅使用文件扩展名指定,因为我不知道Windows计算机上的存储位置。因此,Windows命令解释器必须使用环境变量java找到这两个可执行文件。

如果目标文件夹尚不存在,

XCOPY 可以创建指定目标文件夹的整个目录结构。因此,不必首先显式创建目标文件夹。

XCOPY 可用于将单个文件,多个文件或整个目录结构复制到单个文件,多个文件或目录。 XCOPY 的挑战是如果用户指定了文件名或目录名,就会找到目的地。

如果目标/目标字符串中的最后一个反斜杠之后有PATH?,则目标将被解释为文件名模式。例如,使用*

如果目标字符串以反斜杠结尾,则目标将被解释为目录名。

但是如果目标字符串不包含xcopy *.txt "%TEMP%\*.tmp"?(在最后一个反斜杠之后)并且也没有以反斜杠结尾,那么对于 XCOPY 则不清楚target string指定目录或文件。

在复制多个文件时,即在源字符串中使用*?,选项*告诉 XCOPY 目标是目录名称,即使目标字符串不以反斜杠结尾。因此,第一个 XCOPY 命令行也可以在目标字符串/I末尾没有反斜杠。

但是在复制单个文件的第二个 XCOPY 命令行中,选项%~1Folder\的使用没有任何帮助,因为 XCOPY 会提示用户,如果destination指定文件或目录。这就是目标文件夹路径末尾反斜杠的原因,以避免出现此提示。

命令 PUSHD 在堆栈上推送当前目录的路径,并将指定的目录设置为新的当前目录。如果默认情况下启用了命令扩展,则即使对于使用UNC路径指定的目录也是如此,因为在这种情况下, PUSHD 会动态地为UNC文件夹路径分配驱动器号。命令 POPD 从堆栈弹出目录路径,并将此目录再次设置为当前目录。我只能假设这是该任务的正确当前目录管理。

我建议在第一行/I更改为@echo off的情况下测试此批处理文件,方法是在命令提示符窗口中运行它,当前目录设置正确,而不是双击它以查看Windows命令解释器实际上是在批处理文件中预处理每个命令行之后执行的,并且可能根据第一个参数字符串输出错误消息。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • @echo ON ...解释call /?
  • %~1 ...解释何时文件/目录名称或任何其他参数字符串必须用双引号括起来。
  • cmd /?
  • echo /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • rd /?
  • rem /?

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解xcopy /?

的说明

答案 1 :(得分:-1)

重新安装Windows,将解决所有问题