oertey
Goto Top

Connectionstring anpassen (zwischen 2 Zeichen) mit Powershell

Hallo Zusammen,

ich möchte über die Powershell einen Connectionstring anpassen.

Beispiel:
<connection.connection_string>Data Source=SERVER;Initial Catalog=DATENBANK;User Id=NUTZER;Password=PASSWORT;</connection.connection_string>

In diesem Beispiel sollen SERVER,DATENBANK,NUTZER,PASSWORT ersetzt werden, diese können beliebige Werte enthalten.

Hier wollte ich jetzt versuchen in "Source=SERVER;" alles zwischen "=" und ";" auszulesen und mit einer Variable zu ersetzen.

Und zwar hiermit:
$con = Get-Content .\Settings.xml
$con | % { $_.Replace('(?<=Source=).*?(?=;)', '$DBSERVER') } | Set-Content .\Settings.xml

und dann hiermit:
Get-Content .\Settings.xml (replace 'Source=".*?;', 'Source="$DBSERVER"') | Set-Content .\Settings.xml

Fehler beim Analysieren der Befehlszeile (null).
Get-Content : Es wurde kein Positionsparameter gefunden, der das Argument "Keine Dateien ersetzt" akzeptiert.  
In G:\SCRIPTS\HSD\string.ps1:13 Zeichen:8
+ $con = Get-Content .\Settings.xml (replace 'Source=".*?;', 'Data Sour ...  
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Content], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Könnt ihr mir hier weiterhelfen?

Content-Key: 461419

Url: https://administrator.de/contentid/461419

Printed on: April 25, 2024 at 15:04 o'clock

Member: Pjordorf
Pjordorf Jun 12, 2019 at 19:07:12 (UTC)
Goto Top
Hallo,

Zitat von @Oertey:
Get-Content : Es wurde kein Positionsparameter gefunden, der das Argument "Keine Dateien ersetzt" akzeptiert.
In G:\SCRIPTS\HSD\string.ps1:13 Zeichen:8
Schon mal Gelesen und darüber nachgedacht was dir Powershell sagen will? Du hast eine Fehler in dein PS1 Skript eingebaut. Und wenn jemand hier dir den Fehler beheben soll, Poste doch bitte dein Skript.

Gruß,
Peter
Member: Oertey
Oertey Jun 12, 2019 updated at 19:29:11 (UTC)
Goto Top
Dies ist das Script:

$DBSERVER = 12345
########## CONNECTION-STRING SUCHEN UND ERSETZEN ##########
Write-Host ""  
Write-Host -ForegroundColor Blue "########## CONNECTION-STRING SUCHEN UND ERSETZEN ##########"  
Write-Host ""  


#$con = Get-Content .\Settings.xml
#$con | % { $_.Replace('(?<=Source=).*?(?=;)', '$DBSERVER') } | Set-Content .\Settings.xml 

Get-Content .\Settings.xml (replace 'Source=".*?;', 'Source="$DBSERVER"') | Set-Content .\Settings.xml  


EDIT: ich sehe gerade das ich noch eine Variable daraus gemacht hatte:
$con = Get-Content .\Settings.xml (replace 'Source=".*?;', 'Source="$DBSERVER"') | Set-Content .\Settings.xml

Powershell bemängelt das Get-Content, kann es mir aber nicht erklären.
Mitglied: 139920
Solution 139920 Jun 13, 2019 updated at 10:57:20 (UTC)
Goto Top
XML Dateien bearbeitet man grundsätzlich mit einem Parser!
Also lade das XML File auch so das man es effektiv und korrekt mit einem XML-Object bearbeitet:
$db = "NEUE DATENBANK"  
$server = "NEUER SERVER"  
$userID = "Neue User ID"  
$password = "Neues Password"  
$file = "D:\datei.xml"  

$xml = [xml](gc $file)
$node = $xml.SelectSingleNode('//connection.connection_string')  
$node.innerText = $node.innerText-replace '(?<=Data Source\s*=)[^;]+',$server  
$node.innerText = $node.innerText -replace '(?<=Initial Catalog\s*=)[^;]+',$db  
$node.innerText = $node.innerText -replace '(?<=User Id\s*=)[^;]+',$userID  
$node.innerText = $node.innerText -replace '(?<=Password\s*=)[^;]+',$password  
$xml.Save($file)
Da du keine weiteren Infos zur XML Datei bereitstellst, ist das mit Vorbehalt zu genießen da wir weder entsprechend definierte Namespaces noch sonstige Infos des XML Files hier sehen können...
Member: erikro
erikro Jun 13, 2019 at 12:12:00 (UTC)
Goto Top
Moin,

Zitat von @Oertey:
> Get-Content .\Settings.xml (replace 'Source=".*?;', 'Source="$DBSERVER"') | Set-Content .\Settings.xml  
Powershell bemängelt das Get-Content, kann es mir aber nicht erklären.

Ganz einfach: Weil das so falsch ist:

PS E:\> replace("blah","blubb")  
Pfad nicht gefunden - E:\
Keine Dateien ersetzt

Das erklärt Deine Fehlermeldung, denn "Keine Datei ersetzt" ist tatsächlich ein Wert, den get-content nicht an der Position verarbeiten kann. Dein Konstrukt wird so ausgewertet:

1. Auswertung der Funktion replace() -> Rückgabe siehe oben.
2. Übergabe des Werts von 1. an get-content
3. Auswertung des Befehls get-content
-path "settings.xml"
-readcount "Keine Datei ersetzt"

Und Letzteres läuft gegen die Wand. Wie das korrekt aussieht, siehst Du im Beitrag vom shellschrubber.

hth

Erik
Member: Oertey
Oertey Jun 13, 2019 updated at 17:23:14 (UTC)
Goto Top
Danke shellschrubber, funktioniert genau so wie es soll face-smile

Danke auch an erikro für die Erklärung.
Member: Oertey
Oertey Jul 03, 2019 at 20:04:25 (UTC)
Goto Top
Hallo,

habt Ihr eine Idee wie ich die Werte (SERVER, BENUTZER,DATENBANK,PASSWORT) vorher aus der XML-Datei auslesen und in einer Variable speichern kann?

Meine Versuche mit Get-Content und XPath waren leider erfolglos.