Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何使用从文本文件读取的环境变量设置变量_Windows_Batch File_Environment Variables - Fatal编程技术网

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

Windows 如何使用从文本文件读取的环境变量设置变量,windows,batch-file,environment-variables,Windows,Batch File,Environment Variables,我创建了以下配置文件,其中包含批处理文件要使用的参数: 文件winscp.conf: 批处理文件get.bat: 当我这样调用批处理文件时: get.bat winscp.conf c:\Temp\%appData%\winscp C:\Users\Caffe\AppData\Roaming\winscp 我在当前文件夹中创建了一个子文件夹%appData%\winscp,如下所示: get.bat winscp.conf c:\Temp\%appData%\winscp C:\Use

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

文件winscp.conf:

批处理文件get.bat:

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

get.bat winscp.conf
c:\Temp\%appData%\winscp
C:\Users\Caffe\AppData\Roaming\winscp
我在当前文件夹中创建了一个子文件夹%appData%\winscp,如下所示:

get.bat winscp.conf
c:\Temp\%appData%\winscp
C:\Users\Caffe\AppData\Roaming\winscp
我想要的是在Windows应用程序数据文件夹中创建的winscp文件夹,如下所示:

get.bat winscp.conf
c:\Temp\%appData%\winscp
C:\Users\Caffe\AppData\Roaming\winscp

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

在分配之前,应通过添加调用来扩展令牌内的变量:


令牌中的变量应在分配之前通过添加调用进行扩展:


对于代码中的下一个更改:

调用set而不是set 对于/f令牌=1,*而不是/f令牌=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%

对于代码中的下一个更改:

调用set而不是set 对于/f令牌=1,*而不是/f令牌=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%

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

@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
为了更好地理解传递给批处理文件的第一个参数应该是什么,将立即将参数分配给环境变量,而不使用周围的引号,如果配置文件名(带或不带path)包含至少1个空格字符,则必须使用引号

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

FOR循环之后,将验证配置文件是否确实包含文件夹的条目


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

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

@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
为了更好地理解传递给批处理文件的第一个参数应该是什么,将立即将参数分配给环境变量,而不使用周围的引号,如果配置文件名(带或不带path)包含至少1个空格字符,则必须使用引号

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

FOR循环之后,将验证配置文件是否确实包含文件夹的条目


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

BTW,如果您的值将有空格,则这里有一种更可靠的解析方法:@for/f tokens=1*%%a in%1 do,%%A=空格前的第一个单词,%%B=其余的。顺便说一句,如果您的值中有空格,那么这里有一种更可靠的解析方法:@for/f标记=1*%%A在%1 do中,%%A=空格前的第一个单词,%%B=其余的。