如何使用从文本文件读取的环境变量设置变量

How to set a variable with an environment variable read from a text file

我创建了以下配置文件,其中包含批处理文件要使用的参数:

文件winscp.conf:

folder    %appData%\winscp
version   5.7.4
visit     http://sourceforge.net/projects/winscp/files/WinSCP/
download  http://sourceforge.net/projects/winscp/files/WinSCP/5.7.4/winscp574.zip

批处理文件(get.bat):

@echo off
setlocal

@if not exist "%1" (
    echo Config file not found in "%1"
    exit /B
)
@for /f "tokens=1,2 delims= " %%A in (%1) do (
    set %%A=%%B
)

mkdir %folder%

当我这样调用批处理文件时:

get.bat winscp.conf

我在当前文件夹中创建了一个子文件夹 %appData%\winscp,如下所示:

c:\Temp\%appData%\winscp

虽然我想要的是在 Windows 应用程序数据文件夹中创建的 winscp 文件夹,如下所示:

C:\Users\Caffe\AppData\Roaming\winscp

我认为语句 set %%A=%%B 有问题,因为如果我将其更改为 set %%A=%appData%\winscp,我确实会按照我想要的方式创建文件夹。

令牌中的变量应该在赋值之前通过添加 call:

展开
call set %%A=%%B

您的代码中的下一个更改:

  • call set 而不是 set
  • for /f "tokens=1,* 而不是 for /f "tokens=1,2

那么下一个代码片段应该可以工作:

@ECHO OFF
SETLOCAL enableextensions
if not exist "%1" (
    echo Config file not found in "%1"
    exit /B
)
for /f "tokens=1,* delims= " %%A in (%1) do (
    call set "%%A=%%B"
)
mkdir %folder%

我只是总结了 wOxxOm and JosefZ 的答案,并添加了一些小的改进。

@echo off
setlocal EnableExtensions
set "ConfigFile=%~1"

if "%ConfigFile%" == "" (
    echo %~nx0 must be called with name of configuration file
    echo as first parameter, for example: %~nx0 winscp.conf
    goto EndBatch
)

if not exist "%ConfigFile%" (
    echo Config file "%ConfigFile%" not found.
    goto EndBatch
)

set "folder="

for /F "usebackq tokens=1*" %%A in ("%ConfigFile%") do call set "%%A=%%B"

if "%folder%" == "" (
    echo Option "folder" not defined in config file "%ConfigFile%".
    goto EndBatch
)

mkdir "%folder%" 2>nul

:EndBatch
endlocal

为了更好地阅读传递给批处理文件的第一个参数应该是什么,该参数立即分配给一个环境变量,不带引号,如果带或不带路径的配置文件名至少包含 1 space 字符.

接下来检查是否使用参数调用了批处理文件。

FOR 循环后验证配置文件是否确实包含 folder.

的条目

并且使用引号创建目录,因为文件夹路径可以包含 spaces,并且将任何错误消息重定向到设备 nul,即抑制错误如果目录已经存在则输出消息。