oertey

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?
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 461419

Url: https://administrator.de/forum/connectionstring-anpassen-zwischen-2-zeichen-mit-powershell-461419.html

Ausgedruckt am: 14.06.2025 um 01:06 Uhr

Pjordorf
Pjordorf 12.06.2019 um 21:07:12 Uhr
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
Oertey
Oertey 12.06.2019 aktualisiert um 21:29:11 Uhr
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.
139920
Lösung 139920 13.06.2019 aktualisiert um 12:57:20 Uhr
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...
erikro
erikro 13.06.2019 um 14:12:00 Uhr
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
Oertey
Oertey 13.06.2019 aktualisiert um 19:23:14 Uhr
Goto Top
Danke shellschrubber, funktioniert genau so wie es soll face-smile

Danke auch an erikro für die Erklärung.
Oertey
Oertey 03.07.2019 um 22:04:25 Uhr
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.