spsman
Goto Top

Powershell Variable in Datei finden und ersetzen

Hallo;

ich will mal wieder was schickes machen aber mir fehlt ein wenig der Ansatz.

Ich habe eine Datei "Templete.txt":
[bla ]

Name: [//Name//]
Anrede Herr [//Name//] 
Telefon [//Nummer//] [blub]


Die [/ / und / /] Zeichen Markieren die den Anfang und Ende der Variablen. Kann noch angepasst werden.

Jetzt will ich
- alle Variablen finden
- auslesen
- den Kompletten String ersetzen.
- Datei unter neuem Namen Speichern

Dann soll also so ein Datei heraus kommen z.B.

Dateiname Franz Müller.txt
[bla ]

Name: Franz Müller
Anrede Herr Franz Müller
Telefon 0123456789 [blub]


Das Powershel Script Soll in Etwa So aussehen:

$users = Get-ADUser -Filter {MemberOf -contains ScriptUser}

$Datei = Get-Content ("C:\temp\Templete.txt")  

#Funktion um alle Variablen Namen in $Datei zu finden
#????? >> $ReplaceArray


foreach ($user in $users)
{

foreach ($Variable in $ReplaceArray)
{
$OldString = "[//"+$Variable+"//]"  
$NewString = Get-ADUser -Filter {name -eq $User} -Properties $Variable #geht das so?
$Datei -Replace($OldString,$NewString)

}
$Dateiname= Get-ADUser -Filter {name -eq $User} -Properties sn
Set-Content -Path "C:\temp\"+$Dateiname+".TXT"  $Datei  
}



Ich wäre dankbar für eine Denkanstoß.

Gruß SPSman

Content-ID: 1471928700

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

Ausgedruckt am: 19.11.2024 um 01:11 Uhr

erikro
erikro 05.11.2021 um 14:41:21 Uhr
Goto Top
Moin,

bevor ich darauf antworte, eine Rückfrage: Was soll das? Soll sozusagen eine digitale Visitenkarte erzeugt werden? Oder stehen in dem Template noch andere Informationen?

Liebe Grüße

Erik
149569
149569 05.11.2021 aktualisiert um 16:30:18 Uhr
Goto Top
$template = 'C:\temp\template.txt'  
$content = Get-Content $template -raw
foreach($user in (Get-ADUser -Filter * -Properties *)){
    [regex]::replace($content,'(?is)\[//([^/]+)//\]',{  
        param($m)
        $user.($m.Groups[1].Value)
    }) | Set-Content "C:\temp\$($user.DisplayName).txt"  
}

Ich habe eine Datei "Templete.txt":
Du bist mir auch so eine "Trompete" min jung face-big-smile. Freidaach ....
https://de.wikipedia.org/wiki/Template
SPSman
SPSman 05.11.2021 um 21:44:31 Uhr
Goto Top
Zitat von @erikro:

Moin,

bevor ich darauf antworte, eine Rückfrage: Was soll das? Soll sozusagen eine digitale Visitenkarte erzeugt werden? Oder stehen in dem Template noch andere Informationen?

Liebe Grüße

Erik

Es geht darum Standardisierte Email-Signaturen per Logon Script zu verteilen. Vorher müssen die Dateien natürlich mit dem jeweilig Informationen aus dem AD gefüllt werden.


Zitat von @149569:

> $template = 'C:\temp\template.txt'  
> $content = Get-Content $template -raw
> foreach($user in (Get-ADUser -Filter * -Properties *)){
>     [regex]::replace($content,'(?is)\[//([^/]+)//\]',{  
>         param($m)
>         $user.($m.Groups[1].Value)
>     }) | Set-Content "C:\temp\$($user.DisplayName).txt"  
> }
> 


Mag du mir ein kurze Erklärung bieten? Ich versteh bei deinem Beispiel fast nur Bahnhof :O
erikro
erikro 08.11.2021 um 08:41:08 Uhr
Goto Top
Moin,

Zitat von @SPSman:
Es geht darum Standardisierte Email-Signaturen per Logon Script zu verteilen. Vorher müssen die Dateien natürlich mit dem jeweilig Informationen aus dem AD gefüllt werden.

Dachte ich es mir doch. Welcher Mailserver? Die meisten haben dafür eine eingebaute Funktion. Hier z. B. Exchange:
https://docs.microsoft.com/de-de/microsoft-365/admin/setup/create-signat ...

hth


Erik
SPSman
SPSman 08.11.2021 um 09:22:13 Uhr
Goto Top
Zitat von @erikro:

Moin,

Zitat von @SPSman:
Es geht darum Standardisierte Email-Signaturen per Logon Script zu verteilen. Vorher müssen die Dateien natürlich mit dem jeweilig Informationen aus dem AD gefüllt werden.

Dachte ich es mir doch. Welcher Mailserver? Die meisten haben dafür eine eingebaute Funktion. Hier z. B. Exchange:
https://docs.microsoft.com/de-de/microsoft-365/admin/setup/create-signat ...

hth


Erik

Leider 2 Probleme die ich umgehen will:
Einschränkungen von organisationsweiten Signaturen
Folgendes können Sie nicht tun, wenn Sie E-Mail-Signaturen in Microsoft 365 verwalten:

Die Signatur direkt unter der letzten E-Mail-Antwort oder -Weiterleitung einfügen

Bildern in E-Mail-Signaturen einbetten
erikro
erikro 08.11.2021 um 09:53:43 Uhr
Goto Top
Moin,

Zitat von @SPSman:
Leider 2 Probleme die ich umgehen will:
Einschränkungen von organisationsweiten Signaturen
Folgendes können Sie nicht tun, wenn Sie E-Mail-Signaturen in Microsoft 365 verwalten:

Die Signatur direkt unter der letzten E-Mail-Antwort oder -Weiterleitung einfügen

Sollte man ja auch nicht. Stell Dir mal einen Email-Verkehr vor, bei dem zehnmal hin- und hergemailt wird. Und jedesmal schmieren beide ihre zehn Zeilen Signatur drunter. Das sind dann am Ende 200 Zeilen überflüssiger Datenmüll.

Bildern in E-Mail-Signaturen einbetten

Aus dem Handbuch "Wie komme ich auf die Blacklists?": Fügen Sie möglichst viele Grafiken in Ihre Mails ein. Der Empfänger sieht wirklich gerne die broken images. Außerdem klickt er auch immer wieder gerne die Warnmeldungen weg, dass da irgenwelche gefährlichen Bilder nachgeladen werden sollen. Und, das wollen wir ja schließlich, es erhöht den SPAM-Index ungemein. face-wink

Liebe Grüße

Erik
149569
149569 08.11.2021 aktualisiert um 10:51:48 Uhr
Goto Top
Zitat von @SPSman:
Mag du mir ein kurze Erklärung bieten? Ich versteh bei deinem Beispiel fast nur Bahnhof :O
Dann hättest du wohl besser Lockführer werden sollen face-smile
# Pfad zum Template
$template = 'C:\temp\template.txt'  
# Inhalt des Templates auslesen
$content = Get-Content $template -raw
# für jeden AD-User
foreach($user in (Get-ADUser -Filter * -Properties *)){
     # suche via Regex-Replace-Iterator Funktion nach deinen Platzhaltern inkl. Submatch für den Namen (https:{{comment_single_line_double_slash:0}}
    [regex]::replace($content,'(?is)\[//([^/]+)//\]',{  
        param($m)
        ersetze den Platzhalt mit dem Inhalt des AD-User-Attributs mit dem selben Namen
        $user.($m.Groups[1].Value)
        # und schreibe das Template in eine Textdatei mit dem SamAccountname des Users
    }) | Set-Content "C:\temp\$($user.SamAccountName).txt"  
}
SPSman
SPSman 08.11.2021 um 12:08:38 Uhr
Goto Top
Zitat von @149569:
Dann hättest du wohl besser Lockführer werden sollen face-smile
>      # suche via Regex-Replace-Iterator Funktion nach deinen Platzhaltern inkl. Submatch für den Namen (https:{{comment_single_line_double_slash:0}}
>     [regex]::replace($content,'(?is)\[//([^/]+)//\]',{  
>         param($m)
>         ersetze den Platzhalt mit dem Inhalt des AD-User-Attributs mit dem selben Namen
>         $user.($m.Groups[1].Value)
> 

Entschuldige, da habe ich mich mal wider nicht genau genug ausgedrückt...
Es geht um die Obigen Code Zeilen
[regex] ist der verweis auf Regular Expressions und wird mit :: an die Replace funktion übergeben,Richtig?
Allerdings was bedeutet:
(?is) \[/ / ([^/]+) / /\]???
\ heißt jetzt komm eine Zeichen das nicht als regex interpretiert werden sollenn.
Die [] sind von mir definiert, ok.
Param initialisiert einen Parameterdatensatz, aber woher kommt das $m ?
Vermutlich sind dort die AD-Eigenschaftsnamen gespeichert oder?
Und mit $User.($m.Groups[1].Value) werde die User-Eigenschaftswerte aus dem Parameterdatensatz gelesen und als Liste an Replace übergeben richtig?

Was macht das Groups[1]?
Erstellt es einen Index über die AD-Eigenschaftsnamen?

Danke im Voraus
149569
Lösung 149569 08.11.2021 aktualisiert um 13:15:49 Uhr
Goto Top
Zitat von @SPSman:
Entschuldige, da habe ich mich mal wider nicht genau genug ausgedrückt...
Es geht um die Obigen Code Zeilen
Und genau die habe ich dir oben kommentiert!

[regex] ist der verweis auf Regular Expressions und wird mit :: an die Replace funktion übergeben,Richtig?
Nein, Replace ist eine statische Funktion der System.Text.RegularExpressions.Regex Klasse.

Allerdings was bedeutet:
(?is) \[/ / ([^/]+) / /\]???
Das ist Regular-Expression-Syntax: Regular Expressions Tutorial

\ heißt jetzt komm eine Zeichen das nicht als regex interpretiert werden sollenn.
Das ist das Escape-Zeichen das ein in Regex besonders interpretiertes Zeichen als Literal deklariert damit es nicht mehr besonders ist.
Param initialisiert einen Parameterdatensatz, aber woher kommt das $m ?
Nein, das ist die Deklaration der Iterator-Parameter genau wie bei einer normalen Funktion. Der Funktion wird für jeden Match des Regex dieser über den Parameter $m als RegularExpressionMatch übergeben.

Vermutlich sind dort die AD-Eigenschaftsnamen gespeichert oder?
Nein.
Und mit $User.($m.Groups[1].Value) werde die User-Eigenschaftswerte aus dem Parameterdatensatz gelesen und als Liste an Replace übergeben richtig?
Nein $user enthält die AD Eigenschaften des Users, und mit dem Klammmernaufruf dahinter wird der Submatch in der Regular-Expression (der der dort in den Klammern steht) ausgelesen (also der reine Name innerhalb der Name
Der Name der darin steht sollte also zu einer AD-Eigenschaft des Users passen!
Was macht das Groups[1]?
Erstellt es einen Index über die AD-Eigenschaftsnamen?
Nein damit wird der erste Submatch in den runden Klammern im Regex ausgelesen.