Error while running the PS script at first time

Hello,

 

When i execute below script in PS command line, first time this script will not execute and gives error.

Then in same command line window if I run the same script second time it will execute.

Can you please tell what could i need to add for running first time it self?

 

****************************************************

Param(

[String]$CentralServer 

)

 

Function Get-RSSQLInstance {  

 

    [cmdletbinding()] 

    Param (

        [parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]

        [Alias('__Server','DNSHostName','IPAddress')]

        [string[]]$ComputerName

 

    ) 

 

    Process {

        ForEach ($Computer in $Computername) {

            $Computer = $computer -replace '(.*?)\..+','$1'

            Write-Verbose ("Checking {0}" -f $Computer)

            Try { 

                $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer) 

                $baseKeys = "SOFTWARE\\Microsoft\\Microsoft SQL Server",

                "SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SQL Server"

                If ($reg.OpenSubKey($basekeys[0])) {

                    $regPath = $basekeys[0]

                } ElseIf ($reg.OpenSubKey($basekeys[1])) {

                    $regPath = $basekeys[1]

                } Else {

$q= "No RS Component installed on " +$Computer

write-output $q >> $filenamecompliance

                    Continue

                }

                $regKey= $reg.OpenSubKey("$regPath")

                If ($regKey.GetSubKeyNames() -contains "Instance Names") {

                    $regKey= $reg.OpenSubKey("$regpath\\Instance Names\\RS" ) 

                    $instances = @($regkey.GetValueNames())

                } ElseIf ($regKey.GetValueNames() -contains 'InstalledInstances') {

                    $isCluster = $False

                    $instances = $regKey.GetValue('InstalledInstances')

                } Else {

                    Continue

                }

                If ($instances.count -gt 0) { 

                    ForEach ($instance in $instances) {

                        $nodes = New-Object System.Collections.Arraylist

                        $clusterName = $Null

                        $isCluster = $False

                        $instanceValue = $regKey.GetValue($instance)

                        $instanceReg = $reg.OpenSubKey("$regpath\\$instanceValue")

                        If ($instanceReg.GetSubKeyNames() -contains "Cluster") {

                            $isCluster = $True

                            $instanceRegCluster = $instanceReg.OpenSubKey('Cluster')

                            $clusterName = $instanceRegCluster.GetValue('ClusterName')

                            $clusterReg = $reg.OpenSubKey("Cluster\\Nodes")                            

                            $clusterReg.GetSubKeyNames() | ForEach {

                                $null = $nodes.Add($clusterReg.OpenSubKey($_).GetValue('NodeName'))

                            }

                        }

                        $instanceRegSetup = $instanceReg.OpenSubKey("Setup")

                        Try {

                            $edition = $instanceRegSetup.GetValue('Edition')

                        } Catch {

                            $edition = $Null

                        }

                        Try {

                            $ErrorActionPreference = 'Stop'

                            #Get from filename to determine version

                            $servicesReg = $reg.OpenSubKey("SYSTEM\\CurrentControlSet\\Services")

                            $serviceKey = $servicesReg.GetSubKeyNames() | Where {

                                $_ -match "$instance"

                            } | Select -First 1

                            $service = $servicesReg.OpenSubKey($serviceKey).GetValue('ImagePath')

                            $file = $service -replace '^.*(\w:\\.*\\sqlservr.exe).*','$1'

                            $version = (Get-Item ("\\$Computer\$($file -replace ":","$")")).VersionInfo.ProductVersion

                        } Catch {

                            #Use potentially less accurate version from registry

                            $Version = $instanceRegSetup.GetValue('Version')

                              } Finally {

                            $ErrorActionPreference = 'Continue'

                        }

                        New-Object PSObject -Property @{

 

                            InstalledInstances = {

                                If ($Instance -eq 'MSSQLSERVER') {

                                    "$($Computer)"

                                } Else {

                                    "$($Computer)\$($instance)"

                                }

                            }.InvokeReturnAsIs()

 

                        } | export-csv -NoTypeInformation -path .\rsinstancelist.csv -Append -Force

 

                         }

                }

            } Catch { 

                Write-Warning ("{0}: {1}" -f $Computer,$_.Exception.Message) 

                 }  

        }   

    }

}

 

#-------------------------------------------------------------------------------------------------

# FUNCTIONS : Get all the SSRS instance details by calling the function Get-RSSQLInstance 

#-------------------------------------------------------------------------------------------------

Function Get-instance{

 

Invoke-Sqlcmd -Query "SELECT Server_name FROM TOOLS.dbo.v_ReportingServices_instances" -ServerInstance $CentralServer | export-csv -NoTypeInformation -path ".\rsserverlist.csv" -Append -Force

 

$FileExists = Test-Path ".\rsserverlist.csv"

If ($FileExists -eq $True){

(Get-Content ".\rsserverlist.csv" | foreach {$_ -replace '"'} | Set-Content ".\rsserverlist.txt") 

Remove-Item ".\rsserverlist.csv"

$cnt=(get-content ".\rsserverlist.txt").Count

$cnt=($cnt-1)

gc ".\rsserverlist.txt" | select-object -last $cnt | set-content ".\rsserverlist.txt"

}

 

$serverarray = get-content ".\rsserverlist.txt"

 

foreach($s in $serverarray){

 

 

Get-RSSQLInstance $s

}

 

#-------------------------------------------------------------------------------------------------

# FUNCTIONS : Clean up RS insatnce lsit file and bulk insert into table

#-------------------------------------------------------------------------------------------------

Function Get-instances {

 

$FileExists = Test-Path ".\rsinstancelist.txt"

If ($FileExists -eq $True){

Remove-Item ".\rsinstancelist.txt" }

 

$FileExists = Test-Path ".\rsinstancelist.csv"

If ($FileExists -eq $True){

(Get-Content ".\rsinstancelist.csv" | foreach {$_ -replace '"'} | Set-Content ".\rsinstancelist.txt")

Remove-Item ".\rsinstancelist.csv"

$cntrs=(get-content ".\rsinstancelist.txt").Count

$cntrs=($cntrs-1)

gc ".\rsinstancelist.txt" | select-object -last $cntrs | set-content ".\rsinstancelist.txt"

 

}

 

}

Get-instance

Get-instances