BATCH/CMD: Print each line of a .txt into a variab

2019-08-28 15:04发布

问题:

Goal: Have every dll file in a computer passed into regsvr32.exe

Accomplished: cd\
::REM Exports every file and directory (/s) into a file in root of c: called dir.txt with only file names (/b)
dir /s /b>>dir.txt
::REM Now, this will contain every extension type. We only want dll's, so we findstr it into dll.txt:
findstr ".dll$" dir.txt>>dll.txt

The Kink:

Now, if I want to regsvr32.exe "file" every file that is now in dll.txt, I somehow need to get out every individual filename that is individually on each line. I was wondering if there is a third party command line tool that can export each line of the file into a variable. This way, I could:

==========

::REM assume this tool had switches /l for the line number, and /v:"" for variable to use, and used "file" at the end:

set line=1  
:loop  
set dll=  
tool.exe /l %line% /v:"dll" "dll.txt"  
::REM We if defined here because if the line doesn't exist in dll.txt, the tool would return nothing to %dll%
if not defined %dll% exit  
::REM With the variable defined, we can continue  
regsvr32.exe %dll%  
set /a line=%line%+1  
goto loop  

=======================

Then the tool would process each path of each line of the file until it exits automatically, because there would be no more lines. Notice right after loop I set dll to nothing so that 'if not defined' will work each time.

If this type of third-party tool cannot be done, is there a way to do that with for?? I honestly never learned for, and tried to but could never figure it out.

Any help is greatly appreciated!

Sorry if this has already been answered.

EDIT/UPDATE: I have discovered how I will make this work.

Thanks to: http://pyrocam.com/re-register-all-dlls-to-fix-no-such-interface-supported-error-in-windows-7-after-installing-ie7-standalone/
and : Read a txt line by line in a batch file

The first link shows manually replacing the beginning with regsvr32.exe
The second shows how to use for in this case {also thanks to craig65535 FOR his help :)}

Code:

@echo off
color 1f
title Register .dll
echo.
echo Exporting file list . . .
echo.
cd /d c:
cd\
if exist dll.txt del dll.txt
if exist dir.txt del dir.txt
if exist dll.bat del dll.bat
echo Part 1 of 3 . . .
echo.
dir /s /b>>dir.txt
echo Part 2 of 3 . . .
echo.
findstr ".dll$" dir.txt>>dll.txt
del dir.txt
echo Part 3 of 3 . . .
echo.
for /f "delims=" %%i IN ('type dll.txt') do echo regsvr32.exe /s "%%i">>dll.bat
del dll.txt
echo Ready to begin regsvr32.exe . . .
echo.
pause
echo.
echo Beginning registration . . .
echo *This will take time, close any popups that occur
echo.
call dll.bat
echo.
echo Deleting registration file . . .
if exist dll.bat del dll.bat
echo.
echo DONE.
echo.
pause >nul

回答1:

The command you want is for /f.

for /f %%f in ('type dll.txt') do regsvr32.exe %%f

That takes the output of type dll.txt and puts one line at a time into %%f. You can then use %%f as an argument for some other command.

If you want to do more than regsvr32.exe %%f, you can write another batch file and call that:

for /f %%f in ('type dll.txt') do call process.bat %%f

process.bat would then receive the filename as %1.