首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows批处理与FOR和如果存在并发出GOTO

Windows批处理与FOR和如果存在并发出GOTO
EN

Stack Overflow用户
提问于 2014-09-16 14:00:55
回答 2查看 172关注 0票数 0

好的,所以我正在编写一个批处理文件,通过替换客户端上的文件来帮助客户端迁移。

代码语言:javascript
运行
复制
@ECHO OFF
ECHO Only type "clients" or "servers"
SET /P TYPE=clients or servers:
SET /P LIST=%TYPE% list filename:
SET /P SITE=Site:
SET SYMPATH=""
SET LIST2=""
SET N=
SET N2=0
Echo This will migrate %TYPE% in site %SITE% from list %LIST%, correct?
PAUSE
:STRT
SET /a N2=N2+1
SET LIST2=%LIST%%N%
FOR /F "tokens=*" %%v IN (%LIST2%) DO (
ECHO Checking %%v...
SET COMP=%%v
if exist "\\%%v\c$\program files (x86)\symantec\symantec endpoint protection\smc.exe" SET "SYMPATH=program files (x86)\symantec\symantec endpoint protection" & CALL :MIGRATE
if exist "\\%%v\c$\program files\symantec\symantec endpoint protection\smc.exe" SET "SYMPATH=program files\symantec\symantec endpoint protection" & CALL :MIGRATE
if exist "\\%%v\c$\program files (x86)\symantec antivirus\smc.exe" SET "SYMPATH=program files (x86)\symantec antivirus" & CALL :MIGRATE
if exist "\\%%v\c$\program files\symantec antivirus\smc.exe" SET "SYMPATH=program files\symantec antivirus" & CALL :MIGRATE
ECHO Could not find SEP on client %%v
ECHO %%v >> %LIST%%N2%
)
:MIGRATE
ECHO Migrating %COMP%...
psexec \\%COMP% -h "c:\%SYMPATH%\smc.exe" -p xxxxxx -stop
copy "%TYPE%_xml\My Company_Workplace_%TYPE%_%SITE%_sylink.xml" "\\%COMP%\c$\%SYMPATH%\SyLink.xml" /Y
psexec \\%COMP% -h "c:\%SYMPATH%\smc.exe" -start
ECHO Migrated %COMP% to SEP12 group %SITE% >> END_%SITE%.log
ECHO Migrated %COMP% to SEP12 group %SITE%
EXIT /b
SET /a N=N+1
ECHO End of the list, starting over with %LIST2%
GOTO STRT `

除了迁移了客户机之后,它跳回调用并执行代码外,大多数事情都能工作:

代码语言:javascript
运行
复制
ECHO Could not find SEP on client %%v
ECHO %%v >> %LIST%%N2%

这在代码上是正确的,但是我希望它跳过这两行并继续下一个客户机,如下所示:

代码语言:javascript
运行
复制
@ECHO OFF
ECHO Only type "clients" or "servers"
SET /P TYPE=clients or servers:
SET /P LIST=%TYPE% list filename:
SET /P SITE=Site:
SET SYMPATH=""
SET LIST2=""
SET N=
SET N2=0
Echo This will migrate %TYPE% in site %SITE% from list %LIST%, correct?
PAUSE
:STRT
SET /a N2=N2+1
SET LIST2=%LIST%%N%
FOR /F "tokens=*" %%v IN (%LIST2%) DO (
ECHO Checking %%v...
SET COMP=%%v
if exist "\\%%v\c$\program files (x86)\symantec\symantec endpoint protection\smc.exe" SET "SYMPATH=program files (x86)\symantec\symantec endpoint protection" & CALL :MIGRATE **& GOTO :NEXT**
if exist "\\%%v\c$\program files\symantec\symantec endpoint protection\smc.exe" SET "SYMPATH=program files\symantec\symantec endpoint protection" & CALL :MIGRATE **& GOTO :NEXT**
if exist "\\%%v\c$\program files (x86)\symantec antivirus\smc.exe" SET "SYMPATH=program files (x86)\symantec antivirus" & CALL :MIGRATE **& GOTO :NEXT**
if exist "\\%%v\c$\program files\symantec antivirus\smc.exe" SET "SYMPATH=program files\symantec antivirus" & CALL :MIGRATE **& GOTO :NEXT**
ECHO Could not find SEP on client %%v
ECHO %%v >> %LIST%%N2%
**:NEXT**
)
:MIGRATE
ECHO Migrating %COMP%...
psexec \\%COMP% -h "c:\%SYMPATH%\smc.exe" -p xxxxxx -stop
copy "%TYPE%_xml\My Company_Workplace_%TYPE%_%SITE%_sylink.xml" "\\%COMP%\c$\%SYMPATH%\SyLink.xml" /Y
psexec \\%COMP% -h "c:\%SYMPATH%\smc.exe" -start
ECHO Migrated %COMP% to SEP12 group %SITE% >> END_%SITE%.log
ECHO Migrated %COMP% to SEP12 group %SITE%
EXIT /b
SET /a N=N+1
ECHO End of the list, starting over with %LIST2%
GOTO STRT `

但是这不起作用,因为我不能在代码块()中使用GOTO和标签。

有谁有主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-16 14:18:12

代码语言:javascript
运行
复制
FOR /F "tokens=*" %%v IN (%LIST2%) DO (
    ...
    SET "SYMPATH="
    if exist "\\%%v\c$\..." SET "SYMPATH=..." & CALL :MIGRATE 
    if exist "\\%%v\c$\..." SET "SYMPATH=..." & CALL :MIGRATE 
    if exist "\\%%v\c$\..." SET "SYMPATH=..." & CALL :MIGRATE 
    if exist "\\%%v\c$\..." SET "SYMPATH=..." & CALL :MIGRATE 

    if not defined SYMPATH (
        ECHO Could not find SEP on client %%v
        ECHO %%v >> %LIST%%N2%
    )
)

对于每次迭代,重置sympath并进行测试。如果在结束时未定义变量,则未找到匹配项。

票数 2
EN

Stack Overflow用户

发布于 2014-09-17 19:21:53

代码语言:javascript
运行
复制
for /f "tokens=*" %%v IN (%LIST2%) do (
  echo Checking %%v...
  set "COMP=%%~v"
  set "SYMPATH="
  for %%P in (
    "program files (x86)\symantec\symantec endpoint protection"
    "program files\symantec\symantec endpoint protection"
    "program files (x86)\symantec antivirus\smc.exe"
    "program files\symantec antivirus"
  ) do if not defined SYMPATH if exist "\\%%v\c$\%%~P" (
    set "SYMPATH=%%~p"
    call :MIGRATE
  )
  if not defined SYMPATH (
    echo Could not find SEP on client %%v
    echo %%v >> %LIST%%N2%
  )
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25870864

复制
相关文章

相似问题

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