배치 스크립트 내에서 레지스트리 키 값을 어떻게 가져올 수 있습니까?
REG QUERY 명령을 사용하여 키 값을보고이 명령을 사용하여 결과를 변수로 설정해야합니다.
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B
하지만 키가 존재하지 않으면 콘솔에 오류가 표시됩니다. 이 오류를 숨겨야합니다! stderr를 중지하는 명령 뒤에 2> nul을 넣으려고했지만 명령을 호출하는 경우에만 작동합니다.
REG QUERY "KeyName" /v ValueName 2>nul
다음과 같이 FOR 명령에 넣으면 :
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B 2>nul
오류가 표시됩니다. 그래서 누구든지 오류를 숨기는 방법을 알고 있습니까? 아니면 다른 명령도 키가 있는지 여부를 확인합니까?
감사
PS : Windows XP를 사용하고 있습니다.
이것은 나를 위해 작동합니다.
@echo OFF
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor
FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
if defined ValueName (
@echo Value Name = %ValueName%
@echo Value Type = %ValueType%
@echo Value Value = %ValueValue%
) else (
@echo %KEY_NAME%\%VALUE_NAME% not found.
)
usebackq
명령이 REG QUERY
큰 따옴표 를 사용 하기 때문에 필요 합니다.
skip=4
값 이름, 유형 및 값이있는 행 (있는 경우)을 제외한 모든 출력을 무시합니다.
2^>nul
오류 텍스트가 나타나지 않도록합니다. 명령 에 ^
를 넣을 수있는 이스케이프 문자입니다 .>
for
위의 스크립트를 주어진대로 실행하면 다음과 같은 출력이 나타납니다.
Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0
의 값을 VALUE_NAME
로 변경하면 BogusValue
다음과 같이 표시됩니다.
"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
이것은 Windows 7에서 공백을 포함하는 변수로 나를 위해 작동합니다.
FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\Software\SomeAPP" /v ValueName`) DO (
set appdir=%%A %%B
)
ECHO %appdir%
변수 A
는 첫 번째 공백 앞에 모든 데이터를 포함합니다. B
-ValueName의 나머지 부분 (추가 공백 포함)이므로appdir = ValueName
, 또한의 결과 출력을 전달 제안 (내가 우연히 발견하고 그것을 발견하기 전에 시행 착오에 의해 자신을 고정도에 발생하는) tryingToBeClever 솔루션을 기반으로 reg query
통해 find
때문에에 필터하기 위해 라인을 원하지 않는 ! REG.EXE VERSION x.y
불일치. 는 find
필터링 및 tokens
도 조정 정확히 우리가 (일반적으로 값을) 원하는 것을 선택할 수 있습니다. 또한 공백이 포함 된 키 / 값 이름으로 예기치 않은 결과를 방지하기 위해 따옴표를 추가했습니다.
값 가져 오기에만 관심이있을 때 제안 된 최종 결과 :
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKCU\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor
for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
echo %%A
)
사용시주의 find
할 점은 오류 reg
가 발생할 때 설정된 오류 수준이 이제 난독 화되어 있으므로 해당 키에있는 것으로 알려진 키 및 / 또는 이전 유효성 검사 후에 만이 접근 방식을 사용해야한다는 것입니다.
skip=1
키 이름에 값 이름도 포함되어 있지만 ( HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
및에서와 같이 CurrentVersion
) 대부분의 유연성이 제거 된 경우 약간의 추가 최적화 ( 출력의 첫 번째 줄 처리를 피하기 위해 추가 )를 수행 할 수 있지만 대부분의 유연성을 제거하므로 특정 용도로만 사용해야합니다. -케이스.
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKLM\SOFTWARE\Wow6432Node\Acme Software Inc\Common
set VALUE_NAME=InstallDir
FOR /F "tokens=2*" %%A IN ('REG.exe query "%KEY_NAME%" /v "%VALUE_NAME%"') DO (set pInstallDir=%%B)
echo %pInstallDir%
키에 공백이 있고 값에도 공백이있는 Win7에서 작동합니다. 따라서 위의 내용을 c : \ temp에 test.bat로 저장하고 cmd 창을 열고 실행하십시오.
C : \ temp> 테스트
C : \ Program Files (x86) \ acme Software Inc \ APP \
저는 이것이 오래된 질문이라는 것을 알고 있습니다.하지만이 한 줄짜리는 몇 가지 추가를 추가 한 원래 시도와 거의 동일합니다. 공백을 포함한 경로에서 작동하며 키를 찾을 수없는 경우에도 XP와 Windows 7에서 모두 작동합니다 (오류를 숨 깁니다). 키가 없으면 % fn %는 비어 있습니다. 이 예제는 현재 데스크탑 배경 파일 이름을 가져옵니다.
for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do @set fn=%%b
Windows 7 (Professional, 64 비트-다른 사람을 대신 할 수 없음)의 경우 REG가 더 이상 튀어 나오지 않습니다.
! REG.EXE VERSION 3.0
XP에서와 마찬가지로. 따라서 위의 내용을 수정해야
skip=2
4 대신-스크립트를 이식 할 수 있기를 원하면 일을 지저분하게 만듭니다. 훨씬 더 무겁고 복잡하지만 WMIC 기반 솔루션이 더 좋을 수 있습니다.
어떤 이유로 Patrick Cuff의 코드가 내 시스템 (Windows 7)에서 작동하지 않습니다. 아마도 tryingToBeClever의 의견 때문일 것입니다. 약간 수정하면 트릭이 생겼습니다.
@echo OFF
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_CURRENT_USER\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor
FOR /F "tokens=1-3" %%A IN ('REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul') DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
if defined ValueName (
@echo Value Name = %ValueName%
@echo Value Type = %ValueType%
@echo Value Value = %ValueValue%
) else (
@echo %KEY_NAME%\%VALUE_NAME% not found.
)
값에 공백이 포함 된 경우 작동합니다.
FOR /F "skip=2 tokens=1,2*" %%A IN ('REG QUERY "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul') DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
if defined ValueName (
echo Value Name = %ValueName%
echo Value Type = %ValueType%
echo Value Value = %ValueValue%
) else (
@echo "%KEY_NAME%"\"%VALUE_NAME%" not found.
)
여기에 훌륭한 수준의 솔루션이 있습니다.
@Patrick Cuff 솔루션이 상자에서 꺼내지 않았기 때문에 내 작은 소금 입자가 작동하지 않았습니다. 나는 두 가지 문제가 있었다
- Windows 7 사용 => "skip = 2"로 변경
- 레지스트리 값의 값에 공백이 있습니다.
Value Value = C:\Program Files\...
내가 찾은 해결책은 4 개의 토큰을 가져와 ValueValue를 %% C 및 %% D로 설정하는 것입니다. (@Ivan에게 감사드립니다!)
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor
FOR /F "usebackq skip=2 tokens=1-4" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C %%D
)
if defined ValueName (
@echo Value Name = %ValueName%
@echo Value Type = %ValueType%
@echo Value Value = %ValueValue%
) else (
@echo "%KEY_NAME:"=%\%VALUE_NAME%" not found.
)
레지스트리 값에 대한 특정 답변을 얻으려면 다음 쿼리를 사용할 수 있습니다.
REG QUERY "Key_Name"/ v "Value_Name"/ s
예 : REG QUERY "HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor"/ v "EnableExtensions"/ s
here / v : 특정 레지스트리 키 값을 쿼리합니다.
/s : Queries all subkeys and values recursively (like dir /s)
Thanks, i just need to use:
SETLOCAL EnableExtensions
And put a:
2^>nul
Into the REG QUERY called in the FOR command. Thanks a lot again! :)
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\awhost32.exe
set VALUE_NAME=Path
for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
echo %%A
)
How do you handle a space in the %%A variable? This results in C:\Program. The actual path is C:\Program Files\Symantec\pcAnywhere.
echo Off
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup"
set VALUE_NAME=release
REG QUERY %KEY_NAME% /S /v %VALUE_NAME%
endlocal
dot put \ at the end of KEY_NAME
I've come across many errors on Windows XP computers when using WMIC (eg due to corrupted files on machines). Hence imo best not to use WMIC for Win XP in code. No problems with WMIC on Win 7 though.
You can get the value of a registry key as follows
@echo OFF
setlocal ENABLEEXTENSIONS
set REG_NAME="HKEY_CURRENT_USER\Software\Test"
set KEY_NAME=TestVal
FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %REG_NAME% /v %KEY_NAME% 2^>nul`) DO (
@echo %%A : %%C
)
pause
those who wonder how to add reg keys, here is a way.
REGEDIT4
; @ECHO OFF
; CLS
; REGEDIT.EXE /S "%~f0"
; EXIT
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"
set regVar_LocalPrjPath="LocalPrjPath"
set regVar_Path="HKEY_CURRENT_USER\Software\xyz\KeyPath"
:: ### Retrieve VAR1 ###
FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %regVar_Path% /v %regVar_LocalPrjPath%') DO set "VAR1=%%B"
ReferenceURL : https://stackoverflow.com/questions/445167/how-can-i-get-the-value-of-a-registry-key-from-within-a-batch-script
'UFO ET IT' 카테고리의 다른 글
각 비트에 대해 주어진 확률이 0 또는 1 인 의사 랜덤 비트를 생성하는 빠른 방법 (0) | 2020.12.15 |
---|---|
C에서 외부 프로그램을 실행하고 출력을 구문 분석하려면 어떻게해야합니까? (0) | 2020.12.15 |
nohup과 데몬의 차이점은 무엇입니까? (0) | 2020.12.15 |
Python과 C ++ 통합 (0) | 2020.12.15 |
의사 난수 생성기-지수 분포 (0) | 2020.12.15 |