【问题标题】:How to set a variable with an environment variable read from a text file如何使用从文本文件中读取的环境变量设置变量
【发布时间】:2015-07-23 16:00:36
【问题描述】:

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

文件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,我确实会按照我想要的方式创建文件夹。

【问题讨论】:

    标签: windows batch-file environment-variables


    【解决方案1】:

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

    @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 个空格字符,则必须使用引号。

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

    FOR循环之后,验证配置文件是否真的包含folder的条目。

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

    【讨论】:

      【解决方案2】:

      标记内的变量应该在赋值之前通过添加call来扩展:

      call set %%A=%%B
      

      【讨论】:

      • 顺便说一句,如果您的值将包含空格,这是一种更可靠的解析方法:@for /f "tokens=1*" %%A in (%1) do,%%A = 空格前的第一个单词,%%B = 其余的。
      【解决方案3】:

      在您的代码中进行下一次更改:

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

      然后下一个代码 sn-p 应该可以工作:

      @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%
      

      【讨论】:

        猜你喜欢
        • 2012-04-22
        • 2017-03-06
        • 1970-01-01
        • 2022-07-20
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 1970-01-01
        相关资源
        最近更新 更多