Skocz do zawartości

Instalacja systemu z plików wim (zautomatyzowana)


Rekomendowane odpowiedzi

Nosiłem się z myślą o napisaniu tego tematu już jakiś czas ale jakoś zawsze było coś ważniejszego/ciekawszego.

Ostatni jednak spotkał mnie wysyp tematów sprowadzających się mniej więcej do jednego - jak zainstalować windows w trybie efi, płyta nie chce się bootować odpowiednio, nie widzi dysku itp.

 

Oczywiście całość sprowadza się do bardzo prostych czynności:

Ustaw dysk (diskpart itp.) > przywróć obraz (dism, imagex) > ustaw rozruch (bcdboot, bcdedit + ew. skrypty).

Opis metody ręcznej można znaleźć na tysiącach forów o tematyce it również na fixitpc, skupię się na metodzie automatycznej (czy też pół automatycznej - to zależy jak sobie ustawimy całe środowisko).

 

Odpowiednie skrypty są dostępne już od dawna w Microsoft Docs:

 

Sample: Apply Images on a UEFI-based Computer by Using ImageX

 

ale powiedzmy sobie - można to zrobić lepiej, bardziej zautomatyzować, uprościć, uczynić bardziej uniwersalnym i w końcu uatrakcyjnić (a czemu nie).

 

Dlatego pozwolę sobie przedstawić własną wersję skryptu:

 

 

 


@cls
@echo off
@setlocal
@CHCP 852 >nul

@if /i [%1]==[] (@Echo nie podano argumentu.) & @goto :not_ok
@if /i [%2]==[] (set index=1) else (set index=%2)

@for /f "tokens=2 delims= " %%G in ('call dism /get-wiminfo /wimfile:%1 /index:%index%  ^| find /i "error:"') do (@set EL=%%G)

@if /i not [%EL%]==[] @echo Plik nie zawiera obrazu o indeksie %index% & @goto :not_ok

@SET /P efi=Czy zainstalowa system w trybie UEFI (T czy N)?:
@SET /P reco=Czy ustawi partycj© recovery 15GB (A=15GB, B=1GB, Z=Custom, N)?:
@if /i not [%reco%]==[A] if /i not [%reco%]==[B] if /i not [%reco%]==[Z] set reco=C

@if /i [%efi%]==[T] set FW=efi
@if /i [%efi%]==[Y] set FW=efi

@echo.
@if /i not [%FW%]==[efi] goto :do_bios_disk
@if /i [%FW%]==[efi] goto :do_efi_disk

:do_bios_disk
@echo Prosz© czeka - trwa konfigurowanie dysku.
@if /i not [%reco%]==[Z] (@echo sel dis 0 & @echo cle & @echo conv mbr & @echo cre par pri size=512 & @echo for quick fs=ntfs label=Boot & @echo ass letter=S & @echo act)  | @diskpart >nul
@if /i [%reco%]==[Z] @diskpart /s n:\custom.txt >nul
@if /i [%reco%]==[C] (@echo sel dis 0 & @echo cre par pri & @echo for quick fs=ntfs label=Windows & @echo ass letter=W)  | @diskpart >nul
@if /i [%reco%]==[B] (@echo sel dis 0 & @echo cre par pri & @echo shrink minimum=1024 & @echo for quick fs=ntfs label=Windows & @echo ass letter=W)  | @diskpart >nul
@if /i [%reco%]==[A] (@echo sel dis 0 & @echo cre par pri & @echo shrink minimum=15360 & @echo for quick fs=ntfs label=Windows & @echo ass letter=W)  | @diskpart >nul
@if /i not [%reco%]==[C] @if /i not [%reco%]==[Z] (@echo sel dis 0 & @echo cre par pri & @echo for quick fs=ntfs label=Recovery & @echo ass letter=R & @echo set id=27) | @diskpart >nul
(@echo lis vol) | @diskpart
(@echo exit) | @diskpart >nul
@goto :do_dism

:do_efi_disk
@echo Prosz© czeka - trwa konfigurowanie dysku.
@if /i not [%reco%]==[Z] (@echo sel dis 0 & @echo cle & @echo conv gpt & @echo cre par efi size=512 & @echo for quick fs=fat32 label=Boot & @echo ass letter=S)  | @diskpart >nul
@if /i not [%reco%]==[Z] (@echo sel dis 0 & @echo cre par msr size=100)  | @diskpart >nul
@if /i [%reco%]==[Z] @diskpart /s n:\custom.txt >nul
@if /i [%reco%]==[C] (@echo sel dis 0 & @echo cre par pri & @echo for quick fs=ntfs label=Windows & @echo ass letter=W)  | @diskpart >nul
@if /i [%reco%]==[B] (@echo sel dis 0 & @echo cre par pri & @echo shrink minimum=1024 & @echo for quick fs=ntfs label=Windows & @echo ass letter=W)  | @diskpart >nul
@if /i [%reco%]==[A] (@echo sel dis 0 & @echo cre par pri & @echo shrink minimum=15360 & @echo for quick fs=ntfs label=Windows & @echo ass letter=W)  | @diskpart >nul
@if /i not [%reco%]==[C] @if /i not [%reco%]==[Z] (@echo sel dis 0 & @echo cre par pri & @echo for quick fs=ntfs label=Recovery & @echo ass letter=R & @echo set id=de94bba4-06d1-4d40-a16a-bfd50179d6ac & @echo gpt attributes=0x8000000000000001) | @diskpart >nul
(@echo lis vol) | @diskpart
(@echo exit) | @diskpart >nul
@goto :do_dism

:do_dism
@echo.

@for /f "tokens=3,* delims= " %%G in ('call dism /get-wiminfo /wimfile:%1 /index:%index%  ^| find /i "description"') do ( @echo Instaluj© %%G %%H)
@echo.

::@wimlib-imagex.exe apply %1 %index% W:\

@dism /Apply-Image /ImageFile:%1 /Index:%index% /ApplyDir:W:

::@imagex.exe /apply %1 1 W:\

@echo.
@if /i not [%FW%]==[efi] goto :do_bios_bcd
@if /i [%FW%]==[efi] goto :do_efi_bcd

:do_bios_bcd
@bcdboot W:\Windows /d /s S: /l pl-pl /f BIOS
@goto :ok
:do_efi_bcd
@bcdboot W:\Windows /d /s S: /l pl-pl /f UEFI
@goto :ok

:ok
@echo.
@echo System zainstalowany.
:not_ok

@endlocal

 

Zewnętrzny link (na wypadek problemow z kodowaniem znaków w skrypcie).

 

Jaka przewaga (poza upiększeniem) w stosunku do wersji technet wynika z mojego skryptu:

1. Skrypt pozwala wybrać między trybem instalacji efi i legacy (niezależnie od tego w jekim trybie wystartowało środowisko winpe).

2. Pozwala wybrać index obrazu (czyli instalować z czystych wim od ms).

3. Templaty dla dysku z utworzeniem obszaru dla recovery, samego winre lub bez.

4. Możliwość pominięcia templatów i wybrania własnego pliku konfiguracyjnego.

 

Co jest potrzebne:

1. Środowisko WinPE - najlepiej w najnowszej wersji, może być gołe (bez pakietów WinPE_OCs), może być środowisko z płyty instalacyjnej windowsa.

2. Pliki wim z płyt instalacyjnych bądź samodzielnie przygotowane/przechwycone.

Nie ma różnicy czy środowisko WinPe wystartujemy z sieci (po pxe) z pena czy też z płyty.

 

Użycie skryptu jest banalnie proste - wystarczy wydać komendę:

 

install.cmd ścieżka\install.wim 3

 

gdzie:

1. install.cmd > to nazwa pod jaką zapisany jest powyższy skrypt

2. ścieżka\install.wim > to nazwa naszego pliku wim wraz ze ścieżką (może się znajdować w tym samym katalogu w którym mamy skrypt - wtedy ścieżka jest niepotrzebna)

3. 3 > opcjonalny numer indexu konkretnego obrazu w pliku wim, jeżeli nie podamy tego parametru przywrócony zostanie obraz pierwszy (wygodne dla własnoręcznie przygotowanych instalek gdzie poszczególne obrazy najczęściej trzymamy w osobnych plikach.

 

Jakie obrazy (i ich indeksy) zawiera plik wim możemy zawsze sprawdzić komendą:

 

dism /get-wiminfo /wimfile:ścieżka\install.wim

 

edit 18.10.2016

Mała zmiana w skrypcie - ponieważ skrypt zakładał konfigurację identyczną z moją odwoływał się w paru miejscach "bezwzględnie" do napędu N: - poprawione na odwołanie względne.

 

cdn.

Odnośnik do komentarza
Pomoc jest darmowa, ale proszę rozważ przekazanie dotacji na utrzymanie serwisu: klik.

Następnie skrypt zapyta nas o tryb instalacji (legacy czy efi), "y" lub "t" oznacza instalację w trybie efi (nie ma znaczenia wielkość wpisanej litery), inny wpis bądź pozostawienie pustej pozycji oznacza instalację w trybie legacy.

 

Po zatwierdzeniu wyboru przejdziemy do następnej decyzji, skrypt zaproponuje nam wybór jednego z templatów dla podziału dysku bądź wybór zewnętrznej konfiguracji.

Ustawione domyślnie templaty kasują zawartość dysku więc są przeznaczone dla świeżej instalacji w innych wypadkach należy skorzystać z pliku konfiguracyjnego.

Możemy dokonać następujących wyborów:

A: Partycja rozruchowa 512MB, partycja recovery 15GB* na końcu dysku,w przypadku instalacji efi partycja MSR 100MB, reszta dysku partycja dla windowsa.

B: Partycja rozruchowa 512MB, partycja dla winre 1GB* na końcu dysku,w przypadku instalacji efi partycja MSR 100MB, reszta dysku partycja dla windowsa.

Z: Wybór zewnętrznej konfiguracji.

Inny wybór bądź pozostawienie pustej pozycji: Partycja rozruchowa 512MB, w przypadku instalacji efi partycja MSR 100MB, reszta dysku partycja dla windowsa.

 

Przykładowy zewnętrzny konfig (zapisany jako custom.txt w ścieżce z której uruchamiamy skrypt) musi być zgodny z założeniami skryptu czyli partycja rozruchowa musi mieć literę "s:", partycja z windowsem literę "w:" i ew. partycja recovery literę "r:"

Dobrze też zachować nazewnictwo jak w poniższym przykładzie gdyż (jeżeli będzie zainteresowani) w przyszłości udostępnię skrypty dla recovery i innych prac przygotowawczych przydatnych w środowisku produkcji/serwisu komputerów.

 

Przykładowy custom.txt:

 

 

rem == CreatePartitions-BIOS.txt ==
rem == These commands are used with DiskPart to
rem    create three partitions
rem    for a BIOS/MBR-based computer.
rem    Adjust the partition sizes to fill the drive
rem    as necessary. ==
select disk 0
clean
rem == 1. System partition ======================
create partition primary size=128
format quick fs=ntfs label="System"
assign letter="S"
active
rem == 2. Windows partition =====================
rem ==    a. Create the Windows partition =======
create partition primary
rem ==    b. Create space for the recovery tools  
shrink minimum=555
rem       ** NOTE: Update this size to match the
rem                size of the recovery tools 
rem                (winre.wim)                 **
rem ==    c. Prepare the Windows partition ====== 
format quick fs=ntfs label="Windows"
assign letter="W"
rem == 3. Recovery partition ====================
create partition primary
format quick fs=ntfs label="Recovery image"
assign letter="R"
set id=27

 

Oczywiście templaty można sobie wy edytować do własnych potrzeb, również wybór programu którym przywracamy obraz.

W skrypcie są trzy opcje: dism, imagex i zewnętrzne narzędzie imlib-imagex.exe.

imlib-imagex.exe możemy ściągnąć z poniższego linku:

https://wimlib.net/

 

Sam program w kwestii przywracania niewiele wnosi ale posiada kilka opcji których próżno szukać w narzędziach ms jak choćby możliwość dodawania i kasowania plików w obrazie bez potrzeby jego montowania, optymalizacja/przepakowania plików wim (pozwala np. wyczyścić nadpisane pliki).

 

*ew. opis co z tym dalej zrobić uzależniam od waszego zainteresowania tematem.

cdn.

Odnośnik do komentarza

W tym poście zamieszczę obrazki z takiej przykładowej instalacji, środowisko winpe uruchomione z mojego serwera NAS, również obrazy wim i skrypt znajdują się na tym serwerze. Winpe jest skonfigurowany tak że automatycznie przypisuje odpowiednią ścieżkę do katalogu ze skryptem (jeżeli będzie takie życzenie mogę opisać jak to ustawić, zainteresowanym osobom służę również pomocą w skonfigurowaniu serwera NAS - i nie tylko - pod usługi pxe/tftp).

 

Instalujemy windows 10 pro w najnowszej wersji:

post-67-0-05740000-1476129397_thumb.png

Wybieramy instalację efi (lewy) i układ partycji "B" (prawy):

post-67-0-14940000-1476129398_thumb.png post-67-0-80140000-1476129400_thumb.png

Samo przywracanie na obrazkach widać efekt działania zewnętrznej komendy "imlib-imagex.exe"(lewy) i wbudowanej dism (prawy):

post-67-0-25380000-1476129401_thumb.png post-67-0-82020000-1476130117_thumb.png

System się przywrócił można zrestartować:

post-67-0-61260000-1476129401_thumb.png post-67-0-92460000-1476129401_thumb.png

 

Reszta wygląda jak standardowa instalacja z płyty (obee itp).

post-67-0-17180000-1476132618_thumb.png post-67-0-51500000-1476132618_thumb.png

cdn.

Odnośnik do komentarza

Skoro już próbujemy sobie uprościć życie to czemu nie skorzystać z opcji instalacji nienadzorowanej, jak to zrobić skoro nie korzystamy z firmowego instalatora?

Wbrew pozorom bardzo prosto, otóż wystarczy skopiować nasz plik do ścieżki Windows\Panther jako "unattend.xml".

Przykład komendy która to zrobi (zwracam uwagę na gwiazdkę na końcu, jest to nieudokumentowana a przydatna opcja xcopy):

 

@xcopy /cherky N:\un.xml W:\Windows\Panther\unattend.xml*

 

Powiedzmy, że chcemy pominąć oobe i zalogować się automatycznie jako administrator (konto zostanie aktywowane):

 

 

 


<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>0415:00001045</InputLocale>
            <SystemLocale>pl-PL</SystemLocale>
            <UILanguage>pl-PL</UILanguage>
            <UILanguageFallback>pl-PL</UILanguageFallback>
            <UserLocale>pl-PL</UserLocale>
        </component>
    </settings>
    <settings pass="generalize">
        <component name="Microsoft-Windows-Security-SPP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SkipRearm>1</SkipRearm>
        </component>
    </settings>	
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <AutoLogon>
                <Enabled>true</Enabled>
                <Username>Administrator</Username>
            </AutoLogon>
            <FirstLogonCommands>
                <SynchronousCommand wcm:action="add">
                    <Order>1</Order>
                    <Description>antyeko1</Description>
                    <CommandLine>powercfg -x -monitor-timeout-ac 0</CommandLine> 
                </SynchronousCommand>
                <SynchronousCommand wcm:action="add">
                    <Order>2</Order>
                    <Description>antyeko2</Description>
                    <CommandLine>powercfg -x -disk-timeout-ac 0</CommandLine> 
                </SynchronousCommand>
				<SynchronousCommand wcm:action="add">
                    <Order>3</Order>
                    <Description>antyeko3</Description>
                    <CommandLine>powercfg -x -standby-timeout-ac 0</CommandLine> 
                </SynchronousCommand>
            </FirstLogonCommands>
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <ProtectYourPC>3</ProtectYourPC>
                <SkipUserOOBE>true</SkipUserOOBE>
                <SkipMachineOOBE>true</SkipMachineOOBE>
                <NetworkLocation>Other</NetworkLocation>
            </OOBE>
            <VisualEffects>
                <FontSmoothing>ClearType</FontSmoothing>
            </VisualEffects>
        </component>
    </settings>
</unattend>

 

dodatkowo ustawiamy sobie też kilka opcji związanych z zasilaniem.

 

Jeżeli zaś chcemy założyć nowego użytkownika i włączyć dla niego automatyczne logowanie (w tym przypadku z pustym hasłem):

 

 

 


<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>0415:00001045</InputLocale>
            <SystemLocale>pl-PL</SystemLocale>
            <UILanguage>pl-PL</UILanguage>
            <UILanguageFallback>pl-PL</UILanguageFallback>
            <UserLocale>pl-PL</UserLocale>
        </component>
    </settings>
    <settings pass="generalize">
        <component name="Microsoft-Windows-Security-SPP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SkipRearm>1</SkipRearm>
        </component>
    </settings>	
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <UserAccounts>
                <LocalAccounts>
                    <LocalAccount wcm:action="add">
                        <DisplayName>maggreg</DisplayName>
                        <Name>maggreg</Name>
                        <Group>Administrators</Group>
						<Password>
                            <Value></Value>
                            <PlainText>true</PlainText>
                        </Password>
                    </LocalAccount>
                </LocalAccounts>
            </UserAccounts>
		   <AutoLogon>
                <Enabled>true</Enabled>
                <Username>maggreg</Username>
            </AutoLogon>
            <FirstLogonCommands>
                <SynchronousCommand wcm:action="add">
                    <Order>1</Order>
                    <Description>antyeko</Description>
                    <CommandLine>powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c</CommandLine> 
                </SynchronousCommand>			
                <SynchronousCommand wcm:action="add">
                    <Order>2</Order>
                    <Description>antyeko1</Description>
                    <CommandLine>powercfg -x -monitor-timeout-ac 0</CommandLine> 
                </SynchronousCommand>
                <SynchronousCommand wcm:action="add">
                    <Order>3</Order>
                    <Description>antyeko2</Description>
                    <CommandLine>powercfg -x -disk-timeout-ac 0</CommandLine> 
                </SynchronousCommand>
				<SynchronousCommand wcm:action="add">
                    <Order>4</Order>
                    <Description>antyeko3</Description>
                    <CommandLine>powercfg -x -standby-timeout-ac 0</CommandLine> 
                </SynchronousCommand>
                <SynchronousCommand wcm:action="add">
                    <Order>5</Order>
                    <Description>antyeko4</Description>
                    <CommandLine>powercfg -h off</CommandLine> 
                </SynchronousCommand>				
            </FirstLogonCommands>
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <ProtectYourPC>3</ProtectYourPC>
                <SkipUserOOBE>true</SkipUserOOBE>
                <SkipMachineOOBE>true</SkipMachineOOBE>
                <NetworkLocation>Other</NetworkLocation>
            </OOBE>
            <VisualEffects>
                <FontSmoothing>ClearType</FontSmoothing>
            </VisualEffects>
        </component>
    </settings>
</unattend>

 

 

Oczywiście niezależnie jaki sobie plik odpowiedzi ustawimy pamiętajmy o jednym, faza winpe została przez nas pominięta więc jej umieszczanie w pliku nie ma sensu.

 

 

Proponuję analizę skryptu install.cmd nawet osobom które nie są zainteresowane instalacją systemów, jest w nim użyte kilka trików których opis trudno wyszperać w internecie (są ale się urywają :)), mam na myśli:

pętle wielowarunkowe, wyciąganie fragmentów odpowiedzi zwracany przez komendy w pętlach for, wierszowa obsługa diskparta, polskie znaki w skrypcie.

 

pzdr

Odnośnik do komentarza

Przykładowy filmik jak taka instalacja wygląda - bez cięć więc proponuję sobie przewijać (całość <8min) - zamieściłem w czasie rzeczywistym żeby można było sobie porównać długość poszczególnych etapów.

 

 

Startujemy z sieci w trybie legacy, menu w grub4dos plus chainload syslinux - właściwie lpxelinux który obsługuje transfer po http, znacznie szybszy od tftp.

Sam chain dlatego, że winpe jest ładowane z pośrednictwem "wimboot" który bardzo przyspiesza start samego pe.

Sam system instalowany jako efi.

 

Dodatkowo mała zmiana w głównym skrypcie więc jak ktoś ściągnął radzę sięgnąć ponownie do pierwszego postu.

 

pzdr

Odnośnik do komentarza

Wywołany do tablicy przez kolegę z innego forum "dorobiłem" skrypt tworzący menu dostępnych do instalacji obrazów.

Skrypt przeczesuje podany na początku w zmiennej katalog pod kątem plików wim i wyświetla wszystkie dostępne w nich obrazy.

 

Wygląda to tak:

post-67-0-59770000-1476811426_thumb.png post-67-0-21690000-1476811430_thumb.png

 

Jako odpowiedź podajemy numer obraz z kolumny Lp., skrypt jrszcze się upewni, że wybór jest prawidłowy, jeżeli potwierdzimy wywoła skrypt główny.

 

 

 

@echo off
@cls
@setlocal enableextensions enabledelayedexpansion
@CHCP 852 >nul

@set /A COUNTER=0
@set "spaces=                               "
@set "katalog=!cd!obrazy"

@echo   Lp.      Obraz                                       Plik
@echo.
for /F "tokens=*" %%G in ('dir /a-d /b /s  ^"%katalog%^" ^|find /i ".wim"^') DO (call :do_set1 "%%G") 
@if "%COUNTER%"=="0" @goto end
@goto do_set4

:do_set1
@set wimfile=%~1
@set wimname=%~nx1
@for /f "tokens=3,* delims= " %%G in ('call dism /get-wiminfo /wimfile:%wimfile%  ^| find /i "index"') do (call :do_set2 "%%G") 
@goto end

:do_set2
@set index=%~1
@for /f "tokens=3,* delims= " %%G in ('call dism /get-wiminfo /wimfile:%wimfile% /index:%index% ^| find /i "description"') do (call :do_set3 "%%G %%H")
@goto end

:do_set3
@set /A COUNTER+=1
@set opis=%~1

@set "o%COUNTER%=%opis%"
@set "i%COUNTER%=%index%"
@set "wn%COUNTER%=%wimname%"
@set "w%COUNTER%=%wimfile%"

@call :formatout
::@echo. %COUNTER%   %opis%   %wimname%
@goto end

:do_set4
@echo.
@echo.
@SET /P obraz=Kt˘ry obraz zainstalowa†?:   
@echo.
if [!wn%obraz%!]==[] (@echo Nieprawidowy wyb˘r.) & @goto end
@echo. Wybrano obraz "!o%obraz%!" z pliku !wn%obraz%!
@echo.
@SET /P wyb=Czy wyb˘r jest prawidowy (T czy N)?: 
@echo.  
@if /i [%wyb%]==[T] @goto do_set5
@if /i [%wyb%]==[Y] @goto do_set5
@goto end

:formatout
@call :padright opis 40
@call :padright wimname 20
@call :padright COUNTER 5
@echo   %COUNTER%    %opis%    %wimname%
@goto :end

:padright
@call SET padded=%%%1%%%spaces%
@call SET %1=%%padded:~0,%2%%
@goto end

:do_set5
@call install.cmd !w%obraz%! !i%obraz%!
@echo.
@goto end

:end
@endlocal

 

 

Zewnętrzny link

 

Katalog z obrazami ustawiamy w linii:

@set "katalog=!cd!obrazy"

Może to byś ścieżka względna, bezwzględna jak i bezpośrednio plik wim.

 

Kod odpowiedzialny za ustawienie wyniku w kolumnach to gotowiec znaleziony w sieci.

 

Uwaga - zarówno skrypt główny jak i pomocniczy zakładają, że pracujemy w systemie (winpe) anglojęzycznym w przeciwnym wypadku niektóre linijki będą niewłaściwe - najczęściej chodzi o ustawienia "tokens" dla pętli "for" czy też argumenty dla komendy "find".

 

np.:

@for /f "tokens=3,* delims= " %%G in ('call dism /get-wiminfo /wimfile:%wimfile%  ^| find /i "index"') do (call :do_set2 "%%G") 

vs

@for /f "tokens=2,* delims= " %%G in ('call dism /get-wiminfo /wimfile:%wimfile%  ^| find /i "indeks"') do (call :do_set2 "%%G") 

pzdr

Odnośnik do komentarza

Opis w drugiej kolumnie listingu z poprzedniego postu jest tworzony na podstawie zmiennej "description" (w wersji polskiej właśnie "opis") poszczególnych obrazów wim.

O ile oryginalne obrazy od ms mają ten parametr ustawiony o tyle obrazy przerabiane, łapane samodzielnie już nie. Sam skrypt troszkę traci na czytelności bez tych opisów więc warto je ustawić.

 

Zrobimy to w imagex:

 

imagex /info obraz.wim 1 "windows 7 ze sterami" "windows 7 ze sterami"

 

Pierwszy wpis ustawia nazwę i musi być obligatoryjnie podany jeżeli chcemy też edytować opis (najczęściej oba zawierają to samo).

 

lub alternatywnie z większą kontrolą w wimlib-imagex:

 

P:\temp\wimlib\wimlib-imagex.exe info 7_sp1_ulti_pl.wim 1 "Windows 7 ULTIMATE" --image-property DESCRIPTION="Windows 7 ULTIMATE" --image-property DISPLAYNAME="Windows 7 Ultimate" --image-property DISPLAYDESCRIPTION="Windows 7 Ultimate" --image-property FLAGS="Ultimate"

 

Tutaj możemy edytować wszystkie flagi wewnętrznego pliku xml zawierającego konfigurację danego obrazu.

Np. ustawienie flagi "flags" pozwala użyć takiego obrazu jako źródła instalacji dla firmowego setupu ms (install.wim), inaczej setup taki plik odrzuci.

Uwaga na wielkość liter - flagi muszą mieć zapis identyczny jak w oryginalnym pliku xml.

 

 

Niezależnie od tego czy winpe starujemy z sieci czy z pena warto sobie ustawić skrypt automatycznie pozycjonujący w katalogu z naszymi skryptami i obrazami, ja proponuję następujące skrypty które możemy wstawić do winpe jako "startnet.cmd":

 

dla wersji sieciowej np.:

 

@wpeinit >nul
@net use n: \\192.168.0.1\tftpboot\instalki /user:guest "" >nul
@cd /d n:
@cmd /k

 

dla wersji usb:

 

@wpeinit >nul

@echo off

@for %%d in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:) do if exist "%%d\instalki\install.cmd" (

@cd /d %%d\instalki

)

@subst N: %cd%

@cd /d N:

@cmd /k

 

Przy pomocy winlib-imagex możemy plik zintegrować w obrazie bez potrzeby jego montowania:

 

wimlib-imagex.exe update winpe.wim 1 --check --rebuild --command="add startnet.cmd \windows\system32\startnet.cmd"

 

Jeżeli inicjacja sieci dla wersji pierwszej będzie zbyt długa i przypisanie udziałów sieciowych się nie powiedzie można do skryptu dodać opóźnienie, w wine pe nie mamy komendy wait więc można ją zastąpić przez ping.

Np. opóźnienie o 5s:

 

ping localhost -n 5 > nul

 

 

pzdr

Odnośnik do komentarza
  • 1 miesiąc temu...

Nowa wersja skryptu, odrobinę bardziej zaawansowana.

Różnice w stosunku do wersji podstawowej:

1. Wybór dysku w przypadku wykrycia większej ilości odpowiednich napędów (z wykluczeniem napędów usb).

post-67-0-33690000-1480547190_thumb.png post-67-0-36170000-1480547194_thumb.png

2. Opcja P pozwalająca pominąć konfigurację dysku - wygodniejsza alternatywa dla opcji custom, raczej dla zaawansowanych użytkowników (potencjalnie destrukcyjna, pozwala też na niespójności konfiguracyjne).

3. Po wybraniu opcji utworzenia małej partycji recovery - konfiguruje odpowiednią opcję startową.

4. Ustawiony katalog tymczasowy dla DISM - workaround dla błędnej konfiguracji winpe.

5. Kilka kosmetycznych zmian w formatowaniu kodu.

 

 

 

 


cls
@echo off
setlocal enableextensions enabledelayedexpansion
CHCP 852 >nul
 
%~d0
cd %~p0
 
if /i [%1]==[] (echo nie podano argumentu.) & goto :not_ok
if /i [%2]==[] (set index=1) else (set index=%2)
 
for /f "tokens=2 delims= " %%G in ('call dism /get-wiminfo /wimfile:%1 /index:%index%  ^| find /i "error:"') do (set EL=%%G)
 
if /i not [%EL%]==[] echo Plik nie zawiera obrazu o indeksie %index% & goto :not_ok
 
set /P efi=Czy zainstalowa system w trybie UEFI (T czy N)?:
set /P reco=Konfiguracja dysku i partycji recovery (A=15GB, B=1GB, Z=Custom, P=Pomiä, N)?:
 
if /i not [%reco%]==[A] if /i not [%reco%]==[B] if /i not [%reco%]==[Z] if /i not [%reco%]==[P] set reco=C
if /i [%efi%]==[T] set FW=efi
if /i [%efi%]==[Y] set FW=efi
 
if /i [%reco%]==[P] goto :do_select
 
echo.
set /a count=0
set disknr=
for /f "tokens=2" %%A in ('^(echo lis dis^) ^| diskpart ^| find /i "online"') do (call :dsk1 "%%A")
if [%count%]==[1] (set disknr=0 & goto :disknr)
if [%count%]==[0] (echo Nie wykryto dysk˘w umoľliwiajĄcych instalacj©. & goto :not_ok)
echo.
if [%count%] GTR [1] echo Wykryto kilka dysk˘w umoľliwiajĄcych instalacj©:
echo.
set /P disknr=Na kt˘rym instalowa†?:
echo.
if /i [%disknr%] == [] (echo Nie wybrano dysku.) & goto :not_ok
for /f %%A in ('^(echo %okdisks%^) ^| find /c /i "%disknr%"') do (if /i [%%A]==[0] (echo Nieprawidowy dysk.) & goto :not_ok)
for /f "skip=10 delims=" %%A in ('^(echo sel dis %disknr% ^& echo det dis^) ^| diskpart') do (set /P select_disk="Wybrano: Dysk %disknr% > %%A - czy potwierdzasz (T czy N)?:" &  goto :dsk3)
goto :not_ok
 
:dsk1
for /f "delims=" %%A in ('^(echo sel dis %1 ^& echo det dis^) ^| diskpart ^| find /c /i ": usb"') do (if /i [%%A] EQU [0] (set /a count+=1 & call :dsk2 %1))
goto :not_ok
 
:dsk2
for /f "tokens=1,2,4,5" %%A in ('^(echo lis dis^) ^| diskpart ^| find /i "disk %~1"') do (set dnr="%%A %%B  -  %%C %%D")
for /f "skip=10 delims=" %%A in ('^(echo sel dis %1 ^& echo det dis^) ^| diskpart') DO (echo %dnr:"=%  -  %%A & set okdisks=%okdisks%+%~1+ & goto :not_ok)
goto :not_ok
 
:dsk3
if /i [%select_disk%]==[T] set select_disk=true
if /i [%select_disk%]==[Y] set select_disk=true
if /i not [%select_disk%]==[true] (echo Nie potwierdzono. Wychodz©.) & goto :not_ok
goto :disknr
 
:do_select
echo.
echo Wybrano r©cznĄ konfiguracj©.
echo Potwierd« kt˘re woluminy chcesz oznaczy† jako S i W (podaj nr. z listy):
echo.
(echo lis vol) | diskpart
(echo exit) | diskpart >nul
echo.
set /P s=Podaj numer woluminu S:
if /i not [%s%] NEQ [] (echo Nie ustawiono poprawnych parametr˘w) & goto :not_ok
for /f %%A in ('^(echo lis vol^) ^| diskpart ^| find /c /i "Volume %s%"') do (if /i [%%A]==[0] (echo Nie ma takiego woluminu) & goto :not_ok)
for /f "tokens=1,2" %%A in ('^(echo lis vol^) ^| diskpart ^| find /i "Volume %s%"') do (set /P select_s="Wybrano wolumin %%B - czy potwierdzasz (T czy N)?:")
 
if /i [%select_s%]==[T] set select_s=true
if /i [%select_s%]==[Y] set select_s=true
if /i not [%select_s%]==[true] (echo Nie potwierdzono. Wychodz©.) & goto :not_ok
 
set /P w=Podaj numer woluminu W:
if /i not [%w%] NEQ [] (echo Nie ustawiono poprawnych parametr˘w) & goto :not_ok
for /f %%A in ('^(echo lis vol^) ^| diskpart ^| find /c /i "Volume %w%"') do (if /i [%%A]==[0] (echo Nie ma takiego woluminu) & goto :not_ok)
for /f "tokens=1,2" %%A in ('^(echo lis vol^) ^| diskpart ^| find /i "Volume %w%"') do (set /P select_w="Wybrano wolumin %%B - czy potwierdzasz (T czy N)?:")
 
if /i [%select_w%]==[T] set select_w=true
if /i [%select_w%]==[Y] set select_w=true
if /i not [%select_w%]==[true] (echo Nie potwierdzono. Wychodz©.) & goto :not_ok
 
set /P select_format=Czy formatowa† wolumin W (T czy N)?:
if /i [%select_format%]==[T] (echo sel vol %w% & echo for quick fs=ntfs label=Windows) | diskpart >nul
if /i [%select_format%]==[Y] (echo sel vol %w% & echo for quick fs=ntfs label=Windows) | diskpart >nul
(echo sel vol %s% & echo ass letter=S & echo sel vol %w% & echo ass letter=W) | diskpart >nul
(echo exit) | diskpart >nul
goto :do_dism
 
:disknr
(echo exit) | diskpart >nul
echo.
 
if /i not [%FW%]==[efi] goto :do_bios_disk
if /i [%FW%]==[efi] goto :do_efi_disk
 
:do_bios_disk
echo Prosz© czeka† - trwa konfigurowanie dysku.
if /i not [%reco%]==[Z] (echo sel dis %disknr% & echo cle & echo conv mbr & echo cre par pri size=512 & echo for quick fs=ntfs label=Boot & echo ass letter=S: & echo act & echo set id=27)  | diskpart >nul
if /i [%reco%]==[Z] diskpart /s n:\custom.txt >nul
if /i [%reco%]==[C] (echo sel dis %disknr% & echo cre par pri & echo for quick fs=ntfs label=Windows & echo ass letter=W:)  | diskpart >nul
if /i [%reco%]==[B] (echo sel dis %disknr% & echo cre par pri & echo shrink minimum=1024 & echo for quick fs=ntfs label=Windows & echo ass letter=W:)  | diskpart >nul
if /i [%reco%]==[A] (echo sel dis %disknr% & echo cre par pri & echo shrink minimum=15360 & echo for quick fs=ntfs label=Windows & echo ass letter=W:)  | diskpart >nul
if /i not [%reco%]==[C] if /i not [%reco%]==[Z] (echo sel dis %disknr% & echo cre par pri & echo for quick fs=ntfs label=Recovery & echo ass letter=R: & echo set id=27) | diskpart >nul
(echo lis vol) | diskpart
(echo exit) | diskpart >nul
goto :do_dism
 
:do_efi_disk
echo Prosz© czeka† - trwa konfigurowanie dysku.
if /i not [%reco%]==[Z] (echo sel dis %disknr% & echo cle & echo conv gpt & echo cre par efi size=512 & echo for quick fs=fat32 label=Boot & echo ass letter=S: & echo set id=c12a7328-f81f-11d2-ba4b-00a0c93ec93b & echo gpt attributes=0x8000000000000001)  | diskpart >nul
if /i not [%reco%]==[Z] (echo sel dis %disknr% & echo cre par msr size=100)  | diskpart >nul
if /i [%reco%]==[Z] diskpart /s n:\custom.txt >nul
if /i [%reco%]==[C] (echo sel dis %disknr% & echo cre par pri & echo for quick fs=ntfs label=Windows & echo ass letter=W:)  | diskpart >nul
if /i [%reco%]==[B] (echo sel dis %disknr% & echo cre par pri & echo shrink minimum=1024 & echo for quick fs=ntfs label=Windows & echo ass letter=W:)  | diskpart >nul
if /i [%reco%]==[A] (echo sel dis %disknr% & echo cre par pri & echo shrink minimum=15360 & echo for quick fs=ntfs label=Windows & echo ass letter=W:)  | diskpart >nul
if /i not [%reco%]==[C] if /i not [%reco%]==[Z] (echo sel dis %disknr% & echo cre par pri & echo for quick fs=ntfs label=Recovery & echo ass letter=R: & echo set id=de94bba4-06d1-4d40-a16a-bfd50179d6ac & echo gpt attributes=0x8000000000000001) | diskpart >nul
(echo lis vol) | diskpart
(echo exit) | diskpart >nul
goto :do_dism
 
:do_dism
echo.
echo.
for /f "tokens=3,* delims= " %%G in ('call dism /get-wiminfo /wimfile:%1 /index:%index%  ^| find /i "name"') do ( echo Instaluj© %%G %%H)
md W:\sd
 
rem wimlib-imagex.exe apply %1 %index% W:\
 
dism /Apply-Image /ImageFile:%1 /Index:%index% /ApplyDir:W:\ /scratchdir:W:\sd
 
rem imagex.exe /apply %1 1 W:\
 
rd W:\sd
echo.
if /i not [%FW%]==[efi] goto :do_bios_bcd
if /i [%FW%]==[efi] goto :do_efi_bcd
 
:do_bios_bcd
bcdboot W:\Windows /d /s S: /l pl-pl /f BIOS
goto :reco
:do_efi_bcd
bcdboot W:\Windows /d /s S: /l pl-pl /f UEFI
goto :reco
 
:reco
echo.
if /i not [%reco%]==[B] goto :ok
md R:\Recovery\WindowsRE 
xcopy /cherky W:\Windows\System32\Recovery\Winre.wim R:\Recovery\WindowsRE\ >nul
W:\Windows\System32\Reagentc /Setreimage /Path R:\Recovery\WindowsRE /Target W:\Windows 2>nul
W:\Windows\System32\Reagentc /info /Target W:\Windows >nul 2>nul
goto :ok
 
:ok
echo.
echo System zainstalowany.
:not_ok
 
endlocal

 

 

 

Zewnętrzny link

 

pzdr

 

Odnośnik do komentarza
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...