rem build 10001
@echo off
setlocal enabledelayedexpansion
rem --------- Optional: An die eigenen Verhaeltnisse anpassen -----------

rem Pfad zum Arbeitsverzeichnis setzen, beispielsweise workdir=d:\wb\
rem Ohne Anpassung verwendet das Skript den Ordner, in dem es liegt.
rem Keine Leerzeichen im Pfad!
set workdir=%~d0%~p0

rem Name der WIM-Datei setzen, normalerweise install.wim
set imagefile=install.wim

rem Name der RE-WIM-Datei setzen, normalerweise winre.wim
set refile=winre.wim

rem temporrer Laufwerksbuchstabe der neuen Windows-Partition
set lww=u:

rem temporrer Laufwerksbuchstabe der neuen Images-Partition
set lwi=v:

rem ------------- Ende der Anpassungen -----------

rem hilfe erwuenscht?
if /i "%1"=="/?" goto hilfe
if /i "%1"=="-h" goto hilfe
if /i "%1"=="--h" goto hilfe
if /i "%1"=="/help" goto hilfe
if /i "%1"=="-help" goto hilfe
if /i "%1"=="--help" goto hilfe

rem vorsichtshalber pruefen, ob Skript unter PE laeuft
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /f "WindowsPE" > nul
if errorlevel 1 goto fehler1

rem vorsichtshalber pruefen, ob UEFI aktiv ist
wpeutil updatebootinfo
reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType | find "0x2"
if errorlevel 1 goto fehler6

rem vorsichtshalber pruefen, ob dism-Version neu genug ist
dism /apply-image /? | find /i "WIMBoot" > nul
if errorlevel 1 goto fehler5

rem Dateien vorhanden?
if not exist %workdir%%imagefile% set fehlt=%imagefile%&&goto Fehler2
if not exist %workdir%%refile% set fehlt=%refile%&&goto Fehler2

rem Datentraeger auswaehlen
cls
echo Folgende Laufwerke wurden erkannt:
echo.
set wahl=
set disks=0
echo list disk > %workdir%listdisk.txt
echo exit >> %workdir%listdisk.txt
diskpart /s %workdir%listdisk.txt > %workdir%listdisk.out
set losgehts=0
for /f "tokens=2,4,5" %%D in (%workdir%listdisk.out) do (
  if !losgehts!==1 (
    if not "%%E"=="" (
      echo select disk %%D > %workdir%detdisk.txt
      echo detail disk >> %workdir%detdisk.txt
      echo exit >> %workdir%detdisk.txt
      diskpart /s %workdir%detdisk.txt > %workdir%detdisk.out
      echo *** Disk %%D ***
      echo.
      set zeile=1
      for /f "tokens=1*" %%L in (%workdir%detdisk.out) do (
        if !zeile! equ 5 echo %%L %%M
        if !zeile! equ 5 echo Gre: %%E %%F
        if !zeile! equ 7 echo %%L %%M
        if "%%L"=="Volume" echo %%L %%M
        set /a zeile=!zeile!+1
      )
      echo.
      if "!wahl!"=="" (
        set wahl=%%D
      ) else (
        set wahl=!wahl!,%%D
      )
      set /a disks=!disks! + 1
    )
  ) else (
    set line=%%Dxxx
    set line=!line:~0,3!
    if !line!==--- set losgehts=1
  )
)
del %workdir%listdisk.txt
del %workdir%listdisk.out
del %workdir%detdisk.txt
del %workdir%detdisk.out
:neueEingabe
set okay=0
if %disks% gtr 1 (
  set /p platte="Auf welche Platte soll installiert werden (%wahl%)? "
  echo %wahl% | find "!platte!" > nul
  if not errorlevel 1 (
    echo !platte! | find "," > nul
    if errorlevel 1 set okay=1
  )
) else (
  goto fehler7
)
if not %okay%==1 goto neueEingabe

rem Sicherheitsabfrage
cls
color ce
echo.
echo ++++++++++++++++
echo +++ ACHTUNG^^! +++
echo ++++++++++++++++
echo.
echo Dieses Skript lscht u. a. die
echo eben ausgewhlte Festplatte %platte%^^!
echo Falls Sie das wirklich wollen,
echo tippen Sie als Besttigung
echo folgendes ein:
echo.
echo  #mAcHhIn+
echo.
set /p sicher=?
if not "%sicher%" equ "#mAcHhIn+" goto fehler3

set operation=*** Gre der Partition fuer die WIM-Dateien errechnen ***
echo.
echo %operation%
echo.
set imagefilepath=%workdir%%imagefile%
set refilepath=%workdir%%refile%
for %%A in (%imagefilepath%) do set imagefilebytes=%%~zA
set /a imagefileMB=%imagefilebytes:~0,-6%
set /a imagefileMB=%imagefileMB%*205/215
for %%A in (%refilepath%) do set refilebytes=%%~zA
set /a refileMB=%refilebytes:~0,-6%
set /a refileMB=%refileMB%*205/215
set /a partitionsize=%imagefileMB%+%refileMB%+55
set /a partitionsize=%partitionsize%*500/497

set operation=*** Diskpart-Skript erzeugen ***
echo.
echo %operation%
echo.
echo select disk %platte% >%~d0%~p0diskpart.txt
echo clean >>%~d0%~p0diskpart.txt
echo convert gpt >>%~d0%~p0diskpart.txt
echo create partition efi size=100 >>%~d0%~p0diskpart.txt
echo format quick fs=fat32 label="System" >>%~d0%~p0diskpart.txt
echo create partition msr size=128 >>%~d0%~p0diskpart.txt
echo create partition primary >>%~d0%~p0diskpart.txt
echo shrink minimum=%partitionsize% >>%~d0%~p0diskpart.txt
echo format quick fs=ntfs label="Windows" >>%~d0%~p0diskpart.txt
echo assign letter=%lww% >>%~d0%~p0diskpart.txt
echo create partition primary >>%~d0%~p0diskpart.txt
echo format quick fs=ntfs label="Images" >>%~d0%~p0diskpart.txt
echo assign letter=%lwi% >>%~d0%~p0diskpart.txt
echo set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac" >>%~d0%~p0diskpart.txt
echo gpt attributes=0x8000000000000001 >>%~d0%~p0diskpart.txt
echo exit >>%~d0%~p0diskpart.txt
if errorlevel 1 goto fehler4

set operation=*** Platte partitionieren ***
echo.
echo %operation%
echo.
diskpart /s %~d0%~p0diskpart.txt
if errorlevel 1 goto fehler4
md "%lwi%\windows images"
if errorlevel 1 goto fehler4
md %lwi%\recovery
if errorlevel 1 goto fehler4

set operation=*** WIM-Dateien kopieren ***
echo.
echo %operation%
echo.
copy %workdir%%refile% %lwi%\recovery\winre.wim
if errorlevel 1 goto fehler4
copy %workdir%%imagefile% "%lwi%\windows images\install.wim"
if errorlevel 1 goto fehler4
md %lww%\recycler\scratch
if errorlevel 1 goto fehler4

set operation=*** Pointer-Dateien erzeugen ***
echo.
echo %operation%
echo.
dism /apply-image /imagefile:"%lwi%\windows images\install.wim" /applydir:%lww% /index:1 /WIMBoot /scratchdir:%lww%\recycler\scratch
if errorlevel 1 goto fehler4

set operation=*** Bootloader installieren ***
echo.
echo %operation%
echo.
%lww%\windows\system32\bcdboot %lww%\windows
if errorlevel 1 goto fehler4

set operation=*** RE-Image einhngen ***
echo.
echo %operation%
echo.
%lww%\windows\system32\reagentc /setreimage /path %lwi%\recovery\winre.wim /target %lww%\windows
if errorlevel 1 goto fehler4

set operation=*** Rechte setzen ***
echo.
echo %operation%
echo.
icacls "%lwi%\Windows Images" /grant:r SYSTEM:(F) /T 
if errorlevel 1 goto fehler4
icacls "%lwi%\Windows Images" /inheritance:r /T 
if errorlevel 1 goto fehler4
icacls "%lwi%\Windows Images" /grant:r *S-1-5-32-544:(R) /T
if errorlevel 1 goto fehler4
icacls "%lwi%\Windows Images" /grant:r SYSTEM:(R) /T 
if errorlevel 1 goto fehler4

rem Aufraeumen
del %~d0%~p0diskpart.txt
echo.
echo Fertig.
pause
goto :eof

rem Falls nicht unter PE
:fehler1
echo Dieses Skript funktioniert nur unter Windows PE!
pause
goto :eof

rem Falls Dateien fehlen
:fehler2
echo Fehler: Im Arbeitsverzeichnis fehlt die Datei %fehlt%
pause
goto :eof

rem Abbruch durch Benutzer
:fehler3
echo Abbruch durch Benutzer
pause
goto :eof

rem Fehler durch externes Programm
:fehler4
echo Operation fehlgeschlagen: %operation%
pause
goto :eof

rem Falls Dism-Version zu alt
:fehler5
echo Fehler: Dism-Version zu alt
pause
goto :eof

rem Falls Boot im BIOS-Modus
:fehler6
echo Fehler: Nicht im UEFI-Modus gebootet
pause
goto :eof

rem Falls nur ein Datentraeger gefunden
:fehler7
echo Fehler: Keine Festplatte zum Installieren gefunden
pause
goto :eof

:hilfe
echo.
echo %~nx0 erzeugt eine Wimboot-Installation von Windows 8.1 Update.
echo. 
echo Das Skript funktioniert nur unter Windows PE 5.1.
echo Einige Paramter lassen sich direkt im Skript anpassen.
echo.
echo Achtung: Das Skript lscht die erste erkannte Festplatte!
pause>nul
goto :eof
;
REM Erstellt 2014 von Axel Vahldiek + Hajo Schulz/c't
REM mailto: axv@ct.de