为什么我的if语句在函数中导致批处理错误?

时间:2016-03-01 22:08:32

标签: batch-file

我正在编写一个批量安装脚本,我试图让这个函数只在某个变量等于1时运行。每当调用这个函数时我都是一个正常的语法命令("命令的语法不正确& #34;)接着是下一行 " C:\ Windows \ System32下>打破>" 代码如下:

:updateStatus
IF %uploadInfo% EQU 1 (

    REM finds IP
    set ip_address_string="IP Address"
    set ip_address_string="IPv4 Address"
    for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do (
        SET ip=%%f
        REM  goto :eof  
    )

    REM Removes spaces from IP
    SETLOCAL ENABLEDELAYEDEXPANSION
    for /f "tokens=* delims= " %%a in ("%ip%") do set ip=%%a
    for /l %%a in (1,1,100) do if "!ip:~-1!"==" " set ip=!ip:~0,-1!
    REM echo IP Adress: %ip%

    SET txtLoc=C:\CadVersionInfo\%ip%.txt
    SETLOCAL  DISABLEDELAYEDEXPANSION

    REM SETs time
    For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%a/%%b/%%c)
    For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a:%%b)

    REM writes info
    if not exist C:\CadVersionInfo\ (mkdir C:\CadVersionInfo\)


    if exist "%txtLoc%" (
        del "%txtLoc%"
    )


    break>%txtLoc%


    @echo %trunk%.%build% >>"%txtLoc%"
    @echo %TA%>>"%txtLoc%"
    @echo %mdbname%>>"%txtLoc%"
    REM ~1 is status
    @echo %~1>>"%txtLoc%"
    @echo %mytime% %mydate%>>"%txtLoc%"

    @echo %notes%>>"%txtLoc%"

    REM Sets location on server to store data
    SET txtLocRemote=\\cd-ptt\CAD Downloads\Webserver\servers\*
    xcopy %txtLoc% "%txtLocRemote%" /q /y
 )
goto:eof

2 个答案:

答案 0 :(得分:2)

不是试图使用delayedexpansion来处理所有变量,而是可能更容易撤销if语句并使用goto,如下所示:< / p>

:updateStatus
IF NOT %uploadInfo% EQU 1 goto end

{do stuff}

:end

答案 1 :(得分:1)

另一种解决方案是将变量设置在循环之外,并且只在需要时才处理循环。

我已经多次编辑过这篇文章,最后使用了Wes的解决方案,这里只是为了说明实现代码部分的一些不同方法。

IP变量中的空格将以更简单的方式删除。

更改了文件的重定向 - 它可以避免使用此方法尾随空格。

*中的SET "txtLocRemote=\\cd-ptt\CAD Downloads\Webserver\servers\*"不是xcopy的合法语法,需要进行修改。

在此代码块中,两行被替换,2>nul只是隐藏了控制台中不相关的文本。它将始终尝试创建文件夹并删除文件,如果文件夹已存在或文件不存在,则不会造成任何损坏。

if not exist C:\CadVersionInfo\ (mkdir C:\CadVersionInfo\)
break>"%txtLoc%"

这是您编辑的代码:

:updateStatus

IF %uploadInfo% NEQ 1 goto :EOF

    REM finds IP
    set ip_address_string="IP Address"
    set ip_address_string="IPv4 Address"
    for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do (
        SET ip=%%f
        REM  goto :eof  
    )

    REM Removes spaces from IP
        SET "ip=%ip: =%"
    REM echo IP Adress: %ip%

    SET "txtLoc=C:\CadVersionInfo\%ip%.txt"

    REM Sets location on server to store data
    SET "txtLocRemote=\\cd-ptt\CAD Downloads\Webserver\servers\*"

    REM SETs time
    For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%a/%%b/%%c)
    For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a:%%b)


    REM writes info

    mkdir "C:\CadVersionInfo" 2>nul
    del "%txtLoc%" 2>nul


    >>"%txtLoc%" @echo %trunk%.%build%
    >>"%txtLoc%" @echo %TA%
    >>"%txtLoc%" @echo %mdbname%
    REM ~1 is status
    >>"%txtLoc%" @echo %~1
    >>"%txtLoc%" @echo %mytime% %mydate%

    >>"%txtLoc%" @echo %notes%

    xcopy "%txtLoc%" "%txtLocRemote%" /q /y

goto:eof