Need help getting the regkey entry value in script - batch-file

I have a batch script that will clean out temp files and all that but I need assistance getting a path from the registry into the script. Specifically the Outlook temp file regkey entry. I have the key path but I do not know how to grab the directory value from the registry and set it where I can then delete the temp files. I probably do not make an since but I just started doing scripts and I guess I just suck lol. I have done a reg query and it shows the path but obviously set /p name= or anything around that wont just set %name% as a path to where I could then do my delete script and *.*
Any help would be much appreciated!!!!!
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\14.0\Outlook\Security"
set VALUE_NAME=OutlookTemp
pause
FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% ) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
pause
if defined ValueName (
#echo Value Name = %ValueName%
#echo Value Type = %ValueType%
#echo Value Value = %ValueValue%
) else (
#echo %KEY_NAME%\%VALUE_NAME% not found.
)
pause
This is something I have tried from another post but originally I was using this to make a file to the desktop and was going to parse the file for the temp directory then delete the files in the temp folder. I also just paused it out to see what was working and what was not.
START /W REGEDIT /E C:\Users\"username"\Desktop "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\14.0\Outlook\Security"
And that makes a reg file to the desktop and I tried finding on how to parse the file and found a post that used
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B
But that didn't work for me or I am doing something incorrect. Prolly just me but lol

If you have the following in your batch file then the location you require could be used as "%ValueData%"
FOR /F "TOKENS=2*" %%I IN ('REG QUERY "HKCU\SOFTWARE\Microsoft\Office\14.0\Outlook\Security" /V OutlookSecureTempFolder') Do SET "ValueData=%%J"
You could then use the variable for your deletion thus:
DEL /S /Q "%ValueData%\*.*"

Related

How to get a specific value from registry file into variable as a batch script

First post here
I am working on deploying a specific .dll file (iprint.dll) into the end users IBM folder, so they are able to print. I am trying to make the script so it checks from the registry path, since the IBM Notes location can be installed in different locations. The path im looking at is the following.
KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Lotus\Notes\9.0
VALUE_NAME=Path
If i do reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Lotus\Notes\9.0" /v "Path"
I get the following : Path REG_SZ C:\Lotus\Notes\
But i only want the data value C:\Lotus\Notes\
My end goal is to take the value and place in a variable that i can copy/install the iprint.dll to.
I am not an expert in this at all and what everything ive learned is from google searching.
So far i got the following, which is failing, what am i doing wrong and any suggestions?
#echo on
setlocal
set __COMPAT_LAYER=RunAsInvoker
set SEE_MASK_NOZONECHECKS=1
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Lotus\Notes\9.0"
set VALUE_NAME=Path
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.
)
copy "iPrint.dll" %ValueValue%
endlocal

Batch File Loop Doesn't Include Nested Loop

Edit1:
So it seems my loop runs to the very last record and then executes the mkdir and MOVE commands. I feel like I'm missing parentheses somewhere?
FOR %%i IN (%folderPath%\*.Pdf) DO SET fileName=%%i
ECHO %fileName%
FOR /f "tokens=3-4 delims=_" %%a IN ("%fileName%") DO SET fileClientID=%%a_%%b
ECHO %fileClientID%
REM Check to see if folders exist, and if they do not, create them
IF NOT EXIST "%folderPath%\%fileYear%" mkdir %folderPath%\%fileYear%
IF NOT EXIST "%folderPath%\%fileYear%\%fileMonth%" mkdir %folderPath%\%fileYear%\%fileMonth%
IF NOT EXIST "%folderPath%\%fileYear%\%fileMonth%\%fileClientID%" mkdir %folderPath%\%fileYear%\%fileMonth%\%fileClientID%
REM Moves the file from source path to destination path
SET fileSourcePath="%fileName%"
SET fileDestPath="%folderPath%\%fileYear%\%fileMonth%\%fileClientID%"
MOVE "%fileSourcePath%" "%fileDestPath%"
PAUSE
So I finally finished the code and it all works as it should. I really appreciate everyone's help getting me to this point as this is my first batch file script I've ever written. Final product below and of course if there are any best practices or more efficient ways of writing it, I'd love the feedback. Thanks again!
#ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
SET folderPath="C:\Users\nha\Desktop\FolderMover\Test"
FOR %%a IN (%folderPath%\*.Pdf) DO (
SET fileDate=%%~ta
SET fileName=%%a
FOR /f "tokens=1,3 delims=/, " %%a IN ("!fileDate!") DO (
SET fileYear=%%b
SET fileMonth=%%a
For /f "tokens=3-4 delims=_" %%a IN ("!fileName!") DO (
SET fileClientID=%%a_%%b
IF NOT EXIST !folderPath!\!fileYear!\!fileMonth!\!fileClientID! mkdir !folderPath!\!fileYear!\!fileMonth!\!fileClientID!
SET fileSourcePath=!fileName!
SET fileDestPath=!folderPath!\!fileYear!\!fileMonth!\!fileClientID!
MOVE !fileSourcePath! !fileDestPath!
)
)
)

Reading registry value's data with spaces

I am making a program. When installed, It will run a batch file which needs to know where the application folder is.
The installation wizard software I am using creates a registry key that represents the program's path, but "Program Files" has a space in it, so the batch output will be "C:\Program"
My current script is:
#echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_LOCAL_MACHINE\Software\MarksRTZ\AV"
set VALUE_NAME=DataPath
FOR /F "usebackq skip=2 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 data "%ValueValue%"
echo name "%ValueName%"
echo type "%ValueType%"
) else (
echo Not found
)
The DataPath value is set to [APPDIR]\data on installation, [APPDIR] being the location the user selected.
But like I said, that script will always output C:\Program if [APPDIR] was set to something like C:\Program Files (x86)\MarksRTZ\AV\ in the installer (Which is actually the default)
How can I fix this?
I will also note; the batch file isn't the real program, It's going to be the simple script that launches the program in the correct working directory.
Next code snipped should work with tokens=1-2* and even with setlocal DISABLEEXTENSIONS:
rem ensure %ValueName% is not visible as it could be defined already!
set "ValueName="
FOR /F "usebackq 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 data "%ValueValue%"
echo name "%ValueName%"
echo type "%ValueType%"
) else (
echo Not found
)
Resources:
FOR /F Loop command: against the results of another command;
SETLOCAL Set options to control the visibility of environment variables in a batch file

Get full and correct path from registry value via batch file

I need help in getting full and correct folder path from registry value via batch file.
I have such a code to do it:
#echo off
setlocal ENABLEEXTENSIONS
set R_MSBUILD_KEY="\\.\HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0"
set R_MSBUILD_VALUE="MSBuildToolsPath"
REM Get MSBUILD path from registry
FOR /f "tokens=1,2,3,4" %%A IN ('REG QUERY %R_MSBUILD_KEY% /v %R_MSBUILD_VALUE% 2^>nul') DO SET MSBUILD_PATH=%%C%%D
if defined MSBUILD_PATH (
#ECHO MSBUILD = %MSBUILD_PATH%\MSBuild.exe
) else (
#echo %R_MSBUILD_KEY%\%R_MSBUILD_VALUE% not found.
)
As a response I receive the following path:
MSBUILD = C:\ProgramFiles\MSBuild.exe
Instead of C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe.
My problem is that I cannot understand how to retrieve full and correct path(with spaces in folders where it is actually).How to receive full and correct path in my case?
Without seeing the reg query output I can't be sure, but see if this line gives you the correct output.
FOR /f "tokens=1,2,*" %%A IN ('REG QUERY %R_MSBUILD_KEY% /v %R_MSBUILD_VALUE% 2^>nul') DO SET "MSBUILD_PATH=%%C"

How can I get the value of a registry key from within a batch script?

I need to use a REG QUERY command to view the value of a key and set the result into a variable with this command:
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B
But if the key doesnt exists i get an error shown in the console. I need to hide this error! I tried putting a 2>nul after the command to stop the stderr, but this works if i only call the command:
REG QUERY "KeyName" /v ValueName 2>nul
If i put it into the FOR command like this:
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B 2>nul
The error is shown.
So does anyone know how to hide the error? Or maybe another command too see if a key exists or not?
Thanks
PS: I'm using Windows XP
This works for me:
#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 is needed since the command to REG QUERY uses double quotes.
skip=4 ignores all the output except for the line that has the value name, type and value, if it exists.
2^>nul prevents the error text from appearing. ^ is the escape character that lets you put the > in the for command.
When I run the script above as given, I get this output:
Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0
If I change the value of VALUE_NAME to BogusValue then I get this:
"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
This work for me with variable that contains spaces on 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%
Variable A contains all data before first space, B - rest part of ValueName (including further spaces), so appdir = ValueName
This one-liner is pretty much the same as your original try with a couple of additions. It works with paths including spaces, and works in both XP and Windows 7 even if the key is not found (and hides the error). %fn% will be empty if the key does not exist. This example gets the current desktop background filename:
for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do #set fn=%%b
This command uses tokens=2* with %%a as the loop variable but consumes %%b to correctly handle spaces. When using tokens=2*, the loop variable %%a is assigned the value in the second token (in this case, REG_SZ) and %%b is assigned the remainder of the line after the next group of delimiter characters, including all internal delimiter characters. This means that %%b will correctly replicate delimiter characters—even if multiple delimiter characters are clustered together. For example, the value might be C:\A weird path\blah.png. This technique of reading the value would correctly preserve the two spaces between C:\A and weird.
Based on tryingToBeClever solution (which I happened to also stumble upon and fixed myself by trial-and-error before finding it), I also suggest passing the result output of reg query through find in order to filter undesired lines due to the ! REG.EXE VERSION x.y inconsistency. The find filtering and tokens tweaking also allows to pick exactly what we want (typically the value). Also added quotes to avoid unexpected results with key/value names containing spaces.
Final result proposed when we are only interested in fetching the value:
#echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKCU\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor
for /F "usebackq tokens=1,2,*" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
echo %%C
)
A potential caveat of using find is that the errorlevel set by reg when errors occur is now obfuscated so one should only use this approach for keys known to be there and/or after a previous validation.
A tiny additional optimization (add skip=1 to avoid processing the first line of output) can be done in cases when the key name also contains the value name (as it is the case with HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion and CurrentVersion) but removes most flexibility so should only be used in particular use-cases.
#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%
That works for me in Win7 where the key has a space and the value also has a space.
So saving the above in c:\temp as test.bat, open a cmd window and run it.
C:\temp>test
C:\Program Files (x86)\acme Software Inc\APP\
For some reason Patrick Cuff's code doesn't work on my system (Windows 7) probably due to tryingToBeClever's comment. Modifying it a little did the trick:
#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 Windows 7 (Professional, 64-bit - can't speak for the others) I see that REG no longer spits out
! REG.EXE VERSION 3.0
as it does in XP. So the above needs to be modified to use
skip=2
instead of 4 - which makes things messy if you want your script to be portable. Although it's much more heavyweight and complex, a WMIC based solution may be better.
This works if the value contains a space:
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.
)
Great level of solutions here.
My little grain of salt as the solution #Patrick Cuff did not work out of the box; I had 2 problems
I use Windows 7 => changed to "skip=2"
The value of the registry value had a space in it Value Value = C:\Program Files\...
Here is the solution I found: taking 4 tokens and setting ValueValue to %%C and %%D. (Thanks #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.
)
To get a particular answer to the registry value you may use the following query:
REG QUERY "Key_Name" /v "Value_Name" /s
eg:
REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v "EnableExtensions" /s
here
/v : Queries for a specific registry key values.
/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"
With regedit:
#echo off
setlocal
::if the scrit is not ran as administrator
:: and the key does not require admin permissions
set __COMPAT_LAYER=RunAsInvoker
set "key=%~1"
set "value=%~2"
regedit /e "#.reg" "%key%"
for /f "tokens=1,* delims==" %%a in ('find """%value%""=" "#.reg"') do if "%%~b" neq "" echo %%~b
del /q #.reg
endlocal
Example:
call regreader.bat "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1033\" Version
output:
3.0.30729.4926
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"
You can also use this solution with a single command line:
VARIABLE=$(reg query "HKLM\REGISTRYKEYPATH" /v "REGISTRY KEY" | grep -i "REGISTRY KEY" | awk '{print $NF;}')
For your information $NF retrieves the last field (which is the registry key value).

Resources