Jump to content


Photo

CMD script not working - FOR issue?


  • Please log in to reply
18 replies to this topic

#1 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 21 November 2009 - 09:19 PM

Hi, i´m working on new Windows 7 Update Pack Tool and i wrote this:


echo Adding registry weaks to enable RunOnceEx for install Special Updates...

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates" /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates
set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
		       copy /Y "%%f" "%WIM%\Windows\Setup\Updates"
                       REG ADD %ROE%\00%NUM% /ve /d "%%f" /f
                       REG ADD %ROE%\00%NUM% /v %%f /d "%WinDir%\Setup\Updates\%%f /q" /f
                       set /a NUM+=1
                   )
echo %NUM%

pause
REG UNLOAD HKLM\Slipstream
cd..

Writing into registry works, but under HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx is only one key 000 i´m used set /a NUM=0 and set /a NUM+=1 in FOR, but i don´t know why REG ADD %ROE%\00%NUM% /ve /d "%%f" /f not working if i make echo %NUM% it give me 3 (in folder are 3 Updates). Don´t know why script write only 000 key. I think it must write key 000, 001, 002

Posted Image

Edited by George King, 21 November 2009 - 09:22 PM.


#2 DaRk MaDnEsS

DaRk MaDnEsS

    Live Free or Die Hard

  • Contributors
  • 971 posts
  • Location:Some where out computer
  • OS:Windows 7

Posted 21 November 2009 - 09:34 PM

echo Adding registry weaks to enable RunOnceEx for install Special Updates...

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates" /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates
set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                       copy /Y "%%f" "%WIM%\Windows\Setup\Updates"
                       REG ADD %ROE%\00%NUM% /ve /d "%%f" /f
                       REG ADD %ROE%\00%NUM% /v %%f /d "%WinDir%\Setup\Updates\%%f /q" /f
                       goto :increase
                   )
echo %NUM%

pause
REG UNLOAD HKLM\Slipstream
cd..

:increase
set /a NUM+=1
goto :eof

try this

when i was working on WLM i remember that the for didn't increase until it gets out from the loop

i fixed it that way i think

try it and tell me

#3 Mr_Smartepants

Mr_Smartepants

    DriverPacks.net Administrator

  • Members
  • PipPipPipPipPipPip
  • 794 posts
  • Location:Cambridgeshire
  • OS:Windows 7

Posted 21 November 2009 - 09:45 PM

MSFN has an excellent resource on ROE.
http://unattended.ms...5fe4e2b832a08a/
Dark madness is right. You need to declare the number order
SET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %KEY% /V TITLE /D "Installing Applications" /f

REG ADD %KEY%\005 /VE /D "Adobe Reader 6" /f
REG ADD %KEY%\005 /V 1 /D "%systemdrive%\install\AdobeReader6\AR6.msi /qn" /f

REG ADD %KEY%\010 /VE /D "Alcohol 120" /f
REG ADD %KEY%\010 /V 1 /D "%systemdrive%\install\alcohol\setup.exe /qn" /f
REG ADD %KEY%\010 /V 2 /D "REGEDIT /S %systemdrive%\install\alcohol\register.reg" /f

Edited by Mr_Smartepants, 21 November 2009 - 09:46 PM.


#4 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 21 November 2009 - 11:05 PM

echo Adding registry weaks to enable RunOnceEx for install Special Updates...

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates" /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates
set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                       copy /Y "%%f" "%WIM%\Windows\Setup\Updates"
                       REG ADD %ROE%\00%NUM% /ve /d "%%f" /f
                       REG ADD %ROE%\00%NUM% /v %%f /d "%WinDir%\Setup\Updates\%%f /q" /f
                       goto :increase
                   )
echo %NUM%

pause
REG UNLOAD HKLM\Slipstream
cd..

:increase
set /a NUM+=1
goto :eof

try this

when i was working on WLM i remember that the for didn't increase until it gets out from the loop

i fixed it that way i think

try it and tell me


Not working, look:

Posted Image

The script will exit without REG UNLOAD etc and FOR was run only for one time, it must run 3 times (in folder are 3 updates)

Any ideas?

#5 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 22 November 2009 - 07:31 AM

You cannot use a changing environment variable in a script loop without using "SETLOCAL EnableDelayedExpansion".

Try the following code:

SETLOCAL EnableDelayedExpansion

echo Adding registry tweaks to enable RunOnceEx for install Special Updates...

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates" /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates
set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                       set /a ROENUM=!NUM!*5
                       If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                         If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                           set "ROESTR=!ROENUM!"))

                       copy /Y "%%f" "%WIM%\Windows\Setup\Updates"
                       REG ADD %ROE%\!ROESTR! /ve /d "%%f" /f
                       REG ADD %ROE%\!ROESTR! /v %%f /d "%WinDir%\Setup\Updates\%%f /q" /f
                       set /a NUM+=1
                       echo.  !ROESTR!:  "%%f"
                   )
echo.
echo !NUM! files added to ROE.
echo.
pause
REG UNLOAD HKLM\Slipstream
cd..

This script will properly handle up to 200 files with standard ROE numbering (multiples of 5, starting at 0).

And, yes, the exclamation points (!) are absolutely necessary for environment variables that change with EnableDelayedExpansion.

Edited by 5eraph, 22 November 2009 - 09:32 AM.

  • George King likes this

#6 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 22 November 2009 - 09:26 AM

You cannot use a changing environment variable in a script loop without using "SETLOCAL EnableDelayedExpansion".

Try the following code:

SETLOCAL EnableDelayedExpansion

echo Adding registry tweaks to enable RunOnceEx for install Special Updates...

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates" /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates
set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                       set /a ROENUM=!NUM!*5
                       If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                         If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                           set "ROESTR=!ROENUM!"))

                       copy /Y "%%f" "%WIM%\Windows\Setup\Updates"
                       REG ADD %ROE%\!ROESTR! /ve /d "%%f" /f
                       REG ADD %ROE%\!ROESTR! /v %%f /d "%WinDir%\Setup\Updates\%%f /q" /f
                       set /a NUM+=1
                       echo.  File !NUM! processed as !ROESTR!:  "%%f"
                   )
echo.
echo !NUM! files added to ROE.
echo.
pause
REG UNLOAD HKLM\Slipstream
cd..

This script will properly handle up to 200 files with standard ROE numbering (multiples of 5, starting at 0).

And, yes, the exclamation points (!) are absolutely necessary for environment variables that change with EnableDelayedExpansion.



Wow, it working :thumbsup_anim: . Many thanks.

Can you specify for me this code? I´m not sure if understand it...

set /a ROENUM=!NUM!*5
                       If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                         If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                           set "ROESTR=!ROENUM!"))

Edited by George King, 22 November 2009 - 09:29 AM.


#7 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 22 November 2009 - 10:03 AM

That code converts the number of the file it is working on into a proper string to be used for your registry entries.

  • First, the file number (starting at zero) is multiplied by 5, then saved as ROENUM by the SET command.
  • The If statements convert the number !ROENUM! into the proper string !ROESTR! by adding leading zeros where necessary. For example:

    NUM = ROENUM = ROESTR

    0 = 0 = 000
    1 = 5 = 005
    2 = 10 = 010
    ..
    19 = 95 = 095
    20 = 100 = 100
    ..
    199 = 995 = 995
    200 = 1000 = 1000
At NUM=200 it starts using four-digit ROE numbers, which will break the intended file execution order. :(
..
080
085
090
095
100
1000
1005
1010
1015
1020
1025
1030
1035
1040
1045
105
1050
1055
..

Edited by 5eraph, 22 November 2009 - 10:37 AM.

  • George King likes this

#8 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 22 November 2009 - 11:02 AM

Now i understand 100% Thanks a lot 5eraph

#9 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 22 November 2009 - 11:27 AM

You're welcome, George King. It's about time I started earning my keep here. ;)

#10 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 22 November 2009 - 04:00 PM

Can you help me? I think this can work, but it no. How i can use CMD /C like this?
CMD /C DEL /F /S /Q "WinDir%\Setup\Updates"
in this (replacing ++++):
REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "++++" /f >nul

I don´t know how it work...

#11 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 22 November 2009 - 04:21 PM

Try this:

REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "cmd.exe /q /c Del /F /S /Q \"%WinDir%\Setup\Updates\"" /f >nul


#12 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 22 November 2009 - 07:14 PM

Yes, it working, but folder with name Updates isn´t deleted, but only files in it are deleted. How i can delete Updates folder?

#13 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 22 November 2009 - 10:27 PM

Use the following code instead of the above:

REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "cmd.exe /q /c RmDir /S /Q \"%WinDir%\Setup\Updates\"" /f >nul


#14 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 17 January 2010 - 03:29 PM

5eraph,
I want add the DirectX switch, can you look why it not working? All working, but writing into registry with DX install switch (yes, swith working) wont working. I get error, too much parameters.... Any Ideas?

SETLOCAL EnableDelayedExpansion

echo.
echo Adding registry tweaks to enable RunOnceEx for install SPECIAL Updates...
echo.

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates..." /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates

set /a NUM=0
set SWITCH=/q
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                       set /a ROENUM=!NUM!*5
                       If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                         If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                           set "ROESTR=!ROENUM!"))

                       copy /Y "%%f" "%WIM%\Windows\Setup\Updates" >nul
                       REG ADD %ROE%\!ROESTR! /ve /d "%%f" /f >nul
                       if "%%f" == "DirectX*.exe" (set SWITCH=/Q /T:\"%WinDir%\Setup\Updates\DX\" /C:\"%WinDir%\Setup\Updates\DX\dxsetup.exe /silent\"
                                                   set DirectX=1
                                                  )
                       REG ADD %ROE%\!ROESTR! /v %%f /d "%WinDir%\Setup\Updates\%%f %SWITCH%" /f >nul
                       if "%DirectX%" == "1" set SWITCH=/q
                       set /a NUM+=1
                      )

REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "cmd.exe /q /c RmDir /S /Q \"%WinDir%\Setup\Updates\"" /f >nul
echo.
pause
REG UNLOAD HKLM\Slipstream >nul
cd..


#15 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 17 January 2010 - 10:10 PM

There were a couple reasons it wasn't working, but let's start with the following new code. The relevant portions have been tested as working here, so it should work for you as well.

SETLOCAL EnableDelayedExpansion

echo.
echo Adding registry tweaks to enable RunOnceEx for install SPECIAL Updates...
echo.

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates..." /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates

set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                        set /a ROENUM=!NUM!*5
                        If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                          If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                            set "ROESTR=!ROENUM!"))

                        copy /Y "%%f" "%WIM%\Windows\Setup\Updates" >nul
                        REG ADD %ROE%\!ROESTR! /ve /d "%%f" /f >nul

                        set "SWITCH=/q"
                        set "FILENAMECHECK=%%f"
                        if /I "!FILENAMECHECK:~0,7!"=="DirectX" (
                          if /I "!FILENAMECHECK:~-4!"==".exe" (
                            set "SWITCH=/Q /T:\"%WinDir%\Setup\Updates\DX\" /C:\"%WinDir%\Setup\Updates\DX\dxsetup.exe /silent\""))

                        REG ADD %ROE%\!ROESTR! /v "%%f" /d "%WinDir%\Setup\Updates\%%f !SWITCH!" /f >nul
                        set /a NUM+=1
                       )

REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "cmd.exe /q /c RmDir /S /Q \"%WinDir%\Setup\Updates\"" /f >nul
echo.
pause
REG UNLOAD HKLM\Slipstream >nul
cd..
Now for the reasons it wasn't working:

  • if "%%f" == "DirectX*.exe"
    • File names cannot be checked in this way. Asterisks (*) will not be interpreted as wildcards. It was necessary to translate this into a form that can be used in a CMD script. To do this a temporary variable, FILENAMECHECK, was created. Then, substrings of that variable were compared against the strings we're looking for; namely "DirectX" at the beginning and ".exe" at the end. An examination of the code above should show specifically how this is done.
  • REG ADD %ROE%\!ROESTR! /v %%f /d "%WinDir%\Setup\Updates\%%f %SWITCH%" /f >nulVariables that change in a loop and are also expanded in that same loop must be local variables. That means "%SWITCH%" must become "!SWITCH!".
By moving "set SWITCH=/q", I also simplified the script. The variable DirectX as it was used is no longer necessary.

Edited by 5eraph, 17 January 2010 - 10:24 PM.

  • George King likes this

#16 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 19 January 2010 - 08:54 PM

Thanks, i modded to look like this, but the setting NAME not working, can you tell me why please?

SETLOCAL EnableDelayedExpansion

echo.
echo Adding registry tweaks to enable RunOnceEx for install SPECIAL Updates...
echo.

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates..." /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates

set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                        set /a ROENUM=!NUM!*5
                        If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                          If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                            set "ROESTR=!ROENUM!"))

                        copy /Y "%%f" "%WIM%\Windows\Setup\Updates" >nul
                        REG ADD %ROE%\!ROESTR! /ve /d "%%f" /f >nul

                        set "SWITCH=/q"
                        set "FILENAMECHECK=%%f"

                        if /I "!FILENAMECHECK:~0,7!"=="DirectX" (
                          if /I "!FILENAMECHECK:~-4!"==".exe" (
                            set "SWITCH=/Q /T:\"%WinDir%\Setup\Updates\DX\" /C:\"%WinDir%\Setup\Updates\DX\dxsetup.exe /silent\""
                            set "NAME=DirectX SDK"))

                        if /I "!FILENAMECHECK:~0,15!"=="GamesForWindows" (
                          if /I "!FILENAMECHECK:~-4!"==".exe" (
                            set "NAME=Games for Windows - LIVE"))

                        if /I "!FILENAMECHECK:~0,11!"=="PlayReadyPC" (
                          if /I "!FILENAMECHECK:~-4!"==".msi" (
                            set "SWITCH=/quiet /norestart"                            
                            set "NAME=PlayReady PC Runtime"))

                        if /I "!FILENAMECHECK:~0,11!"=="Silverlight" (
                          if /I "!FILENAMECHECK:~-4!"==".exe" (
                            set "NAME=Microsoft Silverlight"))

                        if /I "!FILENAMECHECK:~0,16!"=="windows-kb890830" (
                          if /I "!FILENAMECHECK:~-4!"==".exe" (
                            set "NAME=Malicious Software Removal Tool"))

                        if /I "!FILENAMECHECK:~0,7!"=="wlsetup" (
                          if /I "!FILENAMECHECK:~-4!"==".exe" (
                            set "SWITCH=/silent"
                            set "NAME=Windows Live Essentials"))

                        REG ADD %ROE%\!ROESTR! /v "!NAME!" /d "%WinDir%\Setup\Updates\%%f !SWITCH!" /f >nul
                        set /a NUM+=1
                       )

REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "cmd.exe /q /c RmDir /S /Q \"%WinDir%\Setup\Updates\"" /f >nul
echo.
REG UNLOAD HKLM\Slipstream >nul
cd..

EDIT: I forget move REG ADD %ROE%\!ROESTR! /ve /d "%%f" /f >nul down and change %%f to !NAME!. I will try, maybe it will work ;)

Edited by George King, 19 January 2010 - 09:07 PM.


#17 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 20 January 2010 - 08:31 AM

I'm sorry for the delay. I've been away.

It looks like NAME should work in your revised code for the instances where you have it defined. The only problem I see is when files are found that don't match your file name checks. This is easily solved with a single line of code, set "NAME=%%f", in the right place as shown in the new code below.

Also, most of the files we are looking for end with ".exe". The If statements can be rearranged to simplify the code by writing the check for ".exe" only once. This makes the code far more efficient when a file does not end with ".exe" by reducing the number of checks these files need to go through.

EDIT: I forgot to make the changes you mentioned in your last reply. Fixed.

SETLOCAL EnableDelayedExpansion

echo.
echo Adding registry tweaks to enable RunOnceEx for install SPECIAL Updates...
echo.

REG LOAD HKLM\Slipstream "%WIM%\Windows\System32\Config\Software" >nul
SET ROE=HKLM\Slipstream\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %ROE% /v TITLE /d "Installing updates..." /f  >nul
REG ADD %ROE% /v Flags /t REG_DWORD /d "00000014" /f  >nul
REG ADD %ROE% /d "%WinDir%\System32\rundll32.exe %WinDir%\System32\iernonce.dll,RunOnceExProcess" /f >nul

cd SpecialUpdates

set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                        set /a ROENUM=!NUM!*5
                        If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                          If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                            set "ROESTR=!ROENUM!"))

                        copy /Y "%%f" "%WIM%\Windows\Setup\Updates" >nul

                        set "SWITCH=/q"
                        set "NAME=%%f"
                        set "FILENAMECHECK=%%f"

                        if /I "!FILENAMECHECK:~-4!"==".exe" (

                          if /I "!FILENAMECHECK:~0,7!"=="DirectX" (
                            set "SWITCH=/Q /T:\"%WinDir%\Setup\Updates\DX\" /C:\"%WinDir%\Setup\Updates\DX\dxsetup.exe /silent\""
                            set "NAME=DirectX SDK")

                          if /I "!FILENAMECHECK:~0,15!"=="GamesForWindows" (
                            set "NAME=Games for Windows - LIVE")

                          if /I "!FILENAMECHECK:~0,11!"=="Silverlight" (
                            set "NAME=Microsoft Silverlight")

                          if /I "!FILENAMECHECK:~0,16!"=="windows-kb890830" (
                            set "NAME=Malicious Software Removal Tool")

                          if /I "!FILENAMECHECK:~0,7!"=="wlsetup" (
                            set "SWITCH=/silent"
                            set "NAME=Windows Live Essentials")
                        )

                        if /I "!FILENAMECHECK:~0,11!"=="PlayReadyPC" (
                          if /I "!FILENAMECHECK:~-4!"==".msi" (
                            set "SWITCH=/quiet /norestart"                            
                            set "NAME=PlayReady PC Runtime"))

                        REG ADD %ROE%\!ROESTR! /ve /d "!NAME!" /f >nul
                        REG ADD %ROE%\!ROESTR! /v "!NAME!" /d "%WinDir%\Setup\Updates\%%f !SWITCH!" /f >nul
                        set /a NUM+=1
                       )

REG ADD %ROE%\999 /ve /d "Cleaning up..." /f >nul
REG ADD %ROE%\999 /v CMD /d "cmd.exe /q /c RmDir /S /Q \"%WinDir%\Setup\Updates\"" /f >nul
echo.
REG UNLOAD HKLM\Slipstream >nul
cd..

Edited by 5eraph, 20 January 2010 - 08:15 PM.

  • George King likes this

#18 George King

George King

    Wincert Addict

  • Members
  • PipPipPipPipPipPip
  • 551 posts
  • Location:cs-CZ

Posted 02 March 2010 - 07:03 PM

Ok, can you again help me please? I need add "fix" which will skip HTML and TXT files. Can you help me? I dont know how i can figure it...
set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                        set /a ROENUM=!NUM!*5
                        If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                          If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                            set "ROESTR=!ROENUM!"))

                        set "SWITCH=/q"
                        set "NAME=%%f"
                        set "FILENAMECHECK=%%f"

                        if /I "!FILENAMECHECK:~-4!"==".exe" (

                          if /I "!FILENAMECHECK:~0,7!"=="DirectX" (
                            set "SWITCH=/Q /T:\"%WinDir%\Setup\Updates\DX\" /C:\"%WinDir%\Setup\Updates\DX\dxsetup.exe /silent\""
                            set "NAME=DirectX Redistributable")

                          if /I "!FILENAMECHECK:~0,15!"=="GamesForWindows" (
                            set "NAME=Games for Windows - LIVE")

                          if /I "!FILENAMECHECK:~0,11!"=="Silverlight" (
                            set "NAME=Microsoft Silverlight")

                          if /I "!FILENAMECHECK:~0,16!"=="windows-kb890830" (
                            set "NAME=Malicious Software Removal Tool")

                          if /I "!FILENAMECHECK:~0,7!"=="wlsetup" (
                            set "SWITCH=/silent"
                            set "NAME=Windows Live Essentials")

                          if /I "!FILENAMECHECK:~0,8!"=="rootsupd" (
                            set "NAME=Root Certificates Update")

                          if /I "!FILENAMECHECK:~0,4!"=="msse" (
                            set "MSSE=1"
                            set "NAME=Microsoft Security Essentials"
                            "%%f" /Q /X:"%WIM%\Windows\Updates\MSSE"
                            set "SWITCH=MSSE\setup.exe /s /runwgacheck /o")
                        )

                        if /I "!FILENAMECHECK:~0,11!"=="PlayReadyPC" (
                          if /I "!FILENAMECHECK:~-4!"==".msi" (
                            set "SWITCH=/quiet /norestart"                            
                            set "NAME=PlayReady PC Runtime"))

                        if /I "!MSSE!"=="1" (REG ADD %ROE%\!ROESTR! /ve /d "!NAME!" /f >nul
                                             REG ADD %ROE%\!ROESTR! /v "!NAME!" /d "%WinDir%\Setup\Updates\!SWITCH!" /f >nul) ELSE (REG ADD %ROE%\!ROESTR! /ve /d "!NAME!" /f >nul
                                                                                                                                    REG ADD %ROE%\!ROESTR! /v "!NAME!" /d "%WinDir%\Setup\Updates\%%f !SWITCH!" /f >nul)
                        copy /Y "%%f" "%WIM%\Windows\Setup\Updates" >nul

                        set /a NUM+=1
                       )


#19 5eraph

5eraph

    Member

  • Members
  • PipPip
  • 46 posts
  • Location:Riverview, MI
  • OS:Windows XP Pro x64

Posted 02 March 2010 - 08:07 PM

We can nest most of the code within a couple more If statements to skip TXT and HTML files:

if /I NOT "!FILENAMECHECK:~-4!"==".txt" (
  if /I NOT "!FILENAMECHECK:~-5!"==".html" (
I also simplified your Microsoft Security Essentials file processing using the variable !SETUPPATH!, which allows you to make similar adjustments to files you may add in the future.

Here is the final code with all modifications. It is untested.

set /a NUM=0
if not exist "%WIM%\Windows\Setup\Updates" mkdir "%WIM%\Windows\Setup\Updates" >nul
FOR %%f IN ("*.*") DO (
                       set "FILENAMECHECK=%%f"
                       if /I NOT "!FILENAMECHECK:~-4!"==".txt" (
                         if /I NOT "!FILENAMECHECK:~-5!"==".html" (

                           set /a ROENUM=!NUM!*5
                           If !ROENUM! LSS 10 (set "ROESTR=00!ROENUM!") ELSE (
                             If !ROENUM! LSS 100 (set "ROESTR=0!ROENUM!") ELSE (
                               set "ROESTR=!ROENUM!"))

                           set "SWITCH=/q"
                           set "NAME=%%f"
                           set "SETUPPATH=%%f"

                           if /I "!FILENAMECHECK:~-4!"==".exe" (

                             if /I "!FILENAMECHECK:~0,7!"=="DirectX" (
                               set "SWITCH=/Q /T:\"%WinDir%\Setup\Updates\DX\" /C:\"%WinDir%\Setup\Updates\DX\dxsetup.exe /silent\""
                               set "NAME=DirectX Redistributable")

                             if /I "!FILENAMECHECK:~0,15!"=="GamesForWindows" (
                               set "NAME=Games for Windows - LIVE")

                             if /I "!FILENAMECHECK:~0,11!"=="Silverlight" (
                               set "NAME=Microsoft Silverlight")

                             if /I "!FILENAMECHECK:~0,16!"=="windows-kb890830" (
                               set "NAME=Malicious Software Removal Tool")

                             if /I "!FILENAMECHECK:~0,7!"=="wlsetup" (
                               set "SWITCH=/silent"
                               set "NAME=Windows Live Essentials")

                             if /I "!FILENAMECHECK:~0,8!"=="rootsupd" (
                               set "NAME=Root Certificates Update")

                             if /I "!FILENAMECHECK:~0,4!"=="msse" (
                               set "NAME=Microsoft Security Essentials"
                               "%%f" /Q /X:"%WIM%\Windows\Updates\MSSE"
                               set "SETUPPATH=MSSE\setup.exe"
                               set "SWITCH=/s /runwgacheck /o")
                           )

                           if /I "!FILENAMECHECK:~-4!"==".msi" (
                             if /I "!FILENAMECHECK:~0,11!"=="PlayReadyPC" (
                               set "SWITCH=/quiet /norestart"                            
                               set "NAME=PlayReady PC Runtime"))

                           REG ADD %ROE%\!ROESTR! /ve /d "!NAME!" /f >nul
                           REG ADD %ROE%\!ROESTR! /v "!NAME!" /d "%WinDir%\Setup\Updates\!SETUPPATH! !SWITCH!" /f >nul
                        
                           If /I "!SETUPPATH!"=="%%f" (copy /Y "%%f" "%WIM%\Windows\Setup\Updates")>nul

                           set /a NUM+=1
                      )) )

Edited by 5eraph, 02 March 2010 - 08:48 PM.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users