Public/OSDCloudIPU/Invoke-OSDCloudIPU.ps1
function Invoke-OSDCloudIPU { <# Log Files for IPU: https://learn.microsoft.com/en-us/windows/deployment/upgrade/log-files Setup Command Line: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-setup-command-line-options?view=windows-11 #> [CmdletBinding(DefaultParameterSetName = 'Default')] param ( [Parameter(ParameterSetName = 'Default')] [ValidateSet( 'Windows 11 23H2 x64', 'Windows 11 23H2 ARM64', 'Windows 11 22H2 x64', 'Windows 11 21H2 x64', 'Windows 10 22H2 x64', 'Windows 10 22H2 ARM64')] [System.String] $OSName = 'Windows 11 23H2 x64', [switch] $Silent, [switch] $SkipDriverPack, [switch] $NoReboot, [switch] $DiagnosticPrompt ) #region Admin Elevation $whoiam = [system.security.principal.windowsidentity]::getcurrent().name $isElevated = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") if ($isElevated) { Write-Host -ForegroundColor Green "[+] Running as $whoiam and IS Admin Elevated" } else { Write-Warning "[-] Running as $whoiam and is NOT Admin Elevated" Break } #============================================================================ #region Functions #============================================================================ Function Get-TPMVer { $Manufacturer = (Get-WmiObject -Class:Win32_ComputerSystem).Manufacturer if ($Manufacturer -match "HP") { if ($((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).SpecVersion) -match "1.2") { $versionInfo = (Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).ManufacturerVersionInfo $verMaj = [Convert]::ToInt32($versionInfo[0..1] -join '', 16) $verMin = [Convert]::ToInt32($versionInfo[2..3] -join '', 16) $verBuild = [Convert]::ToInt32($versionInfo[4..6] -join '', 16) $verRevision = 0 [version]$ver = "$verMaj`.$verMin`.$verBuild`.$verRevision" Write-Output "TPM Verion: $ver | Spec: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).SpecVersion)" } else {Write-Output "TPM Verion: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).ManufacturerVersion) | Spec: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).SpecVersion)"} } else { if ($((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).SpecVersion) -match "1.2") { Write-Output "TPM Verion: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).ManufacturerVersion) | Spec: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).SpecVersion)" } else {Write-Output "TPM Verion: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).ManufacturerVersion) | Spec: $((Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_TPM).SpecVersion)"} } } #endregion Functions #============================================================================ #region Device Info #============================================================================ Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Starting Invoke-OSDCloudIPU" Write-Host -ForegroundColor Gray "Looking of Details about this device...." $BIOSInfo = Get-WmiObject -Class 'Win32_Bios' # Get the current BIOS release date and format it to datetime $CurrentBIOSDate = [System.Management.ManagementDateTimeConverter]::ToDatetime($BIOSInfo.ReleaseDate).ToUniversalTime() $Manufacturer = (Get-WmiObject -Class:Win32_ComputerSystem).Manufacturer $ManufacturerBaseBoard = (Get-CimInstance -Namespace root/cimv2 -ClassName Win32_BaseBoard).Manufacturer $ComputerModel = (Get-WmiObject -Class:Win32_ComputerSystem).Model if ($ManufacturerBaseBoard -eq "Intel Corporation") { $ComputerModel = (Get-CimInstance -Namespace root/cimv2 -ClassName Win32_BaseBoard).Product } $HPProdCode = (Get-CimInstance -Namespace root/cimv2 -ClassName Win32_BaseBoard).Product $Serial = (Get-WmiObject -class:win32_bios).SerialNumber $cpuDetails = @(Get-WmiObject -Class Win32_Processor)[0] Write-Output "Computer Name: $env:computername" $CurrentOSInfo = Get-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' $WindowsRelease = $CurrentOSInfo.GetValue('ReleaseId') if ($WindowsRelease -eq "2009"){$WindowsRelease = $CurrentOSInfo.GetValue('DisplayVersion')} $Build = $($CurrentOSInfo.GetValue('CurrentBuild')) $BuildUBR_CurrentOS = $Build +"."+$($CurrentOSInfo.GetValue('UBR')) if ($Build -le 19045){$WinVer = "10"} else {$WinVer = "11"} Write-Output "Windows $WinVer $WindowsRelease | $BuildUBR_CurrentOS" Write-Output "Computer Model: $ComputerModel" Write-Output "Serial: $Serial" if ($Manufacturer -like "H*"){Write-Output "Computer Product Code: $HPProdCode"} Write-Output $cpuDetails.Name Write-Output "Current BIOS Level: $($BIOSInfo.SMBIOSBIOSVersion) From Date: $CurrentBIOSDate" Get-TPMVer $TimeUTC = [System.DateTime]::UtcNow $TimeCLT = get-date Write-Output "Current Client Time: $TimeCLT" Write-Output "Current Client UTC: $TimeUTC" Write-Output "Time Zone: $(Get-TimeZone)" $Locale = Get-WinSystemLocale if ($Locale -ne "en-US"){Write-Output "WinSystemLocale: $locale"} $FreeSpace = (Get-CimInstance win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace/1GB -as [int] $DiskSize = (Get-CimInstance win32_LogicalDisk -Filter "DeviceID='C:'").Size/1GB -as [int] Write-Output "C:\ Drive Size: $DiskSize, Freespace: $FreeSpace" if ($Build -le 19045){ $Win11 = Get-Win11Readiness if ($Win11.Return -eq "CAPABLE"){ Write-Host -ForegroundColor Green "Device is Windows 11 CAPABLE" } else { Write-Host -ForegroundColor Yellow "Device is !NOT! Windows 11 CAPABLE" if ($Build -eq 19045){ write-host -ForegroundColor Yellow "This Device is already at the latest supported Version of Windows for this Hardware" } elseif ($Build -lt 19045){ write-host -ForegroundColor Green "But.. You can upgrade it to Windows 10 22H2" } } } #$OSVersion = "Windows $($OSName.split(" ")[1])" #$OSReleaseID = $OSName.split(" ")[2] #$Product = (Get-MyComputerProduct) $DriverPack = Get-OSDCloudDriverPack # -Product $Product -OSVersion $OSVersion -OSReleaseID $OSReleaseID if ($DriverPack){ Write-host -ForegroundColor Gray "Recommended Driverpack for upgrade: $($DriverPack.Name)" if ($SkipDriverPack){ write-host -ForegroundColor Yellow "Skipping Download and Integration [-SkipDriverPack]" } } #endregion Device Info #============================================================================ #region Current Activiation #============================================================================ if (!($OSEdition)){ $OSEdition = Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name "EditionID" } if (!($OSLanguage)){ $OSLanguage = (Get-WinSystemLocale).Name } if (!($OSActivation)){ $OSActivation = (Get-CimInstance SoftwareLicensingProduct -Filter "Name like 'Windows%'" | Where-Object { $_.PartialProductKey }).ProductKeyChannel } if ($OSActivation -match "OEM"){ $OSActivation = "Retail" } $OSArch = $env:PROCESSOR_ARCHITECTURE #endregion Current Activiation if ($OSArch -eq "ARM64"){ #================================================= # OSEditionId and OSActivation #================================================= if (($OSEdition -eq 'Home') -or ($OSEdition -eq 'Core')) { $OSEditionId = 'Core' $OSActivation = 'Retail' $OSImageIndex = 4 } if ($OSEdition -eq 'Home Single Language') { $OSEditionId = 'CoreSingleLanguage' $OSActivation = 'Retail' $OSImageIndex = 5 } if (($OSEdition -eq 'Pro') -or ($OSEdition -eq 'Professional')) { $OSEditionId = 'Professional' if ($OSActivation -eq 'Retail') {$OSImageIndex = 6} if ($OSActivation -eq 'Volume') {$OSImageIndex = 8} } } else { #================================================= # OSEditionId and OSActivation #================================================= if (($OSEdition -eq 'Home') -or ($OSEdition -eq 'Core')) { $OSEditionId = 'Core' $OSActivation = 'Retail' $OSImageIndex = 4 } if (($OSEdition -eq 'Home N') -or ($OSEdition -eq 'CoreN')) { $OSEditionId = 'CoreN' $OSActivation = 'Retail' $OSImageIndex = 5 } if ($OSEdition -eq 'Home Single Language') { $OSEditionId = 'CoreSingleLanguage' $OSActivation = 'Retail' $OSImageIndex = 6 } if ($OSEdition -eq 'Enterprise') { $OSEditionId = 'Enterprise' $OSActivation = 'Volume' $OSImageIndex = 6 } if (($OSEdition -eq 'Enterprise N') -or ($OSEdition -eq 'EnterpriseN')) { $OSEditionId = 'EnterpriseN' $OSActivation = 'Volume' $OSImageIndex = 7 } if ($OSEdition -eq 'Education') { $OSEditionId = 'Education' if ($OSActivation -eq 'Retail') {$OSImageIndex = 7} if ($OSActivation -eq 'Volume') {$OSImageIndex = 4} } if (($OSEdition -eq 'Education N') -or ($OSEdition -eq 'EducationN')) { $OSEditionId = 'EducationN' if ($OSActivation -eq 'Retail') {$OSImageIndex = 8} if ($OSActivation -eq 'Volume') {$OSImageIndex = 5} } if (($OSEdition -eq 'Pro') -or ($OSEdition -eq 'Professional')) { $OSEditionId = 'Professional' if ($OSActivation -eq 'Retail') {$OSImageIndex = 9} if ($OSActivation -eq 'Volume') {$OSImageIndex = 8} } if (($OSEdition -eq 'Pro N') -or ($OSEdition -eq 'ProfessionalN')) { $OSEditionId = 'ProfessionalN' if ($OSActivation -eq 'Retail') {$OSImageIndex = 10} if ($OSActivation -eq 'Volume') {$OSImageIndex = 9} } } Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor DarkCyan "These are set automatically based on your current OS" Write-Host -ForegroundColor Cyan "OSEditionId: " -NoNewline Write-Host -ForegroundColor Green $OSEditionId Write-Host -ForegroundColor Cyan "OSImageIndex: " -NoNewline Write-Host -ForegroundColor Green $OSImageIndex Write-Host -ForegroundColor Cyan "OSLanguage: " -NoNewline Write-Host -ForegroundColor Green $OSLanguage Write-Host -ForegroundColor Cyan "OSActivation: " -NoNewline Write-Host -ForegroundColor Green $OSActivation Write-Host -ForegroundColor Cyan "OSArch: " -NoNewline Write-Host -ForegroundColor Green $OSArch Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Starting Feature Update lookup and Download" #============================================================================ #region Detect & Download ESD File #============================================================================ $ScratchLocation = 'c:\OSDCloud\IPU' $OSMediaLocation = 'c:\OSDCloud\OS' $MediaLocation = "$ScratchLocation\Media" if (!(Test-Path -Path $OSMediaLocation)){New-Item -Path $OSMediaLocation -ItemType Directory -Force | Out-Null} if (!(Test-Path -Path $ScratchLocation)){New-Item -Path $ScratchLocation -ItemType Directory -Force | Out-Null} if (Test-Path -Path $MediaLocation){Remove-Item -Path $MediaLocation -Force -Recurse} New-Item -Path $MediaLocation -ItemType Directory -Force | Out-Null $ESD = Get-FeatureUpdate -OSName $OSName -OSActivation $OSActivation -OSLanguage $OSLanguage -OSArchitecture $OSArch if (!($ESD)){ Write-Host -ForegroundColor Red "Unable to Determine proper ESD Upgrade File" throw "Unable to Determine proper ESD Upgrade File" } Write-Host -ForegroundColor Cyan "Name: " -NoNewline Write-Host -ForegroundColor Green $ESD.Name Write-Host -ForegroundColor Cyan "Architecture: " -NoNewline Write-Host -ForegroundColor Green $ESD.Architecture Write-Host -ForegroundColor Cyan "Activation: " -NoNewline Write-Host -ForegroundColor Green $ESD.Activation Write-Host -ForegroundColor Cyan "Build: " -NoNewline Write-Host -ForegroundColor Green $ESD.Build Write-Host -ForegroundColor Cyan "FileName: " -NoNewline Write-Host -ForegroundColor Green $ESD.FileName Write-Host -ForegroundColor Cyan "Url: " -NoNewline Write-Host -ForegroundColor Green $ESD.Url Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Getting Content for Upgrade Media" #Build Media Paths $SubFolderName = "$($ESD.Version) $($ESD.ReleaseId)" $ImageFolderPath = "$OSMediaLocation\$SubFolderName" if (!(Test-Path -Path $ImageFolderPath)){New-Item -Path $ImageFolderPath -ItemType Directory -Force | Out-Null} $ImagePath = "$ImageFolderPath\$($ESD.FileName)" $ImageDownloadRequired = $true #Check Flash Drive for Media $OSDCloudUSB = Get-Volume.usb | Where-Object {($_.FileSystemLabel -match 'OSDCloud') -or ($_.FileSystemLabel -match 'BHIMAGE')} | Select-Object -First 1 if ($OSDCloudUSB){ $USBImagePath = "$($OSDCloudUSB.DriveLetter):\OSDCloud\OS\$SubFolderName\$($ESD.FileName)" if ((Test-Path -path $USBImagePath) -and (!(Test-Path -path $ImagePath))){ Write-Host -ForegroundColor Green "Found media on OSDCloudUSB - Copying Local" Copy-Item -Path $USBImagePath -Destination $ImagePath } } #Test for Media if (Test-path -path $ImagePath){ Write-Host -ForegroundColor Gray "Found previously downloaded media, getting SHA1 Hash" $SHA1Hash = Get-FileHash $ImagePath -Algorithm SHA1 if ($SHA1Hash.Hash -eq $esd.SHA1){ Write-Host -ForegroundColor Gray "SHA1 Match on $ImagePath, skipping Download" $ImageDownloadRequired = $false } else { Write-Host -ForegroundColor Gray "SHA1 Match Failed on $ImagePath, removing content" } } if ($ImageDownloadRequired -eq $true){ #Save-WebFile -SourceUrl $ESD.Url -DestinationDirectory $ScratchLocation -DestinationName $ESD.FileName Write-Host -ForegroundColor Gray "Starting Download to $ImagePath, this takes awhile" <# This was taking way too long for some files #Get ESD Size $req = [System.Net.HttpWebRequest]::Create("$($ESD.Url)") $res = $req.GetResponse() (Invoke-WebRequest $ESD.Url -Method Head).Headers.'Content-Length' $ESDSizeMB = $([Math]::Round($res.ContentLength /1000000)) Write-Host "Total Size: $ESDSizeMB MB" #> #Clear Out any Previous Attempts $ExistingBitsJob = Get-BitsTransfer -Name "$($ESD.FileName)" -AllUsers -ErrorAction SilentlyContinue If ($ExistingBitsJob) { Remove-BitsTransfer -BitsJob $ExistingBitsJob } if ((Get-Service -name BITS).Status -ne "Running"){ Write-Host -ForegroundColor Yellow "BITS Service is not Running, which is required to download ESD File, attempting to Start" $StartBITS = Start-Service -Name BITS -PassThru Start-Sleep -Seconds 2 if ($StartBITS.Status -ne "Running"){ } } #Start Download using BITS Write-Host -ForegroundColor DarkGray "Start-BitsTransfer -Source $ESD.Url -Destination $ImageFolderPath -DisplayName $($ESD.FileName) -Description 'Windows Media Download' -RetryInterval 60" $BitsJob = Start-BitsTransfer -Source $ESD.Url -Destination $ImageFolderPath -DisplayName "$($ESD.FileName)" -Description "Windows Media Download" -RetryInterval 60 If ($BitsJob.JobState -eq "Error"){ write-Host "BITS tranfer failed: $($BitsJob.ErrorDescription)" } } #endregion Detect & Download ESD File #============================================================================ #region Extract of ESD file to create Setup Content #============================================================================ #Grab ESD File and create bootable ISO if ((!(Test-Path -Path $ImagePath)) -or (!(Test-Path -Path $MediaLocation))){ if (!(Test-Path -Path $ImagePath)){ Write-Host -ForegroundColor Red "Missing $ImagePath, double check download process" throw "Failed to find $ImagePath, double check download process" } if (!(Test-Path -Path $MediaLocation)){ Write-Host -ForegroundColor Red "Missing $MediaLocation, double check folder exist" throw "Faield to find $MediaLocation, double check folder exist" } } if ((Test-Path -Path $ImagePath) -and (Test-Path -Path $MediaLocation)){ Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Starting Extract of ESD file to create Setup Content" $ApplyPath = $MediaLocation Write-Host -ForegroundColor Gray "Expanding $ImagePath Index 1 to $ApplyPath" $Expand = Expand-WindowsImage -ImagePath $ImagePath -Index 1 -ApplyPath $ApplyPath ##Export-WindowsImage -SourceImagePath $ImagePath -SourceIndex 2 -DestinationImagePath "$ApplyPath\Sources\boot.wim" -CompressionType max -CheckIntegrity ##Export-WindowsImage -SourceImagePath $ImagePath -SourceIndex 3 -DestinationImagePath "$ApplyPath\Sources\boot.wim" -CompressionType max -CheckIntegrity -Setbootable Write-Host -ForegroundColor Gray "Expanding $ImagePath Index $OSImageIndex to $ApplyPath\Sources\install.wim" $Expand = Export-WindowsImage -SourceImagePath $ImagePath -SourceIndex $OSImageIndex -DestinationImagePath "$ApplyPath\Sources\install.wim" -CheckIntegrity ##Export-WindowsImage -SourceImagePath $ImagePath -SourceIndex 5 -DestinationImagePath "$ApplyPath\Sources\install.wim" -CompressionType max -CheckIntegrity $null = $Expand } #endregion Extract of ESD file to create Setup Content if (!(Test-Path -Path "$MediaLocation\Setup.exe")){ Write-Host -ForegroundColor Red "Setup.exe not found, something went wrong" throw } if (!(Test-Path -Path "$MediaLocation\sources\install.wim")){ Write-Host -ForegroundColor Red "install.wim not found, something went wrong" throw } if (($DriverPack) -and (!($SkipDriverPack))){ Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Getting Driver Pack for IPU Integration" $DriverPackDownloadRequired = $true if (!(Test-Path -Path "C:\Drivers")){New-Item -Path "C:\Drivers" -ItemType Directory -Force | Out-Null} $DriverPackPath = "C:\Drivers\$($DriverPack.FileName)" if (Test-path -path $DriverPackPath){ Write-Host -ForegroundColor Gray "Found previously downloaded DriverPack File, getting MD5 Hash" $MD5Hash = Get-FileHash $DriverPackPath -Algorithm MD5 if ($MD5Hash.Hash -eq $DriverPack.HashMD5){ Write-Host -ForegroundColor Gray "MD5 Match on $DriverPackPath, skipping Download" $DriverPackDownloadRequired = $false } else { Write-Host -ForegroundColor Gray "MD5 Match Failed on $DriverPackPath, removing content" } } IF ($DriverPackDownloadRequired -eq $true){ Write-Host -ForegroundColor Gray "Starting Download to $DriverPackPath, this takes awhile" <# #Get DrivePack Size $req = [System.Net.HttpWebRequest]::Create("$($DriverPack.Url)") $res = $req.GetResponse() (Invoke-WebRequest $ESD.Url -Method Head).Headers.'Content-Length' $SizeMB = $([Math]::Round($res.ContentLength /1000000)) Write-Host "Total Size: $SizeMB MB" #> #Clear Out any Previous Attempts $ExistingBitsJob = Get-BitsTransfer -Name "$($DriverPack.FileName)" -AllUsers -ErrorAction SilentlyContinue If ($ExistingBitsJob) { Remove-BitsTransfer -BitsJob $ExistingBitsJob } #Start Download using BITS $BitsJob = Start-BitsTransfer -Source $DriverPack.Url -Destination $DriverPackPath -DisplayName "$($DriverPack.FileName)" -Description "Driver Pack Download" -RetryInterval 60 If ($BitsJob.JobState -eq "Error"){ write-Host "BITS tranfer failed: $($BitsJob.ErrorDescription)" } } #Expand Driver Pack if (Test-path -path $DriverPackPath){ Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Expanding DriverPack for Upgrade Media" Expand-StagedDriverPack $DriverPackFile = Get-ChildItem -Path $DriverPackPath -Filter $DriverPack.FileName $DriverPackExpandPath = Join-Path $DriverPackFile.Directory $DriverPackFile.BaseName if (Test-Path -Path $DriverPackExpandPath){ } } } Write-Host -ForegroundColor DarkGray "=========================================================================" Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Triggering Windows Upgrade Setup" #============================================================================ #region Creating Arguments based on Parameters #============================================================================ #Driver Integration - Adds .inf-style drivers to the new Windows 10 installation. if ($DriverPack){ if ($DriverPackPath){ if (Test-path -path $DriverPackPath){ $driverarg = "/InstallDrivers $DriverPackExpandPath" } } } else { $DriverArg = "" } #Run Silently - This will suppress any Windows Setup user experience including the rollback user experience. if ($Silent){ $SilentArg = "/quiet" } else{ $SilentArg = "" } #Dynamic Updates - Specifies whether Windows Setup will perform Dynamic Update operations (search, download, and install updates). if ($DynamicUpdate){ $DynamicUpdateArg = "/DynamicUpdate Enable" } else{ $DynamicUpdateArg = "/DynamicUpdate Disable" } #Diagnostic Prompt - Specifies that the Command Prompt is available during Windows Setup. if ($DiagnosticPrompt){ $DiagnosticPromptArg = "/diagnosticprompt enable" } else{ $DiagnosticPromptArg = "" } $ParamStartProcess = @{ FilePath = "$MediaLocation\Setup.exe" ArgumentList = "/Auto Upgrade $DynamicUpdateArg /EULA accept $DriverArg /Priority High $SilentArg $DiagnosticPromptArg" } Write-Host -ForegroundColor Cyan "Setup Path: " -NoNewline Write-Host -ForegroundColor Green $ParamStartProcess.FilePath Write-Host -ForegroundColor Cyan "Arguments: " -NoNewline Write-Host -ForegroundColor Green $ParamStartProcess.ArgumentList #endregion Creating Arguments based on Parameters Start-Process @ParamStartProcess } |