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