2015-03-13 77 views
1

因此,我正在關注互聯網上的一個非常直接的演示,以更新我的SQL連接字符串中的data-source屬性。不過,此行最初拋出下面的錯誤使用Powershell更新多個連接字符串數據源

$doc = (gc $file) -as [xml] 

GC:找不到路徑 'C:\ WINDOWS \ SYSTEM32 \ LVOAGT.exe.config',因爲它不存在。

由於我全新到PowerShell的我刪除了gc和錯誤走了......不過現在$doc變量爲空白。任何想法如何抓住一個配置文件,並使用下面的方法來更新我的連接字符串的data source部分?

#environment variables 
$env = "DEV"      #This will need to be changed from DEV/INT/QUA/PRD 
$oldServer = "QUASQ03"   #This will need to be changed from DEV/INT/QUA/PRD 

#file and folder variables 
$directory = "D:\AMS" 
$folders = @("AgentsMonetToDss") 

#new database value 
$newValue = "$env-AgentResources-AMS-SQL.CORP" 

#pull config file and insert new database connection 
foreach($folder in $folders) 
{ 
    Write-Host "Updating app.config for $folder" -ForegroundColor Yellow 
    $dir = Get-ChildItem $directory\$folder -Recurse 
    $config = $dir | where {$_.extension -eq ".config"} 

    foreach($file in $config) 
    { 
     $doc = (gc $file) -as [xml] 
     $root = $doc.get_DocumentElement(); 
     $newCon = $root.connectionStrings.add.connectionString.Replace("data source=$oldServer\sql08a", "data source=$newValue\sql08a") 
     $root.connectionStrings.add.connectionString = $newCon 
     $doc.Save($file) 
    } 
} 

編輯

這裏是什麼包含在$file變量內foreach循環的第一次迭代是截圖。在彈出的信息是準確的(文件名,目錄)

enter image description here

第二個編輯

所以下面的下面的代碼將更新連接字符串。然而這一行給出了下面的錯誤。

$root.connectionStrings.add.connectionString = $newCon 

酒店 '的connectionString' 不能在該物體上找到。驗證該屬性是否存在並可以設置。

$doc = [xml](Get-Content $file.FullName) 
    $root = $doc.get_DocumentElement(); 
    [string]$newCon = $root.connectionStrings.add.connectionString.Replace($oldServer, $newValue) 
    $root.connectionStrings.add.connectionString = $newCon 
    $doc.Save($file.FullName) 

第三編輯

'connectionString' cannot be found on this object似乎是因爲我們在<connectionStrings>節點的多個連接字符串錯誤。如果我從配置中刪除了一個連接字符串,那麼腳本運行良好。所以我想問題是如何使用PowerShell更新MULTIPLE連接字符串?這個問題似乎是下面的這些行

$newCon = $root.connectionStrings.add.connectionString.Replace($oldServer, $newValue) 
$root.connectionStrings.add.connectionString = $newCon 

第一行將擦洗兩個連接字符串,並根據請求替換值。但是,由於我在$newCon中只有一個很長的字符串,並且我試圖添加到$rootconnectionString屬性中,所以發生衝突。

+0

它不應該從'Windows \ system32'中拉出來。更新了帖子。 – NealR 2015-03-13 18:20:13

+0

我已經在'$ directory \ $ folder'上調用了'Get-ChildItem'。該部分正在做它意味着要做的事情(我可以​​看到該目錄中的所有文件)。 – NealR 2015-03-13 18:25:17

+0

@ user2864740用調試會話信息更新了帖子 – NealR 2015-03-13 18:31:58

回答

0

這是醜陋的,但它的工作...

我最終不得不存儲在一個變量整個連接字符串,並運行對connectionString屬性-contains檢查。如果任何人有一個非常有效的解決方案,將留下這篇文章一段時間。

#generated config connection strings 
Write-Host "Updating config ConnectionString nodes" -ForegroundColor Green 
foreach($folder in $folders) 
{ 
    Write-Host "Updating config for $folder" -ForegroundColor Yellow 
    $dir = Get-ChildItem $directory\$folder -Recurse 
    $config = $dir | where {$_.extension -eq ".config"} 

    foreach($file in $config) 
    {  
     $doc = [xml](Get-Content $file.FullName) 
     $doc.configuration.connectionStrings.add |%{ 
      if($_.connectionString.ToLower() -contains $oldGenConn.ToLower()){ 
       $_.connectionString = $newGenConn 
      }    
     } 
     $doc.Save($file.FullName) 
    } 
}