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!

Recommended Posts

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 to post

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 to post
$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 to post

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 to post
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.  :thumb1:

Klingt komisch, wenn Du sowas sagst - aber recht hast Du :-)

Link to post
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.

Edited by BOfH_666
Link to post
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 to post

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.

  • Like 1
Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...