0

我需要将一些行(Myfile)的一部分从'for'循环中取出到两个单独的变量中或放入一个数组中。我的目标是相互使用来构成以下行result * .txt的路径。我在下面写了您所看到的内容,但可以看出我的“a”变量仅在回显“C:\Temp\FR”(Myfile 中的行尾匹配标记)。

请问,有没有办法在变量/数组中获取所有匹配的标记?例如,就我而言,我需要将 'C:\Temp\USA' 和 'C:\Temp\FR' 排除在循环之外?谢谢

   for /f "tokens=2 delims==" %%x in (Myfile) do (
   set a=%%x
  )
  echo %a%
  'MyFile
   DIR1= C:\Temp\USA
   DIR2= C:\Temp\FR
   result1.txt
   result2.txt
4

2 回答 2

0

尝试这个:

@echo off&setlocal

for /f "tokens=1* delims== " %%x in (Myfile) do (
    if /i "%%x"=="dir1" set "path1=%%y"
    if /i "%%x"=="dir2" set "path2=%%y"
)

echo %path1%
echo %path2%

输出是:

C:\Temp\USA
C:\Temp\FR
于 2013-04-23T22:03:12.990 回答
0

有几种方法可以做到这一点。如果您想从文件的开头读取几行,最简单的方法是直接在几个变量中读取它们:

< Myfile (
set /P var1=
set /P var2=
)

请注意,这些变量包含完整的行,因此有必要提取等号后面的部分。

在您的示例中,您只需要带有等号的行,因此我们可以findstr "=" Myfile在 FOR 命令中使用来处理它们。如果未定义行数,则必须按照建议将所有所需行保存在数组中:

setlocal EnableDelayedExpansion
set n=0
for /F "tokens=2 delims==" %%a in ('findstr "=" Myfile') do (
   set /A n+=1
   set var[!n!]=%%a
)
rem Show all array elements
for /L %%i in (1,1,%n%) do (
   echo !var[%%i]!
)
rem Show just the second element
echo %var[2]%

但是,在您的特定情况下,您想要的行具有variable assignments的形式。这意味着如果您使用 SET 命令执行此类行,则这些行中的值将“自动”保存:

for /F "delims=" %%a in ('findstr "=" Myfile') do set %%a

在前面的 FOR 之后,您可以直接获取DIR1DIR2变量的值,例如:

echo %DIR1%
echo %DIR2%

此方法非常简单,不需要对正在加载的各个变量进行任何测试。

如果要删除值中等号后的空格,可以调整 FOR 选项来执行此操作:

for /F "tokens=1* delims== " %%a in ('findstr "=" Myfile) do set %%a=%%b
于 2013-04-24T05:37:38.977 回答