Discussion forum for all Windows batch related topics.
Moderator: DosItHelp
-
noprogrammer
- Posts: 36
- Joined: 29 Oct 2009 11:55
#1
Post
by noprogrammer » 30 Nov 2016 08:27
Hi,
I'm working on a deletion script for Adobe software which aims at the update "nagware" (AdobeAAMUpdater-1.0 etc.).
My script also deletes two registry keys added by Acrobat on each update:
Code: Select all
@echo off
Setlocal enableExtensions enableDelayedExpansion
REM (...)
Set AcrContextItems=^
HKLM\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\Adobe.Acrobat.ContextMenu^
HKLM\SOFTWARE\Classes\Folder\ShellEx\ContextMenuHandlers\Adobe.Acrobat.ContextMenu
For %%? In (%AcrContextItems%) Do (
Reg query "%%?" >nul 2>&1
If !ErrorLevel! Equ 0 (
Reg delete "%%?" /f && Echo Remove Acrobat context menu entry
)
)
(The list in
%AcrContextItems% might be extended in future.)
This doesn't work due to the asterisk within the first key name and I don't know a way to make it parsable...
What's your best practice for this?
-
SirJosh3917
- Posts: 36
- Joined: 02 May 2016 18:59
#2
Post
by SirJosh3917 » 30 Nov 2016 09:22
I'm not entirely sure, but is it possible you could do something along the lines of
for any chars that happen to make the batch script mad?
-
Squashman
- Expert
- Posts: 4486
- Joined: 23 Dec 2011 13:59
#3
Post
by Squashman » 30 Nov 2016 09:38
The FOR command will always treat the asterisk as a wildcard and think you are trying to find a file name. But, a FOR /F will not. So here is a work around for you.
Code: Select all
@echo off
Setlocal enableExtensions enableDelayedExpansion
REM (...)
Set AcrContextItems=^
HKLM\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\Adobe.Acrobat.ContextMenu^|^
HKLM\SOFTWARE\Classes\Folder\ShellEx\ContextMenuHandlers\Adobe.Acrobat.ContextMenu
:loop
FOR /F "tokens=1* delims=|" %%G IN ("%AcrContextItems%") DO (
Reg query "%%G" >nul 2>&1
If !ErrorLevel! Equ 0 (
Reg delete "%%G" /f && Echo Remove Acrobat context menu entry
)
set "AcrContextItems=%%H"
)
IF DEFINED AcrContextItems GOTO LOOP
-
Aacini
- Expert
- Posts: 1913
- Joined: 06 Dec 2011 22:15
- Location: México City, México
-
Contact:
#4
Post
by Aacini » 30 Nov 2016 10:01
The same Squashman's method, but implemented in a slightly simpler way:
Code: Select all
@echo off
Setlocal enableExtensions enableDelayedExpansion
REM (...)
Set AcrContextItems=^
HKLM\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\Adobe.Acrobat.ContextMenu^|^
HKLM\SOFTWARE\Classes\Folder\ShellEx\ContextMenuHandlers\Adobe.Acrobat.ContextMenu
for /F "tokens=*" %%a in (^"!AcrContextItems:^|^=^
% Do NOT remove this line %
!^") do (
Reg query "%%a" >nul 2>&1
If !ErrorLevel! Equ 0 (
Reg delete "%%a" /f && Echo Remove Acrobat context menu entry
)
)
The strange FOR /F command separate the substrings delimited by a certain character into individual lines, so the processing of all lines is simpler...
And talking about "best practice": you should not use special characters in the FOR replaceable parameter; doing that just confuse the people that don't know about this FOR feature and do not provide any advantage...
Antonio
-
Squashman
- Expert
- Posts: 4486
- Joined: 23 Dec 2011 13:59
#5
Post
by Squashman » 30 Nov 2016 10:05
Super Nice Antonio! Did not know about that trick.
-
jfl
- Posts: 226
- Joined: 26 Oct 2012 06:40
- Location: Saint Hilaire du Touvet, France
-
Contact:
#6
Post
by jfl » 02 Dec 2016 02:51
You can also use the same \n variable that we use in macros. This avoids the need for the replacement trick in the for loop.
Code: Select all
@echo off
Setlocal enableExtensions enableDelayedExpansion
:# Define a LF variable containing a Line Feed ('\x0A')
set LF=^
%# The two blank lines here are necessary. #%
%# The two blank lines here are necessary. #%
:# Define a continuation line including a Line Feed
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^^" &:# Insert a LF and continue macro on next line
Set AcrContextItems=^
HKLM\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\Adobe.Acrobat.ContextMenu %\n%
"HKCU\Control Panel\Desktop\PerMonitorSettings" %\n%
HKLM\SOFTWARE\Classes\Folder\ShellEx\ContextMenuHandlers\Adobe.Acrobat.ContextMenu
for /F "tokens=*" %%a in ("!AcrContextItems!") do (
echo Reg query %%a
)
exit /b
Also note that the "quotes" should be in each %AcrContextItems% list item that needs them (if it contains spaces or carets, etc), not around the %%a. Else they're going to enclose the extra space around the key names in each line.
-
Compo
- Posts: 600
- Joined: 21 Mar 2014 08:50
#7
Post
by Compo » 02 Dec 2016 05:32
None of that is of course necessary if you utilise your reg query search properly:
Code: Select all
@Echo Off
For /F "EOL=EDelims=" %%A In (
'Reg Query HKLM\SOFTWARE\Classes /S /F Adobe.Acrobat.ContextMenu /K'
) Do Reg Delete "%%A" /F>Nul
-
noprogrammer
- Posts: 36
- Joined: 29 Oct 2009 11:55
#8
Post
by noprogrammer » 03 Dec 2016 07:43
Thanks alot for the many solutions, I tried Aacini's version (haven't fully understood the masking yet) and it works.
The code just looks a bit "awkward" (and will get a comment).
Compo's reg query trick is another good approach - I'll check it out, too.