繁体   English   中英

批处理回显命令无法转义

[英]Batch echo command to file doesn't escape

我正在编写一个脚本来自动在新服务器上进行备份设置。 我不是批处理专家,因此它保持相当简单(请参阅此处完整以获取参考http://pastebin.com/D1zEP8dj )。 一切正常,我尝试将另一个批处理脚本写入文件:

        (
        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 (

互联网上说,要使百分号变倍,使管道^ |-转义,等等。但是,如果我引用事物,完全使用转义符,似乎并没有改变任何内容-批处理不会听我说:(。帮助将不胜感激。

当您将百分号加倍时,您想在字面上回显%并用^转义所有其他特殊字符,则它应该起作用。

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

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    ^)
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM