Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 文件的批处理回显命令不';逃脱不了_Windows_Batch File_Escaping_Echo - Fatal编程技术网

Windows 文件的批处理回显命令不';逃脱不了

Windows 文件的批处理回显命令不';逃脱不了,windows,batch-file,escaping,echo,Windows,Batch File,Escaping,Echo,我正在编写一个脚本,以便在新服务器上自动进行备份设置。我不是批处理专家,因此它保持相当简单(请参阅此处的完整部分以供参考)。在我尝试将另一个批处理脚本写入文件时,一切正常: ( echo del "%BACKUP_SERVER%Snapshot-%%COMPUTERNAME%%\Week_before\*.*" /S /Q echo. echo move /Y "%BACKUP_SERVER%Snapshot-%%COMPUTERN

我正在编写一个脚本,以便在新服务器上自动进行备份设置。我不是批处理专家,因此它保持相当简单(请参阅此处的完整部分以供参考)。在我尝试将另一个批处理脚本写入文件时,一切正常:

        (
        echo del "%BACKUP_SERVER%Snapshot-%%COMPUTERNAME%%\Week_before\*.*" /S /Q
        echo.
        echo move /Y "%BACKUP_SERVER%Snapshot-%%COMPUTERNAME%%\Full\*.*" "%BACKUP_SERVER%Snapshot-%%COMPUTERNAME%%\Week_before"
        echo move /Y C:\Scripts\Backup.log "%BACKUP_SERVER%Snapshot-%%COMPUTERNAME%%\Week_before"
        echo move /Y C:\Scripts\Backupdiff.log "%BACKUP_SERVER%Snapshot-%%COMPUTERNAME%%\Week_before"
        echo.
        echo.
        echo C:\Scripts\snapshot.exe C: "%BACKUP_SERVER%Snapshot-$computername\Full\$disk-Partition-$type.sna" --LogFile:C:\Scripts\Backup.log -L50000 -GX --usevss --AllWriters  
        echo @echo off
        echo    if %%errorlevel%% NEQ 0 (

        echo        echo Error while Backup at %%COMPUTERNAME%%.%%USERDOMAIN%%  ^| C:\Scripts\blat\blat.exe -server %BLAT_MAILSERVER%  -to info@abc.com -f backup@%BLAT_DOMAIN% -s "Error while Backup at %%COMPUTERNAME%%.%%USERDOMAIN%%" -attach C:\Scripts\Backup.log
        echo    )
        ) >full-backup.bat

    if %DO_DIFF_BACKUP%==y (
        (
            echo C:\Scripts\snapshot.exe C: %BACKUP_SERVER%\Snapshot-$computername\Diff\$disk-Partition-$type-$weekday.sna -h%BACKUP_SERVER%\Snapshot-$computername\Full\c-Partition-ful.hsh --LogFile:C:\Scripts\Backupdiff.log -L50000 -GX --usevss --AllWriters  
            echo @echo off
            echo    if %%%errorlevel%%% NEQ 0 (
            echo        echo Error while Backup at %%COMPUTERNAME%%.%%USERDOMAIN%%  ^| C:\Scripts\blat\blat.exe -server %BLAT_MAILSERVER%  -to info@abc.com -f backup@%BLAT_DOMAIN% -s "Error while Backup at %%COMPUTERNAME%%.%%USERDOMAIN%%" -attach C:\Scripts\Backupdiff.log
            echo    )
        ) >diff-backup.bat
    )
因此,当执行脚本时,它会在本摘录的最后一行停止。文件full-backup.bat根本不存在,但不会引发任何错误,而文件diff-backup.bat使用以下内容编写:

 C:\Scripts\snapshot.exe C: c:\test\Snapshot-$computername\Diff\$disk-Partition-$type-$weekday.sna -hc:\test\Snapshot-$computername\Full\c-Partition-ful.hsh -- LogFile:C:\Scripts\Backupdiff.log -L50000 -GX --usevss --AllWriters  
 @echo off
    if %0% NEQ 0 (

互联网上说,“逃逸百分比翻倍”、“逃逸管道”^ |等等。但是,如果我引用一些东西,使用逃逸标志,似乎没有任何改变——batch不会听我说:(.任何帮助都将不胜感激。

当您将要按字面上的
%
进行回显的百分号加倍,并用
^
转义所有其他特殊字符时,应该可以使用

由于您不知道变量是否也包含特殊字符,因此最好在此处使用延迟展开,而不是百分比展开。 这是因为当通过延迟扩展进行扩展时,所有内容都是安全的

setlocal EnabledDelayedExpansion
(
    echo del "!BACKUP_SERVER!Snapshot-%%COMPUTERNAME%%\Week_before\*.*" /S /Q
    echo.
    echo move /Y "!BACKUP_SERVER!Snapshot-%%COMPUTERNAME%%\Full\*.*" "!BACKUP_SERVER!Snapshot-%%COMPUTERNAME%%\Week_before"
    echo move /Y C:\Scripts\Backup.log "!BACKUP_SERVER!Snapshot-%%COMPUTERNAME%%\Week_before"
    echo move /Y C:\Scripts\Backupdiff.log "!BACKUP_SERVER!Snapshot-%%COMPUTERNAME%%\Week_before"
    echo.
    echo.
    echo C:\Scripts\snapshot.exe C: "!BACKUP_SERVER!Snapshot-$computername\Full\$disk-Partition-$type.sna" --LogFile:C:\Scripts\Backup.log -L50000 -GX --usevss --AllWriters  
    echo @echo off
    echo    if %%errorlevel%% NEQ 0 (

    echo        echo Error while Backup at %%COMPUTERNAME%%.%%USERDOMAIN%%  ^| C:\Scripts\blat\blat.exe -server !BLAT_MAILSERVER!  -to info@abc.com -f backup@!BLAT_DOMAIN! -s "Error while Backup at %%COMPUTERNAME%%.%%USERDOMAIN%%" -attach C:\Scripts\Backup.log
    echo    ^)
)

echo)
将关闭您的代码块,因此您也需要将其转义
echo^)
刚刚尝试过,结果与之前相同。尽管如此,你是对的,我怎么能看不到呢?
%%%errorlevel%%
应该是
%%errorlevel%%
,最后一个括号应该被删除。你的脚本中有更多的错误,例如
如果“%REPEAT\u DOWNLOAD%”==“y”
永远不会是真的,请查看
延迟扩展
。很多变量都不起作用,如果没有
延迟扩展
,则无法设置变量并在同一代码块中使用它。此外,在定义变量之前,可以使用变量
“%CONFIRM\u BACKUP\u CONF%”
。您应该修改代码,稍后再回来。虽然脚本现在似乎在输出文件中的文本,但“BACKUP_SERVER”变量将不会替换为前面定义的字符串。是否添加
setlocal EnableDelayedExpansion
行?是否获得
!备份服务器作为文本还是空文本?在块之前添加
set BACKUP\u SERVER=TEST
时会发生什么?