我有一个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的所有路径插入到列表或类似列表中。 我怎么能在批处理文件中做到这一点? 谢谢!
答案 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