2015-05-01 60 views
2

我想写一个注册查询批处理文件,查找不包含的东西的关键数据。目前,此代码搜索密钥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 
) 
+2

将您的'reg query'命令输入到'find/i/v“.GPD”'或'find/i/v“**。GPD *”'或任何合适的。 – rojo

+0

这是有用的,但我怎么找到哪里依赖值没有* GPD * –

+0

DOH ...这是什么/ v是:: FACEPALM :: –

回答

1

使用所述命令由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类型后,我到一个计算机具有打印机安装(我的一个没有),并将此打印机的注册表项以regedit导出到.reg文件。接下来,我将此注册表文件导入到我的计算机的注册表中,并执行一次reg query以获取此密钥,以了解如何将多行值写入控制台reg

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

@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为他的separating variable with a symbol into different parts回答我展示了如何通过输出REG\0分离的所有文件名处理长字符串。

+0

这输出亚洲字符慭档湩湥浡൥ഊഊ伊䑃㝔㌰㠲㌴ഷഊ㌴ഷഊ等任何想法? –

+0

美丽!是否可以仅使用Lexmark Universal V XL输出缺少相关文件的设备?我只需要一个损坏的驱动程序的机器列表,没有别的。你的回答是史诗般的,非常感谢你! –

+0

当然可以检查__C中缺少哪些文件:\ Windows \ Sysnative \ spool \ drivers \ x64__及其子目录,然后将结果文件写入仅有缺少1个或多个文件的计算机以及缺少哪些文件。 – Mofi