检查文件是否存在于不同目录中并做出相应响应

时间:2014-12-04 13:17:09

标签: batch-file

我想在一天中的给定时间向ftp服务器发送一个未定义数量的文件。发送文件后,我想将它们保存到另一个目录,然后从上一个目录中删除它们。像这样:

ftp -i -s:SendFile.scr serverIp
copy log*.txt C:\Reg\Archives
del log*.txt

这个.bat有效,但它没有考虑到要复制的文件是否已经存在于Archives目录中,原件被删除了,我需要两个要附加的文件。所以,我写了:

ftp -i -s:SendFile.scr 213.13.123.68
IF EXIST C:\Users\Miguel\Archives\tes*.txt
(
    copy /a C:\Users\Miguel\Archives\tes*.txt +  C:\Users\Miguel\tes*.txt  C:\Users\Miguel\Archives\tes*.txt
)
ELSE 
(
    copy tes*.txt  C:\Users\Miguel\Archives
)
del tes*.txt

然而这不起作用,我也想过cd目录并从那里做,但我似乎无法想到正确的方法来做到这一点。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

根据档案目录中同名文本文件的存在,使用此代码附加或仅复制文本文件。

@echo off
for %%I in ("%USERPROFILE%\tes*.txt") do (
    if exist "%USERPROFILE%\Archives\%%~nxI" (
        copy /B "%USERPROFILE%\Archives\%%~nxI" + "%%~I" "%USERPROFILE%\Archives\%%~nxI" >nul
    ) else (
        copy /B "%%~I" "%USERPROFILE%\Archives" >nul
    )
    del /Q "%%~I"
)

此处使用命令FOR按文件处理目录文件中的所有tes * .txt文件。您可以获得有关命令的帮助 FOR 也可以在命令提示符窗口中输入for /?help for

%%~I引用整个文件名,文件的完整路径接下来要处理,不带双引号。

%%~nxI仅引用文件名和文件扩展名,而不包含要处理的文件的路径。

使用

/B(二进制文件)代替/A(ASCII文件),以避免在追加时将^Z附加到目标文件的末尾。 ^Z是一个十六进制值为1A的字节,表示文件结束。

注意:

用于将文件追加到另一个文件的命令 copy 永远不会检查现有文件是否以行终止符(回车符+换行符)结束,然后在附加其他文件时使用{ {1}}。因此,请确认您的tes * .txt文件始终以行终止符结束,否则可能会发生档案目录中现有文件的最后一行与追加源文件的第一行合并在一起。

示例:

/A%USERPROFILE%\Archives\test2014336.txt结尾,并且在文件末尾没有行终止。

No error.%USERPROFILE%\test2014336.txt开头,并且在文件开头没有行终止。

在附加

后,文件Results for ...将包含在这种情况下
%USERPROFILE%\Archives\test2014336.txt

而不是

No error.Results for ...