ISO erstellen mit OSCDIMG und meinem Script [HowTo}

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smileys
:) ;) :smile: :lol: :hihi: :D :rofl: :muahah: :( :pff: :kopfstreichel: :ohno: :betruebt: :heulen: :kopfkratz: :duckundweg: :o :? :oops: :psst: :sauer: :-P :daumenrunter: :daumen: :dankeschoen: :thx: :dafür: :gähn:
Mehr Smileys anzeigen

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Ansicht erweitern Die letzten Beiträge des Themas: ISO erstellen mit OSCDIMG und meinem Script [HowTo}

ISO erstellen mit OSCDIMG und meinem Script [HowTo}

von Holgi » 04.04.2026, 18:42

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:
Screenshot 2026-04-04 182835.png
Screenshot 2026-04-04 180226.png
Screenshot 2026-04-04 180303.png

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 /b
oscdimg.zip
Viel Spaß. Und wie immer gilt: Kritiken und Verbesserungsvorschläge immer gerne willkommen.

Nach oben