如何阻止我的脚本覆盖?

时间:2018-06-15 08:25:03

标签: batch-file cmd

下面是我放在一起的批处理脚本,它复制另一个文件夹的内容并将其粘贴到一个名为IC_Transfer的新文件夹中。

@echo off
@break off
@title IC Transfer

setlocal EnableDelayedExpansion

if not exist "C:\Temp\IC_Transfer" (
    md "C:\Temp\IC_Transfer"
    ROBOCOPY /-y "Q:\Work\Temp\Dan" "C:\Temp\IC_Transfer" /mir 
    if "!errorlevel!" EQU "0" (
        echo Transfer Successful! ) 
        ) else (
        if exist "C:\Temp\IC_Transfer" (
        echo Error Transferring File 
        echo File Already Exists
        :Choice
        set /P c=Would You Like To Overwrite[Y/N]?
            if /I "%c%" EQU "Y" goto Overwrite
            if /I "%c%" EQU "N" goto Stop
        ) )
:Overwrite
    md "C:\Temp\IC_Transfer"
    ROBOCOPY "Q:\Work\Temp\Dan" "C:\Temp\IC_Transfer" /mir 
    if "!errorlevel!" EQU "0" (
    echo Transfer Successful )
    goto End

:Stop
    echo Transfer Cancelled
    goto End

:End 
    pause
    exit

pause
exit

make目录和robocopy函数通过清除目录,重新创建并粘贴内容来工作。我无法工作的是选择命令。

无论我选择Y还是N,它都会覆盖文件内容。

我是批处理脚本的新手,所以任何帮助都会受到赞赏

2 个答案:

答案 0 :(得分:2)

@echo off
@break off
@title IC Transfer

setlocal

if not exist "C:\Temp\IC_Transfer" (
    md "C:\Temp\IC_Transfer"
    ROBOCOPY /-y "Q:\Work\Temp\Dan" "C:\Temp\IC_Transfer" /mir
    if not errorlevel 1 (
        echo Transfer Successful!
    ) else (
        echo Error Transferring File
        echo File Already Exists
        call :Choice
    )
)

exit /b

:Choice
    setlocal
    set "c="
    set /P "c=Would You Like To Overwrite[Y/N]? "
    if /I "%c%" == "Y" (
        call :Overwrite
    ) else if /I "%c%" == "N" (
        call :Stop
    ) else call :Stop
exit /b

:Overwrite
    ROBOCOPY "Q:\Work\Temp\Dan" "C:\Temp\IC_Transfer" /mir
    if not errorlevel 1 echo Transfer Successful
    pause
exit /b

:Stop
    echo Transfer Cancelled
    pause
exit /b

要解决此问题,括号代码块内的标签是a 坏主意,容易出错。所以请改为调用标签。

我用调用替换了goto,因为:Choice可以使用调用。 这使:End过时了。

您使用errorlevel的延迟展开,但您可以使用 即if not errorlevel 1检查整数值是否小于1。 延迟扩展已被删除。

答案 1 :(得分:2)

  1. code blocks(带括号的系列命令)中的标签会导致问题(:选择),并且最好被视为非法。

  2. 您已调用delayedexpansion并认出errorlevel可能随code block而变化。您的set /p更改了变量c,但您在c语句中使用的分析时间值为if(%c%),而不是运行时值(!!C)

  3. 如果用户输入not-YN会发生什么?提示:从提示符中查看choice命令 - choice /?

  4. 由于c未设置在代码的开头,"%c%"将评估为"""Y""N"都不会if md 1}}失败,然后代码将进入下一个语句(:overwrite)

    请注意md directoryname 2>nul 将创建目录或生成错误消息(如果它不存在),因此

    md

    应创建目录并禁止显示错误消息(如“目录已存在”),从而避免对SELECT * into #xx From ( Select * FROM #x union all select * from MartDB.DBO.BAW_AllSources_Stage1 ) AAAsds 进行门控测试。