batch file注册查询与逻辑运算符(不)

我正在尝试编写一个注册查询batch file,查找不包含的东西的关键数据。 目前,此代码search关键的Dependent Files (REG_MULTI_SZ),并将输出写入文件。 我需要它忽略包含“**。GPD *”的Dependent Files中的任何数据。

如何将逻辑运算符合并到简单的REG QUERY中?

 @echo off set file=c:\Temp\regcomplist.txt for /f "Tokens=*" %%g in (%file%) do ( echo %%g>> c:\Temp\regquery.txt REG QUERY "\\%%g\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers\Version-3\Lexmark Universal v2 XL" /v "Dependent Files">> c:\Temp\regquery.txt echo.>> c:\Temp\regquery.txt echo.>> c:\Temp\regquery.txt ) 

使用rojo建议的命令的批处理代码是:

 @echo off set "ListFile=C:\Temp\regcomplist.txt" set "ResultsFile=C:\Temp\regquery.txt" for /f "delims=" %%g in (%ListFile%) do ( echo %%g>>%ResultsFile% %SystemRoot%\System32\reg.exe query "\\%%g\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers\Version-3\Lexmark Universal v2 XL" /v "Dependent Files" | %SystemRoot%\System32\find.exe /i /v "**.GPD*">>%ResultsFile% echo.>>%ResultsFile% echo.>>%ResultsFile% ) 

添加注册表值Dependent FilesREG_MULTI_SZ类型的信息后,我去了一台安装了打印机(我没有)的计算机,并将此打印机的注册表键与注册表编辑器导出到.reg文件。 接下来,我将这个注册表文件导入到我的计算机的注册表中,并执行一次注册表reg query查看这个注册表是如何将多行值写入控制台的。

然后我可以开发下面的批注文件。

 @echo off setlocal EnableDelayedExpansion set "Printer=Lexmark Universal v2 XL" set "ListFile=C:\Temp\regcomplist.txt" set "ResultsFile=C:\Temp\regquery.txt" if exist "%ResultsFile%" del "%ResultsFile%" rem Run the procedure GetPrinterFiles on each computer of list file. for /f "delims=" %%g in (%ListFile%) do ( echo %%g>>%ResultsFile% call :GetPrinterFiles "%%g" echo.>>%ResultsFile% echo.>>%ResultsFile% ) endlocal rem Exit this batch file. goto :EOF rem Get multiline string with the file names from registry and parse that rem string with procedure GetFileNames if the printer is installed at all. :GetPrinterFiles for /F "skip=2 tokens=3*" %%A in ('%SystemRoot%\System32\reg.exe query "\\%~1\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers\Version-3\%Printer%" /v "Dependent Files" 2^>nul') do ( if "%%A"== "REG_MULTI_SZ" ( call :GetFileNames "%%B" goto :EOF ) ) rem Document in results file that printer is not installed on this computer. echo Error: %Printer% not installed.>>%ResultsFile% rem Exit procedure GetPrinterFiles and return to main loop above. goto :EOF rem The file names are passed from procedure GetPrinterFiles in a long string rem with \0 as separator between the file names. This long string is split rem into individual file names by the FOR loop below. Each file name is rem assigned to an environment variable. A case-sensitive comparison is rem made between value of this variable having all ".GPD" case-insensitive rem removed with unmodified value of this variable. If modified variable rem value is equal unmodified variable value, ".GPD" is not present in any rem case in file name resulting in writing the file name into the results rem file. Otherwise this file containing ".GPD" in any case is ignored. :GetFileNames set "FilesList=%~1" for %%F in ("%FilesList:\0=","%") do ( set "FileName=%%~F" if "!FileName:.GPD=!" == "!FileName!" ( echo !FileName!>>%ResultsFile% ) ) rem Exit procedure GetFileNames and return to GetPrinterFiles procedure above. goto :EOF 

感谢rojo的回答,把变量与符号分隔成不同的部分,向我展示了如何处理长字符串,所有文件名都由\0分隔输出。