绕过批处理FOR循环中的本机变量排序

时间:2016-07-13 12:28:44

标签: sorting batch-file cmd

我需要从一个文件中读取任意数量的变量“名称”,然后为它们分配另一个文件提供的“值”,两个源都不能同时使用。我尝试使用下面的代码,但问题是,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

2 个答案:

答案 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