ISO erstellen mit OSCDIMG und meinem Script [HowTo}
- Holgi
- Guru

- Beiträge: 3974
- Registriert: 12.05.2018, 12:33
- Hat sich bedankt: 523 Mal
- Danke erhalten: 816 Mal
- Gender:
ISO erstellen mit OSCDIMG und meinem Script [HowTo}
viele von uns hier erstellen/verändern gerne mal das Windows 10/11 Installationsmedium.
Z.B. durch Austausch/Löschen von Dateien, oder durch das Einbringen zusätzlicher Dateien (autounattend.xml, $OEM$ Ordner).
Beispiel:
viewtopic.php?t=30604
Wenn man das nicht mit einem ISO Tool macht, sondern durch Extraktion der ISO-Datei auf die Festplatte, dann muss man anschließend den Extraktionsordner wieder zu einer ISO "zusammensetzen". Dafür benötigt man das Tool von Microsoft mit dem Namen OSCDIMG(.exe), welches man früher (und auch noch heute) aus dem Windows ADK bekommt.
Mein Script holt sich das Tool per Winget, wenn es noch nicht auf eurer Festplatte ist.
Der Ablauf ist weitestgehend selbsterklärend. Hier einige Bildschirmfotos:
oscdimg.cmd
Viel Spaß. Und wie immer gilt: Kritiken und Verbesserungsvorschläge immer gerne willkommen.
Z.B. durch Austausch/Löschen von Dateien, oder durch das Einbringen zusätzlicher Dateien (autounattend.xml, $OEM$ Ordner).
Beispiel:
viewtopic.php?t=30604
Wenn man das nicht mit einem ISO Tool macht, sondern durch Extraktion der ISO-Datei auf die Festplatte, dann muss man anschließend den Extraktionsordner wieder zu einer ISO "zusammensetzen". Dafür benötigt man das Tool von Microsoft mit dem Namen OSCDIMG(.exe), welches man früher (und auch noch heute) aus dem Windows ADK bekommt.
Mein Script holt sich das Tool per Winget, wenn es noch nicht auf eurer Festplatte ist.
Der Ablauf ist weitestgehend selbsterklärend. Hier einige Bildschirmfotos:
oscdimg.cmd
Code: Alles auswählen
@echo off
setlocal EnableExtensions EnableDelayedExpansion
chcp 65001 >nul
title Windows ISO mit OSCDIMG erstellen
:: ------------------------------------------------------------
:: 1) OSCDIMG finden oder installieren
:: ------------------------------------------------------------
call :FindOscdimg
if defined OSCDIMG_EXE goto AskSrcIso
echo OSCDIMG wurde nicht gefunden.
echo Es wird jetzt per WinGet installiert ...
echo.
where winget >nul 2>nul
if errorlevel 1 (
echo FEHLER: winget wurde nicht gefunden.
echo Bitte installiere zuerst den App Installer bzw. aktiviere WinGet.
pause >nul
goto End
)
winget install -e --id Microsoft.OSCDIMG -s winget --accept-package-agreements --accept-source-agreements
if errorlevel 1 (
echo.
echo FEHLER: Die Installation von OSCDIMG ist fehlgeschlagen.
pause >nul
goto End
)
echo.
echo Suche OSCDIMG nach der Installation erneut ...
call :FindOscdimg
if not defined OSCDIMG_EXE (
echo FEHLER: OSCDIMG konnte nach der Installation nicht gefunden werden.
echo Hinweis: Shell ggf. neu starten und Skript erneut ausfuehren.
pause >nul
goto End
)
:: ------------------------------------------------------------
:: Eingaben
:: ------------------------------------------------------------
:AskSrcIso
cls
echo \\!//
echo (o o)
echo -------------------------------oOOo-(_)-oOOo-------------------------------
echo.
echo Gefunden:
echo OSCDIMG = "%OSCDIMG_EXE%"
echo.
set "SRCISO="
set /p "SRCISO=Pfad zur vorhandenen Windows-ISO (z.B. C:\ISO\Windows11.iso): "
if not defined SRCISO (
echo FEHLER: Kein Pfad zur vorhandenen ISO angegeben.
pause >nul
goto AskSrcIso
)
for %%I in ("%SRCISO%") do (
set "SRCISO=%%~fI"
set "SRCISONAME=%%~nxI"
set "SRCISOBASENAME=%%~nI"
)
if not exist "%SRCISO%" (
echo FEHLER: Die angegebene ISO wurde nicht gefunden.
echo "%SRCISO%"
pause >nul
goto AskSrcIso
)
goto AskVmName
:AskVmName
cls
echo Gefunden:
echo OSCDIMG = "%OSCDIMG_EXE%"
echo Quell-ISO = "%SRCISO%"
echo.
set "VMName="
set /p "VMName=Geben Sie der neuen ISO einen Namen (ohne .iso, z.B. Windows11Pro): "
if not defined VMName (
echo FEHLER: Kein ISO-Name angegeben.
pause >nul
goto AskVmName
)
call :ValidateIsoName "%VMName%"
if errorlevel 1 goto AskVmName
if /I "%VMName%"=="%SRCISOBASENAME%" (
echo FEHLER: Der neue ISO-Name darf nicht dem Namen der vorhandenen ISO entsprechen.
echo Vorhandene ISO : "%SRCISONAME%"
echo Neue ISO : "%VMName%.iso"
pause >nul
goto AskVmName
)
goto AskOutDir
:AskOutDir
cls
echo Gefunden:
echo OSCDIMG = "%OSCDIMG_EXE%"
echo Quell-ISO = "%SRCISO%"
echo Neue ISO = "%VMName%.iso"
echo.
set "OUTDIR="
set /p "OUTDIR=Zielordner fuer die neue ISO [Leer = aktueller Ordner]: "
if not defined OUTDIR set "OUTDIR=%~dp0"
for %%I in ("%OUTDIR%") do set "OUTDIR=%%~fI"
if not exist "%OUTDIR%" (
echo Zielordner wird erstellt ...
md "%OUTDIR%" 2>nul
if errorlevel 1 (
echo FEHLER: Zielordner konnte nicht erstellt werden.
pause >nul
goto AskOutDir
)
)
call :BuildIsoFile
if /I "%ISOFILE%"=="%SRCISO%" (
echo FEHLER: Die neue ISO wuerde die Quell-ISO ueberschreiben.
echo Quelle: "%SRCISO%"
echo Ziel : "%ISOFILE%"
pause >nul
goto AskVmName
)
if exist "%ISOFILE%" (
echo.
echo Die neue ISO existiert bereits:
echo "%ISOFILE%"
echo.
echo [N] Neuen Namen waehlen
echo [E] Ersetzen
echo [A] Abbrechen
choice /C NEA /N /M "Bitte waehlen Sie [N/E/A]: "
if errorlevel 3 (
echo Vorgang wurde abgebrochen.
pause >nul
goto AskVmName
)
if errorlevel 2 (
echo Vorhandene ISO wird geloescht ...
del /f /q "%ISOFILE%" >nul 2>nul
if exist "%ISOFILE%" (
echo FEHLER: Die vorhandene ISO konnte nicht geloescht werden.
pause >nul
goto AskVmName
)
) else (
goto AskVmName
)
)
goto AskExtractPath
:AskExtractPath
cls
echo Gefunden:
echo OSCDIMG = "%OSCDIMG_EXE%"
echo Quell-ISO = "%SRCISO%"
echo Neue ISO = "%ISOFILE%"
echo.
set "ISO="
set /p "ISO=Pfad zum Entpacken der Windows-Installationsdateien (z.B. C:\ISO\Win11): "
if not defined ISO (
echo FEHLER: Kein Entpackpfad angegeben.
pause >nul
goto AskExtractPath
)
for %%I in ("%ISO%") do set "ISO=%%~fI"
if not exist "%ISO%" (
echo Entpackordner wird erstellt ...
md "%ISO%" 2>nul
if errorlevel 1 (
echo FEHLER: Entpackordner konnte nicht erstellt werden.
pause >nul
goto AskExtractPath
)
)
set "DIRCOUNT=0"
for /f %%A in ('dir /a /b "%ISO%" 2^>nul ^| find /c /v ""') do set "DIRCOUNT=%%A"
if not "%DIRCOUNT%"=="0" (
echo.
echo Der Entpackordner ist nicht leer:
echo "%ISO%"
echo.
echo [L] Leeren
echo [B] Behalten
echo [A] Abbrechen
choice /C LBA /N /M "Bitte waehlen Sie [L/B/A]: "
if errorlevel 3 (
echo Vorgang wurde abgebrochen.
pause >nul
goto AskExtractPath
)
if errorlevel 2 (
echo Vorhandene Dateien bleiben erhalten.
) else (
echo Entpackordner wird geleert ...
call :ClearFolder "%ISO%"
if errorlevel 1 (
echo FEHLER: Entpackordner konnte nicht vollstaendig geleert werden.
pause >nul
goto AskExtractPath
)
)
)
goto ShowSummary
:: ------------------------------------------------------------
:: Zusammenfassung
:: ------------------------------------------------------------
:ShowSummary
cls
echo ********************************************************************
echo.
echo Quell-ISO : "%SRCISO%"
echo Entpacken : "%ISO%"
echo Neue ISO : "%ISOFILE%"
echo Tool : "%OSCDIMG_EXE%"
echo.
echo ********************************************************************
echo.
:: ------------------------------------------------------------
:: 2) ISO mounten und entpacken
:: ------------------------------------------------------------
echo ISO wird gemountet ...
set "ISODRIVE="
set "ROBOLOG=%TEMP%\CreateISO_Robocopy.log"
for /f "usebackq delims=" %%D in (`powershell -NoProfile -Command "$p = [Environment]::GetEnvironmentVariable('SRCISO'); $img = Mount-DiskImage -ImagePath $p -PassThru; ($img | Get-Volume).DriveLetter"`) do (
set "ISODRIVE=%%D"
)
if not defined ISODRIVE (
echo FEHLER: Die ISO konnte nicht gemountet werden.
pause >nul
goto End
)
set "ISODRIVE=%ISODRIVE%:"
echo ISO gemountet als Laufwerk %ISODRIVE%
if not exist "%ISODRIVE%\setup.exe" (
echo FEHLER: Das gemountete ISO-Laufwerk ist nicht wie erwartet lesbar.
echo Erwartete Datei nicht gefunden: "%ISODRIVE%\setup.exe"
powershell -NoProfile -Command "$p = [Environment]::GetEnvironmentVariable('SRCISO'); Dismount-DiskImage -ImagePath $p" >nul 2>nul
pause >nul
goto End
)
echo.
echo Dateien werden entpackt, bitte warten ...
echo Robocopy-Protokoll: "%ROBOLOG%"
echo.
del "%ROBOLOG%" /f /q >nul 2>nul
robocopy "%ISODRIVE%\." "%ISO%" *.* /E /R:1 /W:1 /XJ /TEE /LOG:"%ROBOLOG%"
set "ROBOCODE=%ERRORLEVEL%"
echo.
echo ISO wird wieder ausgehaengt ...
powershell -NoProfile -Command "$p = [Environment]::GetEnvironmentVariable('SRCISO'); Dismount-DiskImage -ImagePath $p" >nul 2>nul
if %ROBOCODE% GEQ 8 (
echo.
echo FEHLER: Beim Kopieren der Dateien aus der ISO ist ein Fehler aufgetreten.
echo Robocopy-Fehlercode: %ROBOCODE%
echo Siehe Protokoll:
echo "%ROBOLOG%"
echo.
pause >nul
goto End
)
:: ------------------------------------------------------------
:: 3) Plausibilitaetspruefungen
:: ------------------------------------------------------------
if not exist "%ISO%\efi\microsoft\boot\memtest.efi" (
echo FEHLER: Die Windows-Installationsdateien scheinen unvollstaendig zu sein.
echo Erwartete Datei fehlt:
echo "%ISO%\efi\microsoft\boot\memtest.efi"
pause >nul
goto AskExtractPath
)
if not exist "%ISO%\boot\etfsboot.com" (
echo FEHLER: Bootdatei fuer BIOS fehlt:
echo "%ISO%\boot\etfsboot.com"
pause >nul
goto AskExtractPath
)
if not exist "%ISO%\efi\microsoft\boot\efisys.bin" if not exist "%ISO%\efi\microsoft\boot\efisys_noprompt.bin" (
echo FEHLER: UEFI-Bootdatei fehlt:
echo "%ISO%\efi\microsoft\boot\efisys.bin"
echo oder
echo "%ISO%\efi\microsoft\boot\efisys_noprompt.bin"
pause >nul
goto AskExtractPath
)
:: ------------------------------------------------------------
:: 4) Optional: noprompt-Dateien aktivieren
:: ------------------------------------------------------------
if exist "%ISO%\efi\microsoft\boot\cdboot_noprompt.efi" (
if not exist "%ISO%\efi\microsoft\boot\cdboot-prompt.efi" (
echo Benenne UEFI-Bootdateien fuer "no prompt" um ...
ren "%ISO%\efi\microsoft\boot\cdboot.efi" "cdboot-prompt.efi" >nul 2>nul
ren "%ISO%\efi\microsoft\boot\cdboot_noprompt.efi" "cdboot.efi" >nul 2>nul
)
)
if exist "%ISO%\efi\microsoft\boot\efisys_noprompt.bin" (
if not exist "%ISO%\efi\microsoft\boot\efisys_prompt.bin" (
ren "%ISO%\efi\microsoft\boot\efisys.bin" "efisys_prompt.bin" >nul 2>nul
ren "%ISO%\efi\microsoft\boot\efisys_noprompt.bin" "efisys.bin" >nul 2>nul
)
)
cls
echo.
echo ============================================================================
echo.
echo Die Installationsdateien sind jetzt entpackt und vorbereitet.
echo.
echo Sie koennen nun manuelle Anpassungen vornehmen, z.B.:
echo.
echo - Treiber hinzufuegen
echo - autounattend.xml oder unattend.xml einfuegen
echo - Dateien austauschen oder Skripte ergaenzen
echo - Images mit DISM bearbeiten
echo.
echo Entpackter Ordner:
echo "%ISO%"
echo.
echo Wenn Sie mit allen Anpassungen fertig sind, geben Sie bitte zur
echo Sicherheit exakt folgende Freigabe ein:
echo.
echo JETZT ISO BAUEN
echo.
echo Nur dann wird die ISO-Erstellung fortgesetzt.
echo.
echo ============================================================================
:WaitForContinue
set "CONTINUECODE="
set /p "CONTINUECODE=Freigabe eingeben: "
if /I "%CONTINUECODE%"=="JETZT ISO BAUEN" goto ContinueIsoBuild
echo.
echo Falsche Eingabe. Das Skript wird noch nicht fortgesetzt.
echo Bitte geben Sie exakt ein:
echo JETZT ISO BAUEN
echo.
goto WaitForContinue
:ContinueIsoBuild
echo.
echo Erstelle ISO, bitte warten ...
echo.
:: ------------------------------------------------------------
:: 5) ISO erstellen
:: ------------------------------------------------------------
"%OSCDIMG_EXE%" -m -o -u2 -udfver102 -bootdata:2#p0,e,b"%ISO%\boot\etfsboot.com"#pEF,e,b"%ISO%\efi\microsoft\boot\efisys.bin" "%ISO%" "%ISOFILE%"
if errorlevel 1 (
echo.
echo FEHLER: Die ISO konnte nicht erstellt werden.
pause >nul
goto End
)
echo.
echo Fertig.
echo ISO erfolgreich erstellt:
echo "%ISOFILE%"
echo.
pause
goto End
:: ------------------------------------------------------------
:: Unterprogramme
:: ------------------------------------------------------------
:BuildIsoFile
if "%OUTDIR:~-1%"=="\" (
set "ISOFILE=%OUTDIR%%VMName%.iso"
) else (
set "ISOFILE=%OUTDIR%\%VMName%.iso"
)
exit /b 0
:ValidateIsoName
set "CHECKNAME=%~1"
if not defined CHECKNAME (
echo FEHLER: Kein ISO-Name angegeben.
pause >nul
exit /b 1
)
set "PS_NAME=%CHECKNAME%"
powershell -NoProfile -Command ^
"$n = [Environment]::GetEnvironmentVariable('PS_NAME');" ^
"if ([string]::IsNullOrWhiteSpace($n)) { exit 1 }" ^
"if ($n.Trim() -ne $n) { exit 1 }" ^
"if ($n -in '.', '..') { exit 1 }" ^
"if ($n -match '[\\/:*?""<>|]') { exit 1 }" ^
"$reserved = 'CON','PRN','AUX','NUL','COM1','COM2','COM3','COM4','COM5','COM6','COM7','COM8','COM9','LPT1','LPT2','LPT3','LPT4','LPT5','LPT6','LPT7','LPT8','LPT9';" ^
"if ($reserved -contains $n.ToUpperInvariant()) { exit 1 }" ^
"exit 0"
if errorlevel 1 (
echo FEHLER: Der ISO-Name ist ungueltig.
echo.
echo Nicht erlaubt:
echo - leerer Name
echo - fuehrende oder abschliessende Leerzeichen
echo - . oder ..
echo - Zeichen \ / : * ? ^" ^< ^> ^|
echo - reservierte Namen wie CON, PRN, AUX, NUL, COM1, LPT1
pause >nul
exit /b 1
)
exit /b 0
:ClearFolder
set "TARGETFOLDER=%~1"
if "%TARGETFOLDER%"=="" exit /b 1
if not exist "%TARGETFOLDER%\" exit /b 1
if /I "%TARGETFOLDER%"=="C:\" exit /b 1
if /I "%TARGETFOLDER%"=="C:" exit /b 1
if /I "%TARGETFOLDER%"=="D:\" exit /b 1
if /I "%TARGETFOLDER%"=="D:" exit /b 1
if /I "%TARGETFOLDER%"=="%SystemDrive%\" exit /b 1
if /I "%TARGETFOLDER%"=="%SystemDrive%" exit /b 1
del /f /s /q "%TARGETFOLDER%\*" >nul 2>nul
for /d %%D in ("%TARGETFOLDER%\*") do rd /s /q "%%~fD" >nul 2>nul
set "LEFTCOUNT=0"
for /f %%A in ('dir /a /b "%TARGETFOLDER%" 2^>nul ^| find /c /v ""') do set "LEFTCOUNT=%%A"
if not "%LEFTCOUNT%"=="0" exit /b 1
exit /b 0
:FindOscdimg
set "OSCDIMG_EXE="
for /f "delims=" %%I in ('where oscdimg.exe 2^>nul') do (
if exist "%%~fI" (
set "OSCDIMG_EXE=%%~fI"
goto :eof
)
)
for /f "delims=" %%I in ('dir /b /s "%LOCALAPPDATA%\Microsoft\WinGet\Packages\oscdimg.exe" 2^>nul') do (
if exist "%%~fI" (
set "OSCDIMG_EXE=%%~fI"
goto :eof
)
)
for /f "delims=" %%I in ('dir /b /s "%LOCALAPPDATA%\Microsoft\WinGet\Links\oscdimg.exe" 2^>nul') do (
if exist "%%~fI" (
set "OSCDIMG_EXE=%%~fI"
goto :eof
)
)
for /f "delims=" %%I in ('dir /b /s "%ProgramFiles(x86)%\Windows Kits\*\Assessment and Deployment Kit\Deployment Tools\*\Oscdimg\oscdimg.exe" 2^>nul') do (
if exist "%%~fI" (
set "OSCDIMG_EXE=%%~fI"
goto :eof
)
)
for /f "delims=" %%I in ('dir /b /s "%ProgramFiles%\Windows Kits\*\Assessment and Deployment Kit\Deployment Tools\*\Oscdimg\oscdimg.exe" 2^>nul') do (
if exist "%%~fI" (
set "OSCDIMG_EXE=%%~fI"
goto :eof
)
)
goto :eof
:End
endlocal
exit /bDu hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114
-
Tante Google