Jump to content

Dateiübergreifend Suchen und Ersetzen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar
$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. ;-)

Link zu diesem Kommentar

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.

Link zu diesem Kommentar
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.  ;-) :grin3:

Ausserdem bin ich ein großer Fan des KISS-Prinzips.

bearbeitet von BOfH_666
Link zu diesem Kommentar
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.  ;-) :grin3:

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 ;-)

Link zu diesem Kommentar

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:

  1. Einfaches Batchscript, welches in den Userhomes neue Konfigurationsordner erstellt
  2. In dem Script wurden gleichzeitig die alten Konfigdateien in die neuen Ordner kopiert und wegen besserer Filtermöglichkeiten sinnvoll umbenannt
  3. 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.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...