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

时间:2015-07-23 16:00:37

标签: windows batch-file environment-variables

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

文件 winscp.conf

DFMd <- structure(list(AD = c(0.5, 0.5, 0, 0, 0, 0, 0, 0, 0), AE = c(0.5, 
0.5, 0, 0, 0, 0, 0, 0, 0), AF = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), BD = c(0, 0, 0, 0.5, 0.5, 0, 0, 0, 0), BE = c(0, 0, 
0, 0, 0.5, 0.5, 0, 0, 0), BF = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), CD = c(0, 0, 0, 0, 0, 0, 0.5, 0.5, 0), CE = c(0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L), CF = c(0, 0, 0, 0, 0, 0, 0.5, 0, 
0.5)), .Names = c("AD", "AE", "AF", "BD", "BE", "BF", "CD", "CE", 
"CF"), class = "data.frame", row.names = c("AD", "AE", "AF", 
"BD", "BE", "BF", "CD", "CE", "CF"))

批处理文件( get.bat ):

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

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

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

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

get.bat winscp.conf

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

c:\Temp\%appData%\winscp

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

3 个答案:

答案 0 :(得分:2)

通过添加call

,应在分配之前扩展标记内的变量
call set %%A=%%B

答案 1 :(得分:2)

我只是总结了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 :(得分:1)

代码中的下一个更改:

  • Hello("Hi")代替call set
  • set代替for /f "tokens=1,*

然后下一个代码段应该有效:

for /f "tokens=1,2