首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的if语句在函数中会导致批处理中的错误?

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

Stack Overflow用户
提问于 2016-03-02 06:08:32
回答 2查看 60关注 0票数 0

我正在编写一个批量安装脚本,并尝试仅在某个变量等于1时才运行此函数。无论何时调用此函数时,只要在下一行后面加上"C:\Windows\System32> break>“,就是一个正常语法的命令(”命令的语法不正确“),代码如下:

代码语言:javascript
复制
: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
EN

回答 2

Stack Overflow用户

发布于 2016-03-02 08:28:13

与尝试使用delayedexpansion处理所有变量相比,倒过来使用if语句并只使用goto可能更简单,如下所示:

代码语言:javascript
复制
:updateStatus
IF NOT %uploadInfo% EQU 1 goto end

{do stuff}

:end
票数 2
EN

Stack Overflow用户

发布于 2016-03-02 08:54:24

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

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

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

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

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

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

代码语言:javascript
复制
if not exist C:\CadVersionInfo\ (mkdir C:\CadVersionInfo\)
break>"%txtLoc%"

这是你编辑过的代码:

代码语言:javascript
复制
: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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35734584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档