所以,我可能有一个简单的问题,但我似乎无法找到一个简单的答案。
问题:我有一个包含一组行的文件,例如:
%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
答案 0 :(得分:0)
您可以使用for /f
命令循环浏览文件中的行,并将文件中的行传递给批处理文件中的子程序,该程序将在传递时解析它。提供以下内容:
%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
行]