5eraph
Members
-
Joined
-
Last visited
Reputation Activity
-
5eraph reacted to ricktendo in Windows 7 Hotfix repositorySource: My Digital Life Forums
-
5eraph got a reaction from George King in CMD script not working - FOR issue?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.
-
5eraph got a reaction from George King in CMD script not working - FOR issue?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
..
-
5eraph got a reaction from George King in CMD script not working - FOR issue?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 >nul
Variables 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.
-
5eraph got a reaction from George King in CMD script not working - FOR issue?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..