批处理脚本中的环境变量问题

时间:2014-03-29 03:26:03

标签: batch-file

所以,我可能有一个简单的问题,但我似乎无法找到一个简单的答案。

问题:我有一个包含一组行的文件,例如:

%windir%\file.exe  
%windir%\file2.dll

依此类推......

我要做的是将实际文件路径回显到第二个文件,以便得到的输出类似于:

C:\Windows\file.exe  
C:\Windows\file2.dll 

依此类推......

实际的源文件可能包含其他变量,例如%programfiles%,但所有变量都有实际路径。

我目前正在使用for /f loop但是当我回显变量时,我只是返回环境变量而不是文件的实际路径。

是否有批处理脚本的解决方案?


实际脚本如下。请注意,由于获取信息的时间非常重要,所以我的目的是提高效率。

@echo off
setlocal enabledelayedexpansion
reg.exe query "HKLM\System\CurrentControlSet\Services" >> registry_hklm_installed_services_tmp.txt 2>nul

reg.exe query "HKLM\System\ControlSet001\Services" >> registry_hklm_installed_services_tmp.txt 2>nul

reg.exe query "HKLM\System\ControlSet002\Services" >> %temp_outpath%\registry_hklm_installed_services_tmp.txt 2>nul

reg.exe query "HKLM\System\ControlSet002\Services" >> registry_hklm_installed_services_tmp.txt 2>nul

for /f "delims=?" %%a in (registry_hklm_installed_services_tmp.txt) do (
set regkey=%%a
call :getvalue
)
goto :parsereg

:getvalue
reg.exe query "!regkey!\Parameters" /v ServiceDll > nul 2>&1 && goto regkeyexist
goto :eof

:regkeyexist
for /f "tokens=2*" %%b in ('reg.exe query "!regkey!\Parameters" /v ServiceDll') do set ImagePath=%%c
call :regag
goto :eof

:regag
echo !ImagePath! >> registry_hklm_installed_services_tmp2.txt
goto :eof

:parsereg
for /f "delims=?" %%a in (registry_hklm_installed_services_tmp2.txt) do echo %%a >> registry_hklm_installed_services_tmp3.txt

3 个答案:

答案 0 :(得分:0)

您可以使用for /f命令循环浏览文件中的行,并将文件中的行传递给批处理文件中的子程序,该程序将在传递时解析它。提供以下内容:

Test.txt的

%windir%\test.txt
%programfiles%\Test2.txt

此批处理文件将解析环境变量:

@echo off

setlocal ENABLEDELAYEDEXPANSION

for /f "delims=" %%i in (Test.txt) do call :Expand "%%i"

endlocal
goto TheEnd

:Expand
set _var=%1
echo !_var:"=!

:TheEnd

这是运行时输出的外观:

c:\>Test.bat
C:\Windows\test.txt
C:\Program Files (x86)\Test2.txt

您可以将结果重定向到这样的新文本文件:

Test.bat > NewFile.txt

或者您可以修改原始Test.bat以在Expand下输出修改后的文件名,而不是将其回显到控制台。在%% i("%%i")周围包含引号很重要,或者在调用Expand时解析路径中的空格将分成多个变量(例如,%1,%2,%3等)。 )。 !_var:"=!删除了引号。

答案 1 :(得分:0)

这也将扩展变量。

@echo off
for /f "delims=" %%a in (Test.txt) do call echo %%a
pause

<强> Test.txt的

%windir%\test.txt
%programfiles%\Test2.txt

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
FOR /f "delims=" %%a IN (q22726616.txt) DO (
 FOR /f "delims=" %%b IN ('echo %%a') DO (
  ECHO %%b
 )
)

GOTO :EOF

我使用了一个名为q22726616.txt的文件,其中包含我的测试数据。

[修复了以下回复 - %%b行]