AdvancedInstaller生成後自動創建ISO虛擬光盤

添加屬性


添加生成事件

@@@code

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

-ExecutionPolicy RemoteSigned -File "d:\script\createiso.ps1" "[|AI_BUILD_OUTPUT_FOLDER]" "[|IsoFileName]" "[|IsoTitle]"

@@#


腳 本如下

 

@@@code

Param(

[string]$path,

[string]$iso,

[string]$title

)

 

$path = "E:\advInstallerProjects\SystemHotfix\Setup Files"

$iso="e:\shared\NetCoreSetup.iso"

$title="NetCoreSetup_Ver20211214"

Write-Host create `"$path`" to `"$iso`" with $title

 

function New-IsoFile

{

<# .Synopsis Creates a new .iso file .Description The New-IsoFile cmdlet creates a new .iso file containing content from chosen folders .Example New-IsoFile "c:\tools","c:Downloads\utils" This command creates a .iso file in $env:temp folder (default location) that contains c:\tools and c:\downloads\utils folders. The folders themselves are included at the root of the .iso image. .Example New-IsoFile -FromClipboard -Verbose Before running this command, select and copy (Ctrl-C) files/folders in Explorer first. .Example dir c:\WinPE | New-IsoFile -Path c:\temp\WinPE.iso -BootFile "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\efisys.bin" -Media DVDPLUSR -Title "WinPE" This command creates a bootable .iso file containing the content from c:\WinPE folder, but the folder itself isn't included. Boot file etfsboot.com can be found in Windows ADK. Refer to IMAPI_MEDIA_PHYSICAL_TYPE enumeration for possible media types: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366217(v=vs.85).aspx .Notes NAME: New-IsoFile AUTHOR: Chris Wu LASTEDIT: 03/23/2016 14:46:50 #>

 

[CmdletBinding(DefaultParameterSetName='Source')]Param(

[parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true, ParameterSetName='Source')]$Source,

[parameter(Position=2)][string]$Path = "$env:temp\$((Get-Date).ToString('yyyyMMdd-HHmmss.ffff')).iso",

[ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})][string]$BootFile = $null,

[ValidateSet('CDR','CDRW','DVDRAM','DVDPLUSR','DVDPLUSRW','DVDPLUSR_DUALLAYER','DVDDASHR','DVDDASHRW','DVDDASHR_DUALLAYER','DISK','DVDPLUSRW_DUALLAYER','BDR','BDRE')][string] $Media = 'DVDPLUSRW_DUALLAYER',

[string]$Title = (Get-Date).ToString("yyyyMMdd-HHmmss.ffff"),

[switch]$Force,

[parameter(ParameterSetName='Clipboard')][switch]$FromClipboard

)

 

Begin {

($cp = new-object System.CodeDom.Compiler.CompilerParameters).CompilerOptions = '/unsafe'

if (!('ISOFile' -as [type])) {

Add-Type -CompilerParameters $cp -TypeDefinition @'

public class ISOFile

{

public unsafe static void Create(string Path, object Stream, int BlockSize, int TotalBlocks)

{

 

int bytes = 0;

byte[] buf = new byte[BlockSize];

var ptr = (System.IntPtr)(&bytes);

var o = System.IO.File.OpenWrite(Path);

var i = Stream as System.Runtime.InteropServices.ComTypes.IStream;

 

if (o != null) {

while (TotalBlocks-- > 0) {

i.Read(buf, BlockSize, ptr); o.Write(buf, 0, bytes);

}

o.Flush(); o.Close();

}

}

}

'@

}

 

if ($BootFile) {

if('BDR','BDRE' -contains $Media) { Write-Warning "Bootable image doesn't seem to work with media type $Media" }

($Stream = New-Object -ComObject ADODB.Stream -Property @{Type=1}).Open() # adFileTypeBinary

$Stream.LoadFromFile((Get-Item -LiteralPath $BootFile).Fullname)

($Boot = New-Object -ComObject IMAPI2FS.BootOptions).AssignBootImage($Stream)

}

 

$MediaType = @('UNKNOWN','CDROM','CDR','CDRW','DVDROM','DVDRAM','DVDPLUSR','DVDPLUSRW','DVDPLUSR_DUALLAYER','DVDDASHR','DVDDASHRW','DVDDASHR_DUALLAYER','DISK','DVDPLUSRW_DUALLAYER','HDDVDROM','HDDVDR','HDDVDRAM','BDROM','BDR','BDRE')

 

Write-Verbose -Message "Selected media type is $Media with value $($MediaType.IndexOf($Media))"

($Image = New-Object -com IMAPI2FS.MsftFileSystemImage -Property @{VolumeName=$Title}).ChooseImageDefaultsForMediaType($MediaType.IndexOf($Media))

 

if (!($Target = New-Item -Path $Path -ItemType File -Force:$Force )){

# if (!($Target = New-Item -Path $Path -ItemType File -Force:$Force -ErrorAction SilentlyContinue)) {

Write-Error -Message "Cannot create file $Path. Use -Force parameter to overwrite if the target file already exists.";

break

}

}

 

Process {

 

if($FromClipboard) {

if($PSVersionTable.PSVersion.Major -lt 5) { Write-Error -Message 'The -FromClipboard parameter is only supported on PowerShell v5 or higher'; break }

$Source = Get-Clipboard -Format FileDropList

}

 

foreach($item in $Source) {

if($item -isnot [System.IO.FileInfo] -and $item -isnot [System.IO.DirectoryInfo]) {

$item = Get-Item -LiteralPath $item

}

 

if($item) {

Write-Verbose -Message "Adding item to the target image: $($item.FullName)"

try { $Image.Root.AddTree($item.FullName, $true) } catch { Write-Error -Message ($_.Exception.Message.Trim() + ' Try a different media type.') }

}

}

}

 

End {

if ($Boot) { $Image.BootImageOptions=$Boot }

 

$Result = $Image.CreateResultImage()

 

[ISOFile]::Create($Target.FullName,$Result.ImageStream,$Result.BlockSize,$Result.TotalBlocks)

Write-Verbose -Message "Target image ($($Target.FullName)) has been created"

$Target

}

}

 

 

 

# 備份可能 的文件

if( [System.IO.File]::Exists($iso) ){

# Write-Host "backup"

# [System.IO.File]::Copy($iso,$iso+".bak",1 )

# [System.IO.File]::Delete($iso)

}

 

 

Function read-HostTimeout {

###################################################################

## Description: Mimics the built-in "read-host" cmdlet but adds an expiration timer for

## receiving the input. Does not support -assecurestring

##

## This script is provided as is and may be freely used and distributed so long as proper

## credit is maintained.

##

## Written by: [email protected]

## Date Modified: 10-24-14

###################################################################

 

# Set parameters. Keeping the prompt mandatory

# just like the original

param(

    [Parameter(Mandatory=$true,Position=1)]

    [string]$prompt,

    

    [Parameter(Mandatory=$false,Position=2)]

    [int]$delayInSeconds

)

    

    # Do the math to convert the delay given into milliseconds

    # and divide by the sleep value so that the correct delay

    # timer value can be set

    $sleep = 250

    $delay = ($delayInSeconds*1000)/$sleep

    $count = 0

    $charArray = New-Object System.Collections.ArrayList

    Write-host -nonewline "$($prompt): "

    

    # While loop waits for the first key to be pressed for input and

    # then exits. If the timer expires it returns null

    While ( (!$host.ui.rawui.KeyAvailable) -and ($count -lt $delay) ){

        start-sleep -m $sleep

        $count++

        If ($count -eq $delay) { "`n"; return $null}

    }

    

    # Retrieve the key pressed, add it to the char array that is storing

    # all keys pressed and then write it to the same line as the prompt

    $key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp").Character

    $charArray.Add($key) | out-null

    Write-host -nonewline $key

    

    # This block is where the script keeps reading for a key. Every time

    # a key is pressed, it checks if it's a carriage return. If so, it exits the

    # loop and returns the string. If not it stores the key pressed and

    # then checks if it's a backspace and does the necessary cursor

    # moving and blanking out of the backspaced character, then resumes

    # writing.

    $key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp")

    While ($key.virtualKeyCode -ne 13) {

        If ($key.virtualKeycode -eq 8) {

            $charArray.Add($key.Character) | out-null

            Write-host -nonewline $key.Character

            $cursor = $host.ui.rawui.get_cursorPosition()

            write-host -nonewline " "

            $host.ui.rawui.set_cursorPosition($cursor)

            $key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp")

        }

        Else {

            $charArray.Add($key.Character) | out-null

            Write-host -nonewline $key.Character

            $key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp")

        }

    }

    ""

    $finalString = -join $charArray

    return $finalString

}

 

Function create($delayInSeconds){

 

Write-Host "begin create,please wait..."

try

{

Get-ChildItem $path | New-IsoFile -path $iso -Title $title -Force -ErrorAction Stop

Write-Host "ok" -ForegroundColor Yellow

[System.Diagnostics.Process]::Start([System.IO.Path]::GetDirectoryName($iso))

}

catch

{

Write-Warning "Error: $_"

# 遠程桌面切換爲導致產生很多水平定位符

try{

$retry = read-HostTimeout -prompt "請在 $delayInSeconds 秒內進行選擇:1 重試 0 退出" -delayInSeconds $delayInSeconds

$retry= $retry.Replace("`t","").Replace("`0","").Replace(" ","").Trim()

# Write-Host `"$retry`"

#[System.IO.File]::WriteAllText("aa.bin",$retry.Replace("`t","").Replace("`0","").Trim())

if($retry -eq "1"){

Write-Host "重新生成..." -ForegroundColor Yellow

create -delayInSeconds $delayInSeconds

}

}catch{

#Write-Warning "Error: $_"

pause

}

# Choice /C yn /D n /t 30 /m "是否重試? "

#if ($LASTEXITCODE -eq "1") # 1 for "yes" 2 for "no"

# {

# Write-Host "重新生成..." -ForegroundColor Yellow create

# }

 

 

}

}

 

create -delayInSeconds 60

 

# & timeout /T 5 /NOBREAK

 

 

# open

@@#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章