2017-02-10 156 views
0

我有一個是我需要改變PowerShell腳本以這樣一種方式,它運行的定義如下執行SQL腳本值

<?xml version="1.0"?> 
<Scripts> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "PreDeployment_265015_Add_column_TotalAmount.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "2" sql = "PreDeployment_265375_Add_column_IsPassFloorViolaton.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "3" sql = "PreDeployment_265915_Add_Columns_InferredMemberSource.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "Predeployment_266364_AddPSOKeyAndOffsrpingDirectorCount.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "PreDeployment_267185_DropTheOLdRelationshiphistoryTable.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "PreDeployment_268731_Add_Column_TaxExemptStatus_to_DimOrder.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "AM_QA_Contacts.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "QA_Intelligence_AM.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_Audit_Local" Sequence = "1" sql = "AuditScripts.sql"/> 
    <Script Server = ".\" DBName = "Intelligence_FO_Local"  Sequence = "1" sql = "AuditScripts.sql"/> 
</Scripts>  

的XML配置文件所有在XML中提到的具有序列1的sql文件,然後運行所有具有序列2的文件等等。因此,序列2腳本只能在序列1完成後運行。目前,以下腳本只執行了序列1.

[xml]$xml = [xml] (Get-Content -Path $configfile) 
    $Scripts= $xml.SelectNodes("/Scripts/Script") 

    foreach ($Script in $Scripts | where {$_.Sequence -eq "1"}) { 
     $sqlfilename = $Script.getAttribute("sql") 
     $Server = $Script.getAttribute("Server") 
     $DBName = $Script.getAttribute("DBName") 
     $filename = $sqlfilename.Replace(".sql", "") 
     $ps1 = $location + "\" + $sqlfilename.Trim() 
     $ErrorOutputFile = "Error_output_{0}_{1}.txt" -f $filename.Trim(), $OutputDate 


     If (Test-Path -path $ps1) { 
      add-content $logfile "- Started: $ps1 " 
      $commandLine = "Invoke-Sqlcmd -ServerInstance $Server -Database $DBName -InputFile $ps1" 
      Start-Process "powershell.exe" -ArgumentList $commandLine -RedirectStandardError "$Outputlocation\$ErrorOutputFile" #-ErrorAction silentlycontinue 
      add-content $logfile "----------------------------------------" 
      $i++;   
     } 
     Else { 
      add-content $logfile "- File not found: $ps1 " 
      add-content $logfile "----------------------------------------" 
      $x++;      
     }  
    } 

回答

1

嘗試這樣的事:

$configfile="C:\temp\config.xml" 
$logfile="C:\temp\Log.txt" 

[xml]$xml = [xml] (Get-Content -Path $configfile) 

$xml.SelectNodes("/Scripts/Script") | sort Sequence | foreach { 

     $sqlfilename = $_.Sql.Trim() 
     $ps1 = "$location\$sqlfilename" 

     if (!(Test-Path -path $ps1)) 
     { 
      add-content $logfile "- File not found: $ps1 " 
      add-content $logfile "----------------------------------------" 
      $x++ 
      continue 
     } 

     $filename = $sqlfilename.Replace(".sql", "").Trim() 
     $ErrorOutputFile = "Error_output_{0}_{1}.txt" -f $filename, $OutputDate 

     add-content $logfile "- Started: $ps1 " 
     $commandLine = "Invoke-Sqlcmd -ServerInstance {0} -Database {1} -InputFile {2}" -f $_.Server, $_.DBName, $ps1 
     Start-Process "powershell.exe" -ArgumentList $commandLine -RedirectStandardError "$Outputlocation\$ErrorOutputFile" #-ErrorAction silentlycontinue 
     add-content $logfile "----------------------------------------" 
     $i++; 
} 

說明:

我已經通過序列排序和刪除where子句。 我也沒有義務重組,也只是優化

+0

謝謝Esperento57。排序工作正常,但有沒有原因,你改變了if-else邏輯?在你的情況下,一旦文件沒有找到,它不會繼續到下一個腳本。 – Phani

+0

只是在表現上更好,繼續總是說繼續循環,而不是modidy scripy comportement – Esperento57