通过批处理文件从文件中读取

时间:2012-12-10 09:37:26

标签: batch-file

我有一个file.txt,其中包含我机器上安装的oracles的路径。 来自注册表 示例此文件包含:

    ORACLE_HOME    REG_SZ    C:\oracle\product\11.2.0\dbhome_1
    ORACLE_HOME    REG_SZ    C:\oracle\product\11.2.0\dbhome_2

我希望通过我的批处理文件将oracles的所有路径插入到列表或类似列表中。 我怎么能在批处理文件中做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:3)

假设您想在内存中找到值的“列表”,而不是在文件中:

我认为大多数人更喜欢可以通过索引值访问的“数组”值。 (注意 - 批处理没有正式数组,但可以模拟它们。)

只要没有主路径包含!,以下简单代码就可以正常工作。如果%%B包含!且已启用延迟展开,则@echo off setlocal enableDelayedExpansion :: Read the file and create an "array" of home paths :: This will fail if any of the paths contain ! set /a cnt=0 for /f "usebackq tokens=2*" %%A in ("file.txt") do ( set /a cnt+=1 set "home.!cnt!=%%B" ) :: Access the "array" members for /l %%N in (1 1 %cnt%) do echo !home.%%N! 的扩展将会损坏。

!

您可能会在许多环境中运行上述代码多年,并且永远不会遇到问题。但某人可能在Oracle主路径中包含!。有许多策略可以解决上述问题以处理@echo off setlocal disableDelayedExpansion :: Read the file and create an "array" of home paths :: This will safely process all paths, regardless of value set /a cnt=0 for /f "usebackq tokens=2*" %%A in ("file.txt") do ( set /a cnt+=1 call set "home.%%cnt%%=%%B" ) :: Access the "array" setlocal enableDelayedExpansion for /l %%N in (1 1 %cnt%) do echo !home.%%N! 。以下是三个选项:

选项1 - 代码量最少,但由于CALL

而最慢
@echo off
setlocal disableDelayedExpansion

:: Read the file and create an "array" of home paths
:: This will safely process all paths, regardless of value
set /a cnt=0
for /f "tokens=1,3* delims=: " %%A in ('findstr /n "^" "file.txt"') do (
  set "home.%%A=%%C"
  set "cnt=%%A"
)

:: Access the "array" members
setlocal enableDelayedExpansion
for /l %%N in (1 1 %cnt%) do echo !home.%%N!

选项2 - 使用FINDSTR计算行数的一种有趣而有效的方法。

@echo off
setlocal disableDelayedExpansion

:: Read the file and create an "array" of home paths
:: This will safely process all paths, regardless of value
set /a cnt=0
for /f "usebackq tokens=2*" %%A in ("file.txt") do (
  set /a cnt+=1
  setlocal enableDelayedExpansion
  for %%N in (!cnt!) do (
    endlocal
    set "home.%%N=%%B"
  )
)

:: Access the "array"
setlocal enableDelayedExpansion
for /l %%N in (1 1 %cnt%) do echo !home.%%N!

选项3 - 使用延迟扩展切换的有效方法,但代码最多

@echo off
setlocal disableDelayedExpansion

:: Read the file and create a space delimited list of quoted home paths
:: This will safely process all paths, regardless of value
for /f "usebackq tokens=2*" %%A in ("file.txt") do (call set list=%%list%% "%%~B")

:: optional - remove leading space
(set list=%list:~1%)

:: Display the list
echo list=%list%

:: Access the list members
for %%F in (%list%) do echo %%~F

也可以在单个变量中包含主路径列表。每条路径都应该用引号括起来。路径可以用空格,逗号,分号,等号或制表符分隔。我选择了空间。

列表的大小是有限的,因为批处理环境变量的最大大小约为8191个字节。由于CALL,该解决方案也相对较慢。这些问题都不是现实世界中的问题。

{{1}}

答案 1 :(得分:0)

for /f "tokens=3 delims= " %%a in (file.txt) do echo %%a >>paths.txt