With this script I can deploy vms with the desired roles inside the guest OS. I'm thinking move all the displayed output while executing the script into a logfile(txt) and save it in a location.
Is it possible to add all the below script into a scriptblock and save the output into a variable and at the end we can export the data in the variable into txt file.
Write-Host "Enter the required Information when Prompted" -ForegroundColor Yellow
Add-Type -AssemblyName Microsoft.VisualBasic
$vcenter = [Microsoft.VisualBasic.Interaction]::InputBox("Enter vcenter Name")
$vcenterCred= Get-Credential -Message "Enter Credentials to Connect vCenter"
Write-Host 'All Required Inputs Received Script is starting VMs Deployment' -ForegroundColor Yellow
Write-Host "Connecting to vCenter $vcenter"
Try {
Connect-VIServer $vcenter -Credential $vcenterCred -ErrorAction Stop
}
Catch [VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.ViServerConnectionException] {
$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop
$wshell.Popup("Incorrect vCenter",0,"vCenter Connection",16) | Out-Null
return
}
catch {
$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop
$wshell.Popup("Incorrect vCenter credentials",0,"vCenter Connection",16) | Out-Null
return
}
$inputfile=Import-Csv -Path 'C:\LIBPROJECT\InputFile\answerfilecsv.csv' -UseCulture
$wusclientrolesetup= $inputfile |?{$_.serverroles -contains 'WUS'} -ErrorAction SilentlyContinue
$wsusclientserver=$wusclientrolesetup.VMName + '.' + $wusclientrolesetup.Sitename
$ntpclientrolesetup=$inputfile |?{$_.serverroles -contains 'NTP'} -ErrorAction SilentlyContinue
$ntpserver=$ntpclientrolesetup.VMName +'.'+$ntpclientrolesetup.Sitename
$deploytask=@()
if($dnsserver=$inputfile|?{$_.serverroles -contains 'DNS'}){
$vmhost= (Get-Cluster $dnsserver.Cluster |Get-VMHost |Get-Random|select).name
$dst= (Get-VMHost $vmhost |Get-Datastore 'LIBDatastore').Name
#| Sort-Object -Property FreespaceGB -Descending:$deploytask1rue | Select-Object -First 1
$vmnetwork= (Get-VirtualPortGroup -VMHost $vmhost |?{$_.VLanID -eq $dnsserver.vLANID}).Name
$Chars = [Char[]]"abcdefghijklmnopqrstuvwxyz"
$RandomNameWindows = ($Chars | Get-Random -Count 😎 -join ""
$deploytask1empwindowsSpec = New-OSCustomizationSpec -OSType Windows -Name $RandomNameWindows -FullName $dnsserver.UserName -AdminPassword $dnsserver.Password -AutoLogonCount 1 -Workgroup 'NCR' -OrgName 'NCR' -NamingScheme vm -ChangeSid -Type NonPersistent
$networkspecProperties = @{OSCustomizationNicMapping= Get-OSCustomizationNicMapping -OSCustomizationSpec $RandomNameWindows}
$networkspecProperties.IpMode = "UseStaticIP"
$networkspecProperties.IpAddress = $dnsserver.IP
$networkspecProperties.SubNetMask = $dnsserver.Subnet
$networkspecProperties.DefaultGateway = $dnsserver.Gateway
$networkspecProperties.dns = $dnsserver.DNS1,$dnsserver.DNS2
$networkspecProperties.Position = '1'
Set-OSCustomizationNicMapping @networkspecProperties | Out-Null
$deploytask+=New-VM -Name $dnsserver.VMName -Template $dnsserver.Template -Host $vmhost -Datastore $dst -DiskStorageFormat Thin -OSCustomizationSpec $deploytask1empwindowsSpec -Confirm:$false -RunAsync
while('Running','Queued' -contains $deploytask.State){
Write-Progress -Activity "$($dnsserver.VMName) Creation Status" -Status "0%" -PercentComplete $deploytask.PercentComplete
1..10 | ForEach-Object -Process {
sleep 2
Write-Progress -Activity "$($dnsserver.VMName) Creation Status" -Status "$($_ * 10)%" -PercentComplete ($_ * 10) }
$deploytask = Get-Task -Id $deploytask.Id
Write-Progress -Activity '$dnsserver.VMName Creation is' -Completed
}
Remove-OSCustomizationSpec -OSCustomizationSpec $deploytask1empwindowsSpec -Confirm:$false
Set-VM -VM $dnsserver.VMName -MemoryGB $dnsserver.Memory -NumCpu $dnsserver.vCpu -Confirm:$false
Get-NetworkAdapter $dnsserver.VMName | Set-NetworkAdapter -NetworkName $vmnetwork -Confirm:$false -StartConnected:$true -ErrorAction SilentlyContinue
Start-VM -VM $dnsserver.VMName -Confirm:$false
$now = Get-Date
$eventTypes = Get-VIEvent -Entity $dnsserver.VMName -Start $now -MaxSamples ([int]::MaxValue) | % {$_.GetType().Name}
while ($eventTypes -notcontains 'CustomizationSucceeded' -and
$eventTypes -notcontains 'CustomizationFailed’) {
Start-Sleep -Seconds 5
$eventTypes = Get-VIEvent -Entity $dnsserver.VMName -Start $now -MaxSamples ([int]::MaxValue) | % {$_.GetType().Name}
}
$dnsvm= Get-VM $dnsserver.VMName
while($dnsvm.ExtensionData.Guest.ToolsRunningStatus -eq "guestToolsNotRunning"){
Start-Sleep -Seconds 3
$dnsvm.ExtensionData.UpdateViewData("Guest.ToolsRunningStatus")
}
$dnsserverinstall= @'
Install-WindowsFeature DNS -includeManagementTools
Add-DnsServerPrimaryZone -Name $($dnsserver.Sitename) -ZoneFile $($dnsserver.Sitename)
Add-DnsServerPrimaryZone -NetworkId "$($dnsserver.IP.Split('.')[0..2] -join '.').0/24" -ZoneFile $($dnsserver.Sitename)
'@
$dnsserverinstallSub = $ExecutionContext.InvokeCommand.ExpandString($dnsserverinstall)
$guestoperationstatus= Get-VM $dnsserver.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $dnsserver.VMName -GuestUser $dnsserver.UserName -GuestPassword $dnsserver.Password -ScriptType Powershell -ScriptText $dnsserverinstallSub
$defaultwindowssettings= @'
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUServer" -Value "https://$($wsusclientserver):80"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUStatusServer" -Value "https://$($wsusclientserver):80"
Get-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallDay" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallTime" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "UseWUServer" -Value "1"
#NTPClientSetup
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 $ntpserver
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 1 $ntpserver
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer "$ntpserver,0x8"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
Set-ItemProperty . Type "NTP"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config\
Set-ItemProperty . AnnounceFlags "5"
Pop-Location
Stop-Service w32time
Start-Service w32time
'@
$defaultwindowssettingssub = $ExecutionContext.InvokeCommand.ExpandString($defaultwindowssettings)
$guestoperationstatus= Get-VM $dnsserver.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $dnsserver.VMName -GuestUser $dnsserver.UserName -GuestPassword $dnsserver.Password -ScriptType Powershell -ScriptText $defaultwindowssettingssub
$addRecord = @'
Add-DnsServerResourceRecordA -Name $($dnsrecords.VMName) -IPv4Address $($dnsrecords.IP) -ZoneName $($dnsrecords.Sitename) -CreatePtr
'@
foreach($dnsrecords in $inputfile){
$addRecordSub = $ExecutionContext.InvokeCommand.ExpandString($addRecord)
$guestoperationstatus= Get-VM $dnsserver.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $dnsserver.VMName -GuestUser $dnsserver.UserName -GuestPassword $dnsserver.Password -ScriptType Powershell -ScriptText $addRecordSub
}
$featureName = 'DNS'
$code = @'
Get-WindowsFeature -Name $featureName | Select -ExpandProperty Installed
'@
$codeSub = $ExecutionContext.InvokeCommand.ExpandString($code)
$result = Invoke-VMScript -VM $dnsserver.VMName -GuestUser $dnsserver.UserName -GuestPassword $dnsserver.Password -ScriptType Powershell -ScriptText $codeSub
if($result.ScriptOutput -match 'True'){
Write-Host "Feature $featureName installed" -ForegroundColor Yellow
}
else{
Write-Host "Feature $featureName installation failed" -ForegroundColor Yellow
}
}
foreach($vmsautodeploy in $inputfile|?{$_.serverroles -notcontains 'DNS'}){
$deploytask1=@()
$vmhost= (Get-Cluster $dnsserver.Cluster |Get-VMHost |Get-Random|select).name
$dst= (Get-VMHost $vmhost |Get-Datastore 'LIBDatastore').Name
#| Sort-Object -Property FreespaceGB -Descending:$deploytask1rue | Select-Object -First 1
$vmnetwork= (Get-VirtualPortGroup -VMHost $vmhost |?{$_.VLanID -eq $dnsserver.vLANID}).Name
if($vmsautodeploy.GuestOSType -eq 'windows'){
$Chars = [Char[]]"abcdefghijklmnopqrstuvwxyz"
$RandomNameWindows = ($Chars | Get-Random -Count 😎 -join ""
$deploytask1empwindowsSpec = New-OSCustomizationSpec -OSType Windows -Name $RandomNameWindows -FullName $vmsautodeploy.UserName -AdminPassword $vmsautodeploy.Password -AutoLogonCount 1 -Workgroup 'NCR' -OrgName 'NCR' -NamingScheme vm -ChangeSid -Type NonPersistent
$networkspecProperties = @{OSCustomizationNicMapping= Get-OSCustomizationNicMapping -OSCustomizationSpec $RandomNameWindows }
$networkspecProperties.IpMode = "UseStaticIP"
$networkspecProperties.IpAddress = $vmsautodeploy.IP
$networkspecProperties.SubNetMask = $vmsautodeploy.Subnet
$networkspecProperties.DefaultGateway = $vmsautodeploy.Gateway
$networkspecProperties.dns = $dnsserver.DNS1,$dnsserver.DNS2
$networkspecProperties.Position = '1'
Set-OSCustomizationNicMapping @networkspecProperties | Out-Null
$deploytask1+=New-VM -Name $vmsautodeploy.VMName -Template $vmsautodeploy.Template -Host $vmhost -Datastore $dst -DiskStorageFormat Thin -OSCustomizationSpec $deploytask1empwindowsSpec -Confirm:$false -RunAsync
while('Running','Queued' -contains $deploytask1.State){
Write-Progress -Activity "$($vmsautodeploy.VMName) Creation Status" -Status "0%" -PercentComplete $deploytask1.PercentComplete
1..10 | ForEach-Object -Process {
sleep 2
Write-Progress -Activity "$($vmsautodeploy.VMName) Creation Status" -Status "$($_ * 10)%" -PercentComplete ($_ * 10) }
$deploytask1 = Get-Task -Id $deploytask1.Id
Write-Progress -Activity "$($vmsautodeploy.VMName) Creation is" -Completed
}
Remove-OSCustomizationSpec -OSCustomizationSpec $deploytask1empwindowsSpec -Confirm:$false
Start-Sleep -Seconds 5
Set-VM -VM $vmsautodeploy.VMName -MemoryGB $vmsautodeploy.Memory -NumCpu $vmsautodeploy.vCpu -Confirm:$false
Get-NetworkAdapter $vmsautodeploy.VMName | Set-NetworkAdapter -NetworkName $vmnetwork -Confirm:$false -StartConnected:$true -ErrorAction SilentlyContinue
Start-VM -VM $vmsautodeploy.VMName -Confirm:$false
$now = Get-Date
$eventTypes = Get-VIEvent -Entity $vmsautodeploy.VMName -Start $now -MaxSamples ([int]::MaxValue) | % {$_.GetType().Name}
while ($eventTypes -notcontains 'CustomizationSucceeded' -and
$eventTypes -notcontains 'CustomizationFailed’) {
Start-Sleep -Seconds 5
$eventTypes = Get-VIEvent -Entity $vmsautodeploy.VMName -Start $now -MaxSamples ([int]::MaxValue) | % {$_.GetType().Name}
}
$vmsautodeploytoolstatus= Get-VM $vmsautodeploy.VMName
while($vmsautodeploytoolstatus.ExtensionData.Guest.ToolsRunningStatus -eq "guestToolsNotRunning"){
Start-Sleep -Seconds 5
$vmsautodeploytoolstatus.ExtensionData.UpdateViewData("Guest.ToolsRunningStatus")
}
if($vmsautodeploy.ServerRoles -eq 'WUS'){
$wusfeatureinstall=@'
Install-WindowsFeature -Name UpdateServices, UpdateServices-WidDB, UpdateServices-Services, UpdateServices-RSAT, UpdateServices-API, UpdateServices-UI
'@
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $wusfeatureinstall
$defaultwindowssettings= @'
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUServer" -Value "https://$($wsusclientserver):80"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUStatusServer" -Value "https://$($wsusclientserver):80"
Get-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallDay" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallTime" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "UseWUServer" -Value "1"
#NTPClientSetup
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 $ntpserver
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 1 $ntpserver
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer "$ntpserver,0x8"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
Set-ItemProperty . Type "NTP"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config\
Set-ItemProperty . AnnounceFlags "5"
Pop-Location
Stop-Service w32time
Start-Service w32time
'@
$defaultwindowssettingssub = $ExecutionContext.InvokeCommand.ExpandString($defaultwindowssettings)
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $defaultwindowssettingssub
$wsusdownstreamserversetup= @'
New-Item -Path $env:SystemDrive\WSUS -ItemType Directory -Force
sl "C:\Program Files\Update Services\Tools"
.\wsusutil.exe postinstall CONTENT_DIR=C:\WSUS
`$wsus = Get-WSUSServer
`$wsusConfig =`$wsus.GetConfiguration()
`$wsusConfig.SyncFromMicrosoftUpdate=`$false
`$wsusConfig.UpstreamWsusServerName='$($vmsautodeploy.UpStreamWUSServer)'
`$wsusConfig.UpstreamWsusServerPortNumber='$($vmsautodeploy.UpStreamWUSServerPort)'
`$wsusConfig.IsReplicaServer=`$True
`$wsusConfig.TargetingMode="Client"
`$wsusConfig.Save()
`$wsusSub = `$wsus.GetSubscription()
`$wsusSub.SynchronizeAutomatically=`$True
`$wsusSub.SynchronizeAutomaticallyTimeOfDay="12:00:00"
`$wsusSub.NumberOfSynchronizationsPerDay="1"
`$wsusSub.Save()
`$wsusSub.StartSynchronization()
'@
$wsusdownstreamserversetupSub = $ExecutionContext.InvokeCommand.ExpandString($wsusdownstreamserversetup)
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $wsusdownstreamserversetupSub
$featureName = 'UpdateServices'
$code = @'
Get-WindowsFeature -Name $featureName | Select -ExpandProperty Installed
'@
$codeSub = $ExecutionContext.InvokeCommand.ExpandString($code)
$result = Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $codeSub
if($result.ScriptOutput -match 'True'){
Write-Host "Feature $featureName installed" -ForegroundColor Yellow
}
else{
Write-Host "Feature $featureName installation failed" -ForegroundColor Yellow
}
}
elseif($vmsautodeploy.ServerRoles -eq 'NTP'){
$ntpautoconfigwindows=@'
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 "time00.sweng.ncr.com"
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 1 "time01.sweng.ncr.com"
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer "time00.sweng.ncr.com,0x8"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
Set-ItemProperty . Type "NTP"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config\
Set-ItemProperty . AnnounceFlags "5"
Pop-Location
Stop-Service w32time
Start-Service w32time
'@
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $ntpautoconfigwindows
$defaultwindowssettings= @'
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUServer" -Value "https://$($wsusclientserver):80"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUStatusServer" -Value "https://$($wsusclientserver):80"
Get-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallDay" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallTime" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "UseWUServer" -Value "1"
#NTPClientSetup
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 $ntpserver
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 1 $ntpserver
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer "$ntpserver,0x8"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
Set-ItemProperty . Type "NTP"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config\
Set-ItemProperty . AnnounceFlags "5"
Pop-Location
Stop-Service w32time
Start-Service w32time
'@
$defaultwindowssettingssub = $ExecutionContext.InvokeCommand.ExpandString($defaultwindowssettings)
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $defaultwindowssettingssub
}
elseif($vmsautodeploy.ServerRoles -eq 'FileServer'){
$fileserverfeature=@'
Install-WindowsFeature -Name FS-Resource-Manager, RSAT-FSRM-Mgmt
New-FsrmQuotaTemplate -Name '25GB Volume Usage Limit' -Description 'limit usage to 25GB' -Size 25GB
New-FsrmQuotaTemplate -Name '50GB Volume Usage Limit' -Description 'limit usage to 50GB' -Size 50GB
New-FsrmQuotaTemplate -Name '100GB Volume Usage Limit' -Description 'limit usage to 100GB' -Size 100GB
'@
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $fileserverfeature
$defaultwindowssettings= @'
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUServer" -Value "https://$($wsusclientserver):80"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUStatusServer" -Value "https://$($wsusclientserver):80"
Get-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallDay" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallTime" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "UseWUServer" -Value "1"
#NTPClientSetup
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 $ntpserver
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 1 $ntpserver
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer "$ntpserver,0x8"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
Set-ItemProperty . Type "NTP"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config\
Set-ItemProperty . AnnounceFlags "5"
Pop-Location
Stop-Service w32time
Start-Service w32time
'@
$defaultwindowssettingssub = $ExecutionContext.InvokeCommand.ExpandString($defaultwindowssettings)
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $defaultwindowssettingssub
$featureName = 'FS-Resource-Manager'
$code = @'
Get-WindowsFeature -Name $featureName | Select -ExpandProperty Installed
'@
$codeSub = $ExecutionContext.InvokeCommand.ExpandString($code)
$result = Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $codeSub
if($result.ScriptOutput -match 'True'){
Write-Host "Feature $featureName installed" -ForegroundColor Yellow
}
else{
Write-Host "Feature $featureName installation failed" -ForegroundColor Yellow
}
}
else{
$defaultwindowssettings= @'
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUServer" -Value "https://$($wsusclientserver):80"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "WUStatusServer" -Value "https://$($wsusclientserver):80"
Get-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallDay" -Value "0"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallTime" -Value "3"
Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "UseWUServer" -Value "1"
#NTPClientSetup
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 $ntpserver
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 1 $ntpserver
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer "$ntpserver,0x8"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
Set-ItemProperty . Type "NTP"
Set-Location HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config\
Set-ItemProperty . AnnounceFlags "5"
Pop-Location
Stop-Service w32time
Start-Service w32time
'@
$defaultwindowssettingssub = $ExecutionContext.InvokeCommand.ExpandString($defaultwindowssettings)
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptType Powershell -ScriptText $defaultwindowssettingssub
}
}
else {
$Chars = [Char[]]"abcdefghijklmnopqrstuvwxyz"
$RandomNameLinux = ($Chars | Get-Random -Count 9) -join ""
$deploytask1emplinuxSpec = New-OSCustomizationSpec -OSType Linux -Name $RandomNameLinux -Domain 'NCR' -Type NonPersistent -ErrorAction SilentlyContinue
$networkspecProperties = @{OSCustomizationNicMapping= Get-OSCustomizationNicMapping -OSCustomizationSpec $RandomNameLinux }
$networkspecProperties.IpMode = "UseStaticIP"
$networkspecProperties.IpAddress = $vmsautodeploy.IP
$networkspecProperties.SubNetMask = $vmsautodeploy.Subnet
$networkspecProperties.DefaultGateway = $vmsautodeploy.Gateway
#$networkspecProperties.dns = $dnsserver.DNS1,$dnsserver.DNS2
$networkspecProperties.Position = '1'
Set-OSCustomizationNicMapping @networkspecProperties | Out-Null
$deploytask1+=New-VM -Name $vmsautodeploy.VMName -Template $vmsautodeploy.Template -Host $vmhost -Datastore $dst -DiskStorageFormat Thin -OSCustomizationSpec $deploytask1emplinuxSpec -Confirm:$false -RunAsync
while('Running','Queued' -contains $deploytask1.State){
Write-Progress -Activity "$($vmsautodeploy.VMName) Creation Status" -Status "0%" -PercentComplete $deploytask1.PercentComplete
1..10 | ForEach-Object -Process {
sleep 2
Write-Progress -Activity "$($vmsautodeploy.VMName) Creation Status" -Status "$($_ * 10)%" -PercentComplete ($_ * 10) }
$deploytask1 = Get-Task -Id $deploytask1.Id
Write-Progress -Activity "$($vmsautodeploy.VMName) Creation is" -Completed
}
Remove-OSCustomizationSpec -OSCustomizationSpec $deploytask1emplinuxSpec -Confirm:$false
Start-Sleep -Seconds 3
Set-VM -VM $vmsautodeploy.VMName -MemoryGB $vmsautodeploy.Memory -NumCpu $vmsautodeploy.vCpu -Confirm:$false
Get-NetworkAdapter $vmsautodeploy.VMName | Set-NetworkAdapter -NetworkName $vmnetwork -Confirm:$false -StartConnected:$true -ErrorAction SilentlyContinue
Start-VM -VM $vmsautodeploy.VMName -Confirm:$false
$now = Get-Date
$eventTypes = Get-VIEvent -Entity $vmsautodeploy.VMName -Start $now -MaxSamples ([int]::MaxValue) | % {$_.GetType().Name}
while ($eventTypes -notcontains 'CustomizationSucceeded' -and
$eventTypes -notcontains 'CustomizationFailed’) {
Start-Sleep -Seconds 5
$eventTypes = Get-VIEvent -Entity $vmsautodeploy.VMName -Start $now -MaxSamples ([int]::MaxValue) | % {$_.GetType().Name}
}
$vmsautodeploytoolstatus= Get-VM $vmsautodeploy.VMName
while($vmsautodeploytoolstatus.ExtensionData.Guest.ToolsRunningStatus -eq "guestToolsNotRunning"){
Start-Sleep -Seconds 3
$vmsautodeploytoolstatus.ExtensionData.UpdateViewData("Guest.ToolsRunningStatus")
}
if($vmsautodeploy.ServerRoles -eq 'Yum Server'){
$yumserverautoconfiglinux=@'
cd /tmp
rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm
service vsftpd restart
chkconfig vsftpd on
systemctl start vsftpd.service
systemctl enable vsftpd.service
mkdir /tmp1
mkdir /var/ftp/pub/CentOS7.5x64Bit
mount /dev/cdrom /tmp1
cd /tmp1
cp -r /tmp1/* /var/ftp/pub/CentOS7.5x64Bit/
umount /dev/cdrom
'@
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Copy-VMGuestFile -VM $vmsautodeploy.VMName -Source 'C:\Prerequisites\Linux\vsftpd-3.0.2-22.el7.x86_64.rpm' -Destination '/tmp' -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -LocalToGuest
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptText $yumserverautoconfiglinux -ScriptType Bash
#Copy-VMGuestFile -VM $vmsautodeploy.VMName -Source 'C:\Prerequisites\Linux\CentOS7_5x64Bit.zip' -Destination '/var/ftp/pub/' -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -LocalToGuest
}
elseif($vmsautodeploy.ServerRoles -eq 'NTP'){
$ntpautoconfiglinux=@'
'@
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptText $ntpautoconfiglinux -ScriptType Bash
}
else{
$yumserverIP=$inputfile |?{$_.serverroles -eq 'None'}
$defaultlinuxsettings=@'
cd /etc/yum.repos.d/
rm -rf *
cat <<EOF > Cent.repo
[$($yumserverIP.IP)]
comment ="CentOS7_5x64Bit"
baseurl=ftp://$($yumserverIP.IP)/pub/CentOS7_5x64Bit
gpgcheck=0
EOF
'@
$defaultlinuxsettingssub=$ExecutionContext.InvokeCommand.ExpandString($defaultlinuxsettings)
$guestoperationstatus= Get-VM $vmsautodeploy.VMName
while($guestoperationstatus.ExtensionData.Guest.GuestOperationsReady -ne "True"){
Start-Sleep -Seconds 3
$guestoperationstatus.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")
}
Invoke-VMScript -VM $vmsautodeploy.VMName -GuestUser $vmsautodeploy.UserName -GuestPassword $vmsautodeploy.Password -ScriptText $defaultlinuxsettingssub -ScriptType Bash
}
}
}
Write-Host '***VMS were sucessfully deployed***' -ForegroundColor Yellow
Why a script block?
Just place this in a .ps1 file, and then redirect the output of the run.
But since you have been using Write-Host, you will have to start the script via the System.Diagnostics.Process method.
There are other ways, but this one is rather straightforward.
For example, you have the following script named hello.ps1 in folder C:\Scripts
Now you can run this and capture the output (in C:\Temp\log.txt) with
$pinfo.FileName = "powershell.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "C:\Scripts\hello.ps1"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$output = $p.StandardOutput.ReadToEnd()
$output += $p.StandardError.ReadToEnd()
$output | Out-File -FilePath C:\Temp\log.txt
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
When I executed (Write-Host "Hello World!") in a ps1 file it just opens power shell window and from there no progress.
I tried to run a simple authentication to vcenter (.ps1) it asked the required details but the output file shows vcenter name not recognized.
Used ps1 file
Write-Host "Enter the required Information when Prompted" -ForegroundColor Yellow
Add-Type -AssemblyName Microsoft.VisualBasic
$vcenter = [Microsoft.VisualBasic.Interaction]::InputBox("Enter vcenter Name")
$vcenterCred= Get-Credential -Message "Enter Credentials to Connect vCenter"
Write-Host 'All Required Inputs Received Script is starting VMs Deployment' -ForegroundColor Yellow
Write-Host "Connecting to vCenter $vcenter"
Try {
Connect-VIServer $vcenter -Credential $vcenterCred -ErrorAction Stop
}
Catch [VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.ViServerConnectionException] {
$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop
$wshell.Popup("Incorrect vCenter",0,"vCenter Connection",16) | Out-Null
return
}
catch {
$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop
$wshell.Popup("Incorrect vCenter credentials",0,"vCenter Connection",16) | Out-Null
return
}
Get-VM LIBPRO06 |Select Name
Output snap with logfile:
Perhaps an easier solution might be to change all your Write-Host cmdlets with Write-Output.
That output can be redirected.
For example, pleace these 2 lines in a .ps1 file
Write-Output "Hello World 2"
Now you can run the script with
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference