如何使用从文本文件读取的环境变量设置变量
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,即抑制错误如果目录已经存在则输出消息。
我创建了以下配置文件,其中包含批处理文件要使用的参数:
文件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,即抑制错误如果目录已经存在则输出消息。