用于检查目标的批处理文件是空的,目标是否具有文件夹路径

时间:2015-11-09 06:22:14

标签: windows batch-file

这是我的批处理文件,我需要将文件复制到一个文件夹中,因为我需要检查目的地,它是否为空,如果它不是空的那么我需要检查目标是否是文件夹(如果destination = dsjffj,则必须退出批处理文件),目标需要有有效的文件夹路径。

if "Destination"=="" (
    set errorlevel=1
    exit /b
) else (
   dir /ad /b "Destination" 1> NUL 2> NUL
   if %ERRORLEVEL% EQU 0 (
   copy "Source" "Destination" /Y
   ) else (
     exit /b
     )
 )

我也引用了一些堆栈溢出链接,但是这个批处理文件正在验证空目的地,但它没有正确检查文件夹

1 个答案:

答案 0 :(得分:0)

避免将值分配给volatile Windows environment variables,例如set errorlevel=1。阅读Dave Benham对setting ERRORLEVEL to 0 question的回复:

  

如果要强制将errorlevel强制为0,则可以使用此方法   完全不直观但非常有效的语法:(call )。空间   在调用之后是至关重要的。如果要将errorlevel设置为1,则为   可以使用(call)。至关重要的是,之后没有任何空间   呼叫

下一个评论的代码段可以提供帮助:

@ECHO OFF
set "sourcefolder=D:\test\fooSrcFldr"
set "targetfolder=D:\test\fooDstFldr"
set "sourcefiles="
rem check source folder existence
if exist "%sourcefolder%\" (
    rem check source folder for its content
    for /F "delims=" %%G in ('dir /B /A "%sourcefolder%\*" 2^>NUL') do (
        set "sourcefiles=%%G"
    )
    rem check whether source folder is empty
    if not defined sourcefiles (
        echo source folder "%sourcefolder%\" is empty
        exit /B 1
    ) 
) else (
    echo source folder "%sourcefolder%\" does not exist
    exit /B 2
)
rem check target folder existence
if exist "%targetfolder%\" (
    rem target folder "%targetfolder%\" exists
) else (
    rem check whether it's possible to create target folder 
    if exist "%targetfolder%" (
        echo cannot create target folder  "%targetfolder%\"
        echo as there exists another file "%targetfolder%" of the same name
        exit /B 3
    ) else (
        echo going to create target folder "%targetfolder%\"
        md "%targetfolder%"
    )
)
rem /L switch: do not copy but merely display items that would be copied
xcopy /E /C /H /R /L "%sourcefolder%\*" "%targetfolder%\"
rem remove /L switch from above line while debugged
exit /B 0

输出(请注意,初始copymd命令仅用于说明常用的简化md "D:\test\fooDstFldr\" 2>NUL是不够的)

==> copy nul "D:\test\fooDstFldr"
        1 file(s) copied.

==> md "D:\test\fooDstFldr\"
A subdirectory or file D:\test\fooDstFldr\ already exists

==> D:\bat\SO\33603488.bat
source folder "D:\test\fooSrcFldr\" does not exist

==> md "D:\test\fooSrcFldr\"

==> D:\bat\SO\33603488.bat
source folder "D:\test\fooSrcFldr\" is empty

==> type nul>"D:\test\fooSrcFldr\foo.txt"

==> D:\bat\SO\33603488.bat
cannot create target folder  "D:\test\fooDstFldr\"
as there exists another file "D:\test\fooDstFldr" of the same name

==> del "D:\test\fooDstFldr"

==> D:\bat\SO\33603488.bat
going to create target folder "D:\test\fooDstFldr\"
D:\test\fooSrcFldr\foo.txt
1 File(s)

==>