3 Replies Latest reply on Jan 7, 2019 1:40 AM by LucD

    export output to text file

    vin01 Hot Shot

      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 8) -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 8) -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
      
      Regards
      Vineeth.K
        • 1. Re: export output to text file
          LucD Guru
          User ModeratorsvExpertCommunity Warriors

          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

           

          Write-Host "Hello World!"

           

          Now you can run this and capture the output (in C:\Temp\log.txt) with

           

          $pinfo = New-Object System.Diagnostics.ProcessStartInfo

           

          $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: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz
          • 2. Re: export output to text file
            vin01 Hot Shot

            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:

             

            Regards
            Vineeth.K
            • 3. Re: export output to text file
              LucD Guru
              vExpertUser ModeratorsCommunity Warriors

              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-Host "Hello World 1"

               

              Write-Output  "Hello World 2"

               

              Now you can run the script with

               

               

              C:\Scripts\test2.ps1 > C:\Temp\log.txt

               

              And the log file will contain
              Hello World 2
              Blog: http://lucd.info | Twitter: @LucD22 | PowerCLI Reference co-author: http://tinyurl.com/hkn4glz