Friesenjunge 17 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 Moin zusammen, im Zuge einer großen Migration unseres ERP müssen in Konfigurationsdateien mehrere Strings (Pfade) ausgetauscht werden. Die Dateien haben alle den selben Namen und liegen in den Userhomes (per AD gemapptes Laufwerk). Filesystemstruktur auf dem Fileserver: \\<Server-Name>\Benutzer$\%username%\Konfig-Ordner_ERP\konfig.ini Ich würde dies bei knapp 500 usern gerne per Script machen. CMD, VBScript oder Powershell ist erstmal egal. Da ich nicht der Scripting-Guru bin: Hat jemand von Euch so etwas schon gemacht und hat da etwas parat, was ich ggf. noch anpassen muss und verwenden kann? Vielen Dank, bin für jeden konstruktiven Tipp dankbar Euer Friesenjunge Zitieren Link zu diesem Kommentar
testperson 1.676 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 Hi, ja. Ich habe damals entsprechene PowerShell Funktionen im Web gefunden. Die Quelle habe ich leider nicht mehr. $DMSProgrammPfad = "D:\DATEV\PROGRAMM\DATEVDMS" Function Import-Ini ( [string]$Path = $(Read-Host "Please supply a value for the Path parameter") ) { $ini = @{} if (Test-Path -Path $Path) { switch -regex -file $Path { "^\[(.+)\]$" { $Category = $matches[1] $ini.$Category = @{} } "(.+)=(.+)" { $Key,$Value = $matches[1..2] $ini.$Category.$Key = $Value } } } else { Write-Host "File not found - $Path" } $ini } Function Export-Ini ( [hashtable]$inputObject = $(Read-Host "Supply a value for the inputObject parameter"), [string]$Path = $(Read-Host "Supply a value for the Path parameter") ) { $Content = @() ForEach ($Category in $inputObject.Keys) { $Content += "[$Category]" ForEach ($Key in $inputObject.$Category.Keys) { $Content += "$Key=$($inputObject.$Category.$Key)" } } $Content | Set-Content $Path -Force } Function Remove-IniCategory ( [string]$Path = $(Read-Host -Prompt "Supply a value for the Path parameter"), [string]$Category = $(Read-Host -Prompt "Supply a value for the Category parameter") ) { $ini = Import-Ini -Path $Path if ($ini.Count) { if ($ini.Contains($Category)) { $ini.Remove($Category) Export-Ini -inputObject $ini -Path $Path } else { Write-Host "Category $Category does not exist in $Path" } } } Function Remove-IniKey ( [string]$Path = $(Read-Host -Prompt "Supply a value for the Path parameter"), [string]$Category = $(Read-Host -Prompt "Supply a value for the Category parameter"), [string]$Key = $(Read-Host -Prompt "Supply a value for the Key parameter") ) { $ini = Import-Ini -Path $Path if ($ini.Count) { if ($ini.Contains($Category)) { if ($ini.$Category.Contains($Key)) { $ini.$Category.Remove($Key) Export-Ini -inputObject $ini -Path $Path } else { Write-Host "Key $Key does not exist in $Path, category $Category" } } else { Write-Host "Category $Category does not exist in $Path" } } } Function Get-IniKey ( [string]$Path = $(Read-Host -Prompt "Supply a value for the Path parameter"), [string]$Category = $(Read-Host -Prompt "Supply a value for the Category parameter"), [string]$Key = $(Read-Host -Prompt "Supply a value for the Key parameter") ) { $ini = Import-Ini -Path $Path if ($ini.Count) { if ($ini.Contains($Category)) { if ($ini.$Category.Contains($Key)) { $ini.$Category.$Key } else { Write-Host "Key $Key does not exist in $Path, category $Category" } } else { Write-Host "Category $Category does not exist in $Path" } } } Function Set-IniKey ( [string]$Path = $(Read-Host -Prompt "Supply a value for the Path parameter"), [string]$Category = $(Read-Host -Prompt "Supply a value for the Category parameter"), [string]$Key = $(Read-Host -Prompt "Supply a value for the Key parameter"), [string]$Value = $(Read-Host -Prompt "Supply a value for the Value parameter"), [bool]$Force ) { $ini = Import-Ini -Path $Path if ($ini.Count) { if (!($ini.Contains($Category))) { if ($Force) { $ini.$Category = @{} } else { Write-Host "Category $Category does not exist in $Path" return } } if ($ini.$Category.Contains($Key)) { if (!$Force) { Write-Host "Key $Key already exists in $Path, category $Category" return } } $ini.$Category.$Key = $Value Export-Ini -inputObject $ini -Path $Path } } foreach($ArchiefIniPfad in (Get-ChildItem $($DMSProgrammPfad + "\USERS") -Recurse -Filter archief.ini).FullName){ Write-Host "$ArchiefIniPfad wird angepasst..." Set-IniKey $ArchiefIniPfad 'FaxImport' 'Dir' 'S:\' $true Write-Host "$ArchiefIniPfad -> Fertig" } Ob das mittlerweile einfacher geht, keine Ahnung. :) Gruß Jan Zitieren Link zu diesem Kommentar
4077 30 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 $collection=Get-ChildItem -Path \\<Server-Name>\Benutzer$ -filter "*.ini" -Recurse foreach ($item in $collection) { (Get-Content -Path $item.FullName) | Foreach-Object {$_ -replace "Inhalt1", "INhalt2"} | Set-Content -Path $item.FullName -whatif } Sollte grundsätzlich damit auch funktionieren. Das "-whatif"nimmst Du raus, wenn es passt. ;-) Zitieren Link zu diesem Kommentar
monstermania 53 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 Schon mal mit Notepad++ versucht!? Die Find/Replace Funktion ist schon recht mächtig und wenn Du nur ein paar Strings in ini-Dateien ändern musst passt das. 1 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 vor 5 Minuten schrieb monstermania: Schon mal mit Notepad++ versucht!? Find ich gut .... bevor ich ein Script, welches ich vermutlich nicht wirklich verstehe, auf meine Daten loslassen ... und es sowieso nur eine einmalige Aktion sein soll ... dann doch lieber so. Zitieren Link zu diesem Kommentar
4077 30 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 Damit ich was lerne, weil ich bisher was anderes verwende und nicht beratungsresistent bin : kann Notepad++ das gleichzeitig in 500 Dateien? Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 Naja, nicht wirklich gleichzeitig ... aber nacheinander. Zitieren Link zu diesem Kommentar
magheinz 110 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 (bearbeitet) vor 41 Minuten schrieb BOfH_666: Naja, nicht wirklich gleichzeitig ... aber nacheinander. Das macht das script nicht anders... Haben die Dateien den gleichen Inhalt? bearbeitet 12. November 2019 von magheinz Zitieren Link zu diesem Kommentar
Friesenjunge 17 Geschrieben 12. November 2019 Autor Melden Teilen Geschrieben 12. November 2019 Erstmal Danke für die zahlreichen Anregungen. Notepad++ ist mir da mit dem dateiübergreifenden Suchen und Ersetzen gar nicht in den Sinn gekommen. Ja würde gehen, denke ich, denn man kann da einen Pfad angeben und bestimmen, dass Unterordner mit durchsucht werden sollen. @magheinz: Ja, im Grunde haben die Dateien bis auf Kleinigkeiten den selben Inhalt: Connection string /Alias der Datenbank, zu der connected werden soll Username Pfade zu Vorlagenordnern sowie Dateiablage diverse andere Dinge Geändert werden müssten die Pfade sowie der Connection String. Sollte in zwei Durchläufen über Notepad++ machbar sein Fahre morgen damit im Testsystem mal einen Probelauf. Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 12. November 2019 Melden Teilen Geschrieben 12. November 2019 vor 5 Stunden schrieb BOfH_666: Find ich gut .... bevor ich ein Script, welches ich vermutlich nicht wirklich verstehe, auf meine Daten loslassen ... und es sowieso nur eine einmalige Aktion sein soll ... dann doch lieber so. Klingt komisch, wenn Du sowas sagst - aber recht hast Du Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. November 2019 Melden Teilen Geschrieben 13. November 2019 (bearbeitet) vor 4 Stunden schrieb daabm: Klingt komisch, wenn Du sowas sagst - aber recht hast Du Das meinte ich natürlich eher in Richtung des OP: vor 11 Stunden schrieb Friesenjunge: Da ich nicht der Scripting-Guru bin: ... das interpretierte ich so, dass er eher ein Scripting-Anfänger ist. ... und dafür fand ich das Funktions-Feuerwerk von Jan ein bissl mit Kanonen auf Spatzen geschossen. Ausserdem bin ich ein großer Fan des KISS-Prinzips. bearbeitet 13. November 2019 von BOfH_666 Zitieren Link zu diesem Kommentar
Friesenjunge 17 Geschrieben 13. November 2019 Autor Melden Teilen Geschrieben 13. November 2019 vor 8 Stunden schrieb BOfH_666: Das meinte ich natürlich eher in Richtung des OP: ... das interpretierte ich so, dass er eher ein Scripting-Anfänger ist. ... und dafür fand ich das Funktions-Feuerwerk von Jan ein bissl mit Kanonen auf Spatzen geschossen. Ausserdem bin ich ein großer Fan des KISS-Prinzips. Das hast Du perfekt interpretiert. Ich versuche schon, recht viel per Scripten zu regeln, bin aber kein Programmierer. KISS finde ich auch gut, zumal ich dann bei meinen ASZUBIs auch gleich den Erklär- und Lerneffekt habe, dass sie wissen und verstehen, welche Schritte abzuarbeiten sind. Stumpf einfach nur ein Script zu starten, erfordert kein Verständnis. Daher bin ich über die Anregung mit NP++ echt dankbar Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 13. November 2019 Melden Teilen Geschrieben 13. November 2019 (bearbeitet) Nur der Vollständigkeit möchte ich noch auf ein Powershell-Skript verweisen it-explorations | Suchen & Ersetzen von Dateiinhalten – Powershell https://www.it-explorations.de/suchen-ersetzen-powershell/ bearbeitet 13. November 2019 von MurdocX Zitieren Link zu diesem Kommentar
Friesenjunge 17 Geschrieben 14. November 2019 Autor Melden Teilen Geschrieben 14. November 2019 Zuallererst möchte ich mich für die vielen Tipps und Anregungen bedanken. Es wurden Aspekte aufgeworfen, die durchaus eine nähere Betrachtung erforderten. Wir haben nun folgendes gemacht: Einfaches Batchscript, welches in den Userhomes neue Konfigurationsordner erstellt In dem Script wurden gleichzeitig die alten Konfigdateien in die neuen Ordner kopiert und wegen besserer Filtermöglichkeiten sinnvoll umbenannt Einer unserer Anwendungsprogrammierer hat auf Basis von Python ein Script geschrieben, welches die entsprechenden Werte in den Dateien austauscht und die Konfigs dann unter dem richtigen Namen als neue Datei abspeichert. Das Script liegt mir noch nicht vor. Notepad++ Beim Versuch, mit gesetztem Dateifilter Dateiübergreifend zu suchen und zu ersetzen, hat sich Notepad++ reproduzierbar aufgehängt und musste hart abgeschossen werden. Daher wurde der letzte und wichtigste Schritt über Python erledigt. Warum es zu dem Hangupp kam, lässt sich auf die Schnelle nicht ermitteln. Wir wollen hier aber auch keine Energie verschwenden, da wir aus Zeitgründen mitten in den Vorbereitungen zu der Migration stecken. 1 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.