如何将多个findstr结果分配给单独的变量

时间:2015-05-28 19:33:33

标签: batch-file

我尝试使用FOR将子目录名称分配给变量,方法是使用批处理文件将CHDIR结果保存到临时文本文档

批处理文件输入:

CD / d路径名
DIR / b / d> temp.txt
FINDSTR / b / n字符串路径名\ temp.txt
ECHO在上面找到字符串结果 暂停 FOR / F"令牌= 1-3" %% A IN(' FINDSTR / b字符串路径名\ temp.txt')DO(
    SET One = %% A
    SET 2 = %% B
    SET 3 = %% C

ECHO%One% ECHO%2% ECHO%3% 暂停

命令提示符输出:

目录1 directory2
目录3
找到上面的字符串结果
按任意键继续 。 。 。
目录3
回声已关闭。
回声已关闭。
按任意键继续 。 。 。

初始FINDSTR的结果应该与ECHO&#d; d变量匹配,如果它们被正确分配但只捕获了最后的子目录名称,并且未分配最后两个变量。

如何让每个子目录分配给一个单独的变量? 是否有更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

tokens子句用于分割每个输入行,而不是确定要读取的行数。

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Clean variables
    for %%b in (one two three) do set "%%b="

    rem Read folders
    for /d %%a in ("c:\somewhere\*") do (
        rem For each folder found, assign to a non assigned variable
        set "done="
        for %%b in (one two three) do if not defined done if not defined %%b (
            set "%%b=%%a"
            set "done=1"
        )
    )

    echo %one%
    echo %two%
    echo %three%

答案 1 :(得分:0)

存储和处理未定义数量的项目的常用方法是通过数组,它是一个带有一个名称的变量,但有几个元素通过方括号中的数字索引或下标选择括号;例如:set array[1]=Element number 1

@echo off
setlocal EnableDelayedExpansion

rem Initialize the index
set index=0

rem Process all folders
cd /D pathname
for /D %%a in (string*) do (
   rem Increment the index to next element
   set /A index+=1
   rem Store the folder in next array element
   set "folder[!index!]=%%a"
)

rem Store the total number of folders
set number=%index%

rem Show the first folder
echo First folder: %folder[1]%

rem Show the last folder
echo Last folder: !folder[%number%]!

rem Show all folders
for /L %%i in (1,1,%number%) do echo %%i- !folder[%%i]!

此方法需要延迟扩展,因为索引的值在for循环内发生变化。如果索引将以这种方式扩展:%index%,它将在for迭代之前扩展一次。如果变量以这种方式包含在百分比中:!index!和延迟扩展已启用(通过开头的setlocal命令),索引的值将每次扩展 行已执行。您可以在批处理文件here中阅读有关阵列管理的进一步说明。