两个基本问题:
1. 复合语句必须用括号括起来。
2. 在括号内更改变量的值将不可见,除非您已执行SETLOCAL ENABLEDELAYEDEXPANSION
- 即使这样,您仍需要使用!var!而不是%var%。
因此:
SETLOCAL ENABLEDELAYEDEXPANSION
if exist "c:\folder1" (
set Folder1=1
echo !Folder1!
goto install
) else if exist "c:\folder2" (
set Folder2=1
echo !Folder2!
goto Install
) else goto Install
:Install
最好的情况是,
@ECHO off
if exist "c:\folder1" (
set Folder1=1
goto install
) else if exist "c:\folder2" (
set Folder2=1
goto Install
) else goto Install
:Install
SET folder
甚至更简单
@ECHO off
if exist "c:\folder1" set Folder1=1&goto install
if exist "c:\folder2" set Folder2=1&goto Install
:Install
SET folder
测试:
@ECHO OFF
setlocal
SET "folder1="
SET "folder2="
ECHO.----------No folders
DIR /b /ad c:\folder*
CALL :test
ECHO.----------Folder 1 only
MD c:\folder1
DIR /b /ad c:\folder*
CALL :test
ECHO.----------Folder 2 only
RD c:\folder1
MD c:\folder2
DIR /b /ad c:\folder*
CALL :test
ECHO.----------Both
MD c:\folder1
DIR /b /ad c:\folder*
CALL :test
RD c:\folder1
RD c:\folder2
GOTO :eof
:test
if exist "c:\folder1" set Folder1=1&goto install
if exist "c:\folder2" set Folder2=1&goto Install
:Install
SET folder
SET "folder1="
SET "folder2="
GOTO :eof
这个测试创建并删除了两个相关的目录。
以下是结果:
----------No folders
----------Folder 1 only
folder1
Folder1=1
----------Folder 2 only
folder2
Folder2=1
----------Both
folder1
folder2
Folder1=1
请提供需要翻译的内容。
SET "folder1="
SET "folder2="
该函数在每次报告生成前和启动时均会执行,以确保将涉及的环境变量从环境中删除,以防止代码基于过期信息而产生错误结果。
SETLOCAL
的原因。通过setlocal
,任何环境更改都会在例程结束时撤消。 - MagooSETLOCAL
确保批处理完成时环境不会改变。可能整个程序的重点就是设置一些环境变量。另一方面,您在程序中使用的变量并不能保证没有被其他方式设置 - 例如之前运行批处理时未使用SETLOCAL
或者用户从提示符输入SET var=whatever
指令。批处理不知道,所以set "var="
确保了这一点。 - Magoo