我需要从一个文件中读取任意数量的变量“名称”,然后为它们分配另一个文件提供的“值”,两个源都不能同时使用。我尝试使用下面的代码,但问题是,SET命令本地按字母顺序对变量进行排序,从而阻止正确的值赋值。在这种情况下是否有另一种设置变量的方法,或者阻止按SET排序的本机Cmd变量的方法?如果可能的话,我不想设置编号的变量数组,因为它们通过添加额外的变量层使代码复杂化:
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1" %%i in (%args1_file%) do (
set "%%i=0" & set "%%i=_%%i")
for /f "tokens=1 delims==" %%i in ('set _') do (
for /f "tokens=1" %%j in (%args2_file%) do (
set "%%i=%%j"
if not !%%i! equ 0 (echo %%i = %%j
) else (set /p "%%j=Enter %%i > " 2>nul)
call :validate
)
:: more code using vars %%i
exit /b
:validate
答案 0 :(得分:1)
假设您的意思是set
返回的排序顺序,那么就没有办法了。
我无法在任何地方找到它,但由GetEnvironmentStrings()
和朋友维护的环境变量块按排序顺序维护,至少在我看过的每个NT OS中都是如此,可能在那之前。当您向其列表中添加新字符串时,它会在排序位置添加,因此系统会丢失添加顺序。
我认为你可以在一个文件中使用其他文件中的值来设置变量:
@echo off
setlocal enabledelayedexpansion
set _i=0
for /f "tokens=1" %%i in (names.txt) do (
set _val_!_i!=%%i
set /a _i=!_i!+1
)
set _i=0
for /f "tokens=1" %%i in (vals.txt) do (
set _temp=_val_!_i!
call set __%%!_temp!%%=%%i
set /a _i=!_i!+1
)
echo one == !__one!
echo two == !__two!
echo three == !__three!
答案 1 :(得分:1)
我发现这种方法不使用带编号的数组来读取单独文件中的var名称和值,并且不会导致vars排序以确保正确的值赋值:
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1" %%i in (%args1_file%) do (
set "%%i=0" & set "vars=!vars! _%%i")
for %%i in (!vars!) do (
for /f "tokens=1" %%j in (%args2_file%) do (
if not %%j.==. set %%i=%%j)
if not !%%i! equ 0 (echo %%i = %%j
) else (set /p "%%j=Enter %%i > " 2>nul)
call :validate
)
:: more code using vars %%i
exit /b