106543
Goto Top

Powershell - Textdatei auslesen und dynamische Variablen vergeben zur Erstellung einer Batch-Datei

Hallo Leute,

habe ein kleines Problem bezüglich Powershell. Das Script soll Server aus der Citrix XenApp Farm auslesen. Soweit kein Problem. Die Server werden richtig ausgelesen und in einer temporären Textdatei gespeichert. Danach wird das ganze so gekürzt, dass wirklich NUR die Server drinstehen. Als letztes (und hier liegt das Problem) soll die Datei ausgelesen werden und die Server in unterschiedliche Variablen verpackt werden.

Die .txt-Datei mit den Servern sieht wie folgt aus:
Servername1
Servername2
Servername3
...

Das habe ich bereits zustande gebracht:
#Server auslesen und kürzen
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt
$datei = Get-Content $loc\Temp\Datacollector.txt
$datei | select-object -last 2 > Temp\Datacollector.txt

#Server auslesen und in Batch schreiben
for ($j=0;$j -le 2;$j++) {Invoke-Expression "`$j"; `
Foreach ($i in $test1 = Get-Content $loc\Temp\Datacollector.txt) { `
$spalte1 = $i | %{ $_.Split(","); }; `
$spalte1 = ${Datacollector_$j}; `
write-host "$Datacollector_$j"; `
} `
}

wobei hier :
$loc= Get-Location

Hätte mir vorgestellt dass die Variable $Datacollector_$j dann zu $Datacollector_1, $Datacollector_2, usw. wird.

Danke für eure Hilfe face-smile
Dominik

Content-Key: 184394

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

Printed on: April 16, 2024 at 12:04 o'clock

Member: mak-xxl
mak-xxl May 03, 2012 at 10:15:25 (UTC)
Goto Top
Moin Dominik,

Zitat von @106543:
$spalte1 = $i | %{ $_.Split(","); }; `

Was steht jetzt in der Variable '$Spalte1'?

$spalte1 = ${Datacollector_$j}; `

Und jetzt? (Oder: Warum überschreibst Du jetzt die obige Variable, ohne mit dem Inhalt erst etwas zu machen? Oder: Was steht zum Zeitpunkt in der/den Variable(n) '$Datacollector_$j')

write-host "$Datacollector_$j"; `

Wolltest Du evtl. ein Array mit dem Inhalt von '$Spalte1' füllen?

wobei hier :
$loc= Get-Location

Was will das besagen?

Hätte mir vorgestellt dass die Variable $Datacollector_$j dann zu $Datacollector_1, $Datacollector_2, usw. wird.

Warum füllst Du die Variablen nicht in der For-Each-Schleife?

Foreach ($i in $test1 = Get-Content $loc\Temp\Datacollector.txt) {
    $Datacollector_$j = $i | %{ $_.Split(","); }; 'liefert Servername(n)?
}

Besser wären die Servernamen allerdings in einem Array aufgehoben, die Anzahl der vorhandenen (erkannten) Servernamen gibt dann ein '$Datacollector[-1]' aus. Das Array kannst Du ebenfalls (dann ohne Suffix) in der Schleife füllen.

Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 03, 2012 at 10:47:21 (UTC)
Goto Top
Hi Mario,

erstmal danke für die prompte Hilfe ich weiß das sehr zu schätzen.
Zu deinen Fragen bzw. Anmerkungen:

> Zitat von @106543:
> ----
> $spalte1 = $i | %{ $_.Split(","); }; `

Was steht jetzt in der Variable '$Spalte1'?

Da steht beim ersten Durchlauf der erste Servername drin.
Beim zweiten Durchlauf der zweite usw.

> $spalte1 = ${Datacollector_$j}; `

Und jetzt? (Oder: Warum überschreibst Du jetzt die obige Variable, ohne mit dem Inhalt erst etwas zu machen? Oder: Was steht
zum Zeitpunkt in der/den Variable(n) '$Datacollector_$j')

Ich schreibe die Variable einfach in die andere, damit sie mir über die Schleife hinaus erhalten bleibt, will heißen dass ich den Wert von $Datacollector_$j gerne behalten würde, deswegen auch $j am Ende, weil $j eine fortlaufende Zahl sein soll wie oben in der For-Schleife ausgeführt.

> write-host "$Datacollector_$j"; `

Wolltest Du evtl. ein Array mit dem Inhalt von '$Spalte1' füllen?

Da wollte ich eig. nur überprüfen, ob der Wert auch wirklich übernommen wird. Die Zeile wird später im fertigen Script nicht mehr zu finden sein ....

> wobei hier :
> $loc= Get-Location

Was will das besagen?

Der Befehl get-location gibt den aktuellen Pfad zurück, den ich so in eine Variable speichere und für später aufheben kann.

> Hätte mir vorgestellt dass die Variable $Datacollector_$j dann zu $Datacollector_1, $Datacollector_2, usw. wird.

Warum füllst Du die Variablen nicht in der For-Each-Schleife?

Dachte das hätte ich schon? Oo

> Foreach ($i in $test1 = Get-Content $loc\Temp\Datacollector.txt) {
>     $Datacollector_$j = $i | %{ $_.Split(","); }; 'liefert Servername(n)?
> }
> 

Besser wären die Servernamen allerdings in einem Array aufgehoben, die Anzahl der vorhandenen (erkannten) Servernamen gibt
dann ein '$Datacollector[-1]' aus. Das Array kannst Du ebenfalls (dann ohne Suffix) in der Schleife füllen.

Array hab ich leider wenig bis gar keine Erfahrung von daher würde ich das gerne vermeiden...

Grüße Dominik
Member: mak-xxl
mak-xxl May 03, 2012 at 12:19:05 (UTC)
Goto Top
Moin Dominik,

Zitat von @106543:
> > $spalte1 = ${Datacollector_$j}; `
>
> Und jetzt? (Oder: Warum überschreibst Du jetzt die obige Variable, ohne mit dem Inhalt erst etwas zu machen? Oder: Was
> steht zum Zeitpunkt in der/den Variable(n) '$Datacollector_$j')

Ich schreibe die Variable einfach in die andere, damit sie mir über die Schleife hinaus erhalten bleibt, will heißen
dass ich den Wert von $Datacollector_$j gerne behalten würde, deswegen auch $j am Ende, weil $j eine fortlaufende Zahl sein
soll wie oben in der For-Schleife ausgeführt.

Was Du willst, ist schon klar - dann musst Du das aber auch tun!
$Datacollector_$j = $Spalte1;
Links steht immer der, der bekommt, rechts der, der gibt ... (Ist nicht politisch gemeint! face-wink)
Und weil das Doppelmoppelei ist, machst Du es evtl. gleich so, wie oben gepostet (jedes gefilterte 'Split'-Ergebnis in eine Variable '$Datacollector_$j').

Der Befehl get-location gibt den aktuellen Pfad zurück, den ich so in eine Variable speichere und für später aufheben kann.

Hat dann also erstmal nichts mit dem Problem zu tun ... Puuhh ...

Array hab ich leider wenig bis gar keine Erfahrung von daher würde ich das gerne vermeiden...

Musst Du auch nicht verwenden, aber: Wenn Du in einer Schleife Variablen 'füllst' (also etwa $Datacollector_1, $Datacollector_2 ... $Datacollector_n), dann weißt Du erstmal nicht, wieviele es/gefüllt geworden sind (Ergo - wieviele Server in Deinem konkreten Fall gefunden wurden). Zu diesem Zweck (Du willst schließlich alle Variablen weiterverwenden) musst Du Dir die Zählvariable aus der Schleife retten (merken) oder mühsam (evtl. noch per Stringzerlegung) existierende Variablen abfragen ...
Ein Array (hier entspr. Lektüre) hat hier den Vorteil, dass es, wie oben erwähnt, seine eigenen Grenzwerte quasi mit sich herumträgt.
Es funktioniert aber auch mit einzelnen Variablen, umstellen auf Arrays kannst Du immer noch - es ist so einfach ...

Wenn Du diesen Gedanken nun folgst, stellst Du gewiss fest, das einer sofortigen Verwendung der gefundenen Servernamen innerhalb der Schleife auch nichts wesentliches entgegensteht ...

Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 03, 2012 at 12:58:25 (UTC)
Goto Top
$Datacollector_$j = $Spalte1;

Links steht immer der, der bekommt, rechts der, der gibt ... (Ist nicht politisch gemeint! face-wink)
Und weil das Doppelmoppelei ist, machst Du es evtl. gleich so, wie oben gepostet (jedes gefilterte 'Split'-Ergebnis in
eine Variable '$Datacollector_$j').
O.O ich war blind daran hats gelegen
1000-fachen Dank dir xD die einfach Dinge sieht man meistens nicht ^^
muss aber nochmal den richtigen Funktionstest machen danach setz ich dieses Thema auf "gelöst"

Dominik
Mitglied: 106543
106543 May 03, 2012 at 14:33:12 (UTC)
Goto Top
Hallo,

hmm hat nicht ganz so geklappt wie erhofft jetzt hab ich folgenden Befehl:

#Script zum Auslesen der Server
##Datacollector
write-host Datacollector
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt
$datei = Get-Content $loc\Temp\Datacollector.txt
$datei | select-object -last 2 > Temp\Datacollector.txt
for ($j=1;$j -le 2;$j++) {
Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) {
$spalte1 = $i | %{ $_.Split(","); };
${Datacollector_$j} = $spalte1;
}
write-host "Datacollector $j"
write-host "${Datacollector_$j}";
}

aber jetzt hab ich das Problem dass da die Schleifen ja doppelt durchlaufen also beide dann hab ich in der Variablen IMMER den selben Server stehn also den letzen;
soll heißen in jeder Variablen steht nun Servername 3 in diesem Beispiel

Grüße Dominik
Member: mak-xxl
mak-xxl May 03, 2012 at 15:12:48 (UTC)
Goto Top
Moin Dominik,

Zitat von @106543:
hmm hat nicht ganz so geklappt wie erhofft jetzt hab ich folgenden Befehl:

Erhofft hattest Du (indirekt), man könne in dem Schleifendurchlauf gleich noch (soviele) Variablen erstellen, wie gebraucht werden - und dabei den Namen aus einem Basisteil und einer Zählvariablen zusammensetzen. Und vielleicht noch ein wenig mehr ...

... aber jetzt hab ich das Problem dass da die Schleifen ja doppelt durchlaufen also beide dann hab ich in der Variablen IMMER den selben Server ...

Warum tust Du Dir diese Variablengeschichte an? Nutze den herausgelösten Servernamen in der Schleife (und beachte den verbleibenden Nutzen der Äußeren), also etwa so:

Write-host Datacollector
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt  
$datei = Get-Content $loc\Temp\Datacollector.txt
$datei | select-object -last 2 > Temp\Datacollector.txt
for ($j=1;$j -le 2;$j++) {
    Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) {
        $SrvName = $i | %{ $_.Split(","); };  
        Write-Host $SrvName;   # Ausgabe bzw. Weiterverarbeitung
    }
}

Das Auslesen aller Variablen (mit den genannten Problemen) oder eines Arrays müsste auch wieder in einer Schleife erfolgen - das kannst Du besser gleich erledigen.

Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 04, 2012 at 08:02:30 (UTC)
Goto Top
Hallo Mario,

ich denke du hast mein Problem bei der letzten Schilderung nicht ganz verstanden.
Ich führe das Script jetzt mal genau so aus wie es bei dir da oben steht face-smile
da funktioniert ja auch alles prima face-smile mit dem kleinen Problem, dass ich die Server gleich zweimal kriege -.-

Also beim Quelltext:
Write-host Datacollector 
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt   
$datei = Get-Content $loc\Temp\Datacollector.txt 
$datei | select-object -last 2 > Temp\Datacollector.txt 
for ($j=1;$j -le 2;$j++) { 
     Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) { 
            $SrvName = $i | %{ $_.Split(","); };   
            Write-Host $SrvName;   # Ausgabe bzw. Weiterverarbeitung 
      } 
}
Kommt folgende Ausgabe raus:
Datacollector
Servername1
Servername2
Servername1
Servername2
was ja durchaus logisch ist, da die Schleife ja praktisch "doppelt gemoppelt" ist face-big-smile
ich werde mich mal in die Arrays einlesen vielleicht fällt mir die Aufgabe ja bei diesen leichter...

Man schreibt sich...
Dominik
Member: mak-xxl
mak-xxl May 04, 2012 at 09:47:32 (UTC)
Goto Top
Moin Dominik,

mein Kommentar
... (und beachte den verbleibenden Nutzen der Äußeren) ...
sollte Dich auf das Problem hinweisen - die äußere Schleife ist zur einmaligen Gewinnung der Servernamen kontraproduktiv. Da ich aber nicht sicher sein kann, ob sie noch zu etwas anderem dient ... Kurzer Test: Zeile 5+10 (Dein letzter Post) auskommentieren.


Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 04, 2012 at 10:17:24 (UTC)
Goto Top
Hallo Mario,

erstmal danke dass du nicht mit mir verzweifelst face-big-smile
kann dir schon mit Sicherheit sagen dass die äußere (sprich: for-) Schleife nur zum Hochzählen der Variablen dient.

Der Nutzen des Äußeren hält sich in Grenzen, da hier nur die Server ausgelesen werden (get-XAServer), dann nach den Datacllectoren gefiltert wird (Where-Object {$_.Folderpath -eq "Servers/Datacollector"} ) und dann der Servername ausgelsen wird und in die Datei Datacollector.txt geschrieben wird.
In den letzten 2 Zeilen werden lediglich die Datacollectoren herausgelöst da ansonsten in der .txt-Datei folgendes stehen würde:

<Leerzeile>
ServerNames
Servername1
Servername2

Grüße und vielen Dank schonmal
Dominik
Member: mak-xxl
mak-xxl May 04, 2012 at 10:26:02 (UTC)
Goto Top
Moin Dominik,

Zitat von @106543:
Der Nutzen des Äußeren hält sich in Grenzen, da hier nur die Server ausgelesen werden (get-XAServer), dann nach ...

Also das wesentliche ... Ja - ich hatte geschrieben ...'der Äußeren ...' - das bezog sich nur auf die selbige Schleife. Jetzt läuft es wie gewünscht?

Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 04, 2012 at 11:09:37 (UTC)
Goto Top
Hallo Mario,

leider nein aber ich bin grade dabei das Ganze mithilfe des Arrays umzusetzen. Bin mal gespannt was daraus wird.

Grüße
Dominik
Mitglied: 106543
106543 May 07, 2012 at 12:37:08 (UTC)
Goto Top
Hallo Mario,

nun hab ich noch ein kleines Problem und dann läuft das Script mustergültig face-smile
Nun bekomme ich die Variablen richtig ausgelesen bzw. vergeben.
Nun noch eine Frage, die wahrscheinlich ziemlich einfach sein wird.

Habe den folgenden Quelltext:
##Datacollector
Write-Host Datacollector
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt  
$datei = Get-Content $loc\Temp\Datacollector.txt
$datei | select-object -last 2 > Temp\Datacollector.txt
$j = 1
Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) {
$spalte1 = $i | %{ $_.Split(""); };  
${Datacollector$j} = $spalte1;
write-host Datacollector $j
write-host ${Datacollector$j}
$j = $j + 1
}
echo "set Datacollector = $Datacollector1,$Datacollector2" > Server.bat  

Wie du siehst will ich mit dem letzten Befehl die Servervariablen als .bat-Befehl in eine .bat-Datei speichern, aber irgendwie werden hier die Variablen nicht umgesetzt in die passenden Werte.
D.h. ich bekomme folgendes in der Server.bat raus:
set Datacollector = ,

Ich habe schon überprüft, ob die Variablen wirklich gefüllt sind und ja ... sie sind gefüllt.

Danke für die Hilfe bisher
Dominik
Member: mak-xxl
mak-xxl May 08, 2012 at 06:45:02 (UTC)
Goto Top
Moin Dominik,

wenn Du in eine Datei schreibst, nimm die 'Add-Content' oder 'Set-Content'-Methoden, dort wird die Kodierung anhand der Ausgabedatei (meistens richtig) vorgenommen.
Im konkreten Fall kommt hinzu, das in einer Batch-Datei ein 'set'-Befehl stets mit Literalen notiert und ausgeführt werden sollte, also so:

set "Variable=Wert"

Das ist wichtig, um den String definiert abzuschließen (keine sog. 'Trailing Blanks').
Da zusätzlich die Variablen vor dem Schreiben durch Ihren Inhalt ersetzt werden müssen, sieht das Konstrukt in der PS so aus:

Set-Content "server.bat" "set ""Datacollector=$Datacollector2,$Datacollector2"""

Die dreifachen Literale stehen für:

- äußeres Paar bildet Gesamtstring für 'Set-Content'-Befehl
- inneres Paar bewirkt Variablenauflösung
- mittleres Paar wird unverändert in Datei geschrieben

BTW: Beim Schreiben der Strings dürfte Dir spätestens der Nachteil der Variablenlösung aufgehen - was passiert, wenn mehr oder weniger als zwei Servernamen erkannt werden?

Verwende bitte für Deine Posts - auch nachträglich - die -Formatierung!

Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 08, 2012 at 07:51:40 (UTC)
Goto Top
Hallo Mario,

das mit Add- bzw. Set-Content habe ich jetzt gleich mal für alle meine anderen Script umgesetzt. Ich finde diese Lösung wirklich besser.
Das ist der aktuelle Quellcode:
Write-Host Datacollector
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt  
$datei = Get-Content $loc\Temp\Datacollector.txt
$datei | select-object -last 2 > Temp\Datacollector.txt
$j = 1
Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) {
$spalte1 = $i | %{ $_.Split(""); };  
${Datacollector$j} = $spalte1;
$j = $j + 1
write-host ${Datacollector$j}
}
set-Content "Wirkserver.bat" "set ""Datacollector=${Datacollector1},${Datacollector2}"""  
Allerdings besteht beim aktuellen Script jetzt das Problem, dass nun doch die Variablen ausserhalb der Schleife leer sind also eigentlich müsste ja
${Datacollector$j}
übersetzt werden in
$Datacollector1 bzw.
$Datacollector2
Das passiert aber nicht wenn ich aber wieder mit $j eingebe bekomme ich den Wert ausgegeben.

Hast du eine Ahnung, warum das so ist?

Danke für die Hilfe und Grüße
Dominik
Member: mak-xxl
Solution mak-xxl May 08, 2012, updated at Dec 11, 2013 at 09:29:59 (UTC)
Goto Top
Moin Dominik,

poste oder sende per PM bitte mal die originale Datei 'Datacollector.txt'.

Freundliche Grüße von der Insel - Mario
Mitglied: 106543
106543 May 09, 2012 at 06:43:39 (UTC)
Goto Top
Hallo Mario,

eine kleine Kinderkrankheit hat das Script noch.
Ich poste trotzdem schonmal den Code:
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > $loc\Temp\Datacollector.txt  

$datei = Get-Content "$loc\Temp\Datacollector.txt"   # Datei mit Servernamen  

foreach ($i in $datei) {                             # jede Zeile in Datei
  If ($i.length -gt 2) {			     # Kein Fehler bei eventuellen Leerzeilen
    If ($i.substring(0, 2) -match "HM") {            # nur, wenn "HM" als Zeilenanfang  
      $strBAT = $strBAT + $i + ",";	             # String zusammensetzen  
    }
  }
}

$strBAT = $strBAT.substring(0, $strBAT.length - 1);  # letztes Komma weg
set-Content "Wirkserver.bat" "set ""Datacollector=$strBAT""";  
Das Problem hierbei ist jetzt noch das Ergebnis, das in der Wirkserver.bat auftaucht:
set "Datacollector=Servername1                                                                       ,Servername2                                                                       "  
Da sind die Leerzeichen (keine Tabs) noch drin was den Befehl in einer Batch unsinnig macht.

Grüße Dominik
Mitglied: 106543
106543 May 09, 2012 at 06:52:01 (UTC)
Goto Top
Hallo Mario,

ok Problem gelöst face-smile
einfacher Replace Befehl eingefügt
$text = $text -replace "\s{5,}", ""  
Den hab ich dann vor
$strBAT = $strBAT.substring(0, $strBAT.length - 1);  # letztes Komma weg
eingefügt und Zack! es läuft.

Danke vielmals ich schließe das Thema jetzt
Dominik
Mitglied: 106543
106543 May 09, 2012 at 08:25:24 (UTC)
Goto Top
So hier nochmal das komplette fertige Script face-smile
write-host "Citrix-Befehle werden geladen..."  
Add-PSSnapIn Citrix.Common.Commands
write-host "Citrix.Common.Commands wurden geladen."  
Add-PSSnapin Citrix.XenApp.Commands
write-host "Citrix.XenApp.Commands wurden geladen."  
Add-PSSnapIn Citrix.Common.GroupPolicy
write-host "Citrix.Common.GroupPolicy wurde geladen."  

$loc = Get-Location
New-Item -Path $loc\Temp -ItemType Directory

#Script zum Auslesen der Server
##Datacollector
Write-Host Datacollector
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > $loc\Temp\Datacollector.txt  

$DatacollectorDatei = Get-Content "$loc\Temp\Datacollector.txt"  

foreach ($i in $DatacollectorDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
set-Content "Wirkserver.bat" "set ""Datacollector=$string""";  

##Plottserver
write-host Plottserver
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Plottserver"} | Select-Object ServerName) > $loc\Temp\Plottserver.txt  

$PlottserverDatei = Get-Content "$loc\Temp\Plottserver.txt"  
$string = ""  
foreach ($i in $PlottserverDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""Plottserver=$string""";  

##RA-GUI-Server
write-host RA-GUI-Server
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/RA-GUI-Server"} | Select-Object ServerName) > $loc\Temp\RAGUIServer.txt  

$RAGUIServerDatei = Get-Content "$loc\Temp\RAGUIServer.txt"  
$string = ""  
foreach ($i in $RAGUIServerDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""RAGUIServer=$string""";  

##DM_STM
write-host DM-STM-Server
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server DM_STM"} | Select-Object ServerName) > $loc\Temp\DMSTMServer.txt  

$DMSTMServerDatei = Get-Content "$loc\Temp\DMSTMServer.txt"  
$string = ""  
foreach ($i in $DMSTMServerDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""DMSTMServer=$string""";  

##EAI
write-host EAI
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server EAI"} | Select-Object ServerName) > $loc\Temp\EAI.txt  

$EAIDatei = Get-Content "$loc\Temp\EAI.txt"  
$string = ""  
foreach ($i in $EAIDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""EAI=$string""";  

##FlexProd
write-host FlexProd
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server FlexProd"} | Select-Object ServerName) > $loc\Temp\FlexProd.txt  

$FlexProdDatei = Get-Content "$loc\Temp\FlexProd.txt"  
$string = ""  
foreach ($i in $FlexProdDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""FlexProd=$string""";  

##IRPM
write-host IRPM
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server IRPM"} | Select-Object ServerName) > $loc\Temp\IRPM.txt  

$IRPMDatei = Get-Content "$loc\Temp\IRPM.txt"  
$string = ""  
foreach ($i in $IRPMDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""IRPM=$string""";  

##KLS
write-host KLS
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server KLS"} | Select-Object ServerName) > $loc\Temp\KLS.txt  

$KLSDatei = Get-Content "$loc\Temp\KLS.txt"  
$string = ""  
foreach ($i in $KLSDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""KLS=$string""";  

##Terminalserver
write-host Terminalserver
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Terminalserver"} | Select-Object ServerName) > $loc\Temp\Terminalserver.txt  

$TerminalserverDatei = Get-Content "$loc\Temp\Terminalserver.txt"  
$string = ""  
foreach ($i in $TerminalserverDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""Terminalserver=$string""";  

##Verteilserver
write-host Verteilserver
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Verteilserver"} | Select-Object ServerName) > $loc\Temp\Verteilserver.txt  

$VerteilserverDatei = Get-Content "$loc\Temp\Verteilserver.txt"  
$string = ""  
foreach ($i in $VerteilserverDatei) {
  If ($i.length -gt 2) {
    If ($i.substring(0, 2) -match "HE") {  
      $string = $string + $i + ",";  
    }
  }
}
$string = $string -replace "\s{2,}",""  
$string = $string.substring(0, $string.length - 1);
Add-Content "Wirkserver.bat" "set ""Verteilserver=$string""";  

##Sonstige Variablen erstellen
Add-Content "Wirkserver.bat" "set ""AlleServer=%DATACOLLECTOR%,%PLOTTSERVER%,%RAGUISERVER%,%DMSTM%,%EAI%,%FLEXPROD%,%IRPM%,%KLS%,%TERMINALSERVER%,%VERTEILSERVER%""";  
Add-Content "Wirkserver.bat" "set ""SchnittStellenServer=%DMSTM%,%EAI%,%FLEXPROD%,%IRPM%,%KLS%""";  

Remove-Item -LiteralPath $loc\Temp -Force -Recurse