Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung

Mitglied: 106543

106543 (Level 2)

03.05.2012, aktualisiert 04.05.2012, 5854 Aufrufe, 18 Kommentare

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(",")[0]; }; `
$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
Dominik
Mitglied: mak-xxl
03.05.2012 um 12:15 Uhr
Moin Dominik,

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

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(",")[0]; }; '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
Bitte warten ..
Mitglied: 106543
03.05.2012 um 12:47 Uhr
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(",")[0]; }; `

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(",")[0]; }; '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
Bitte warten ..
Mitglied: mak-xxl
03.05.2012 um 14:19 Uhr
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! )
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
Bitte warten ..
Mitglied: 106543
03.05.2012 um 14:58 Uhr
$Datacollector_$j = $Spalte1;
</code>
Links steht immer der, der bekommt, rechts der, der gibt ... (Ist nicht politisch gemeint! )
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
Bitte warten ..
Mitglied: 106543
03.05.2012 um 16:33 Uhr
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(",")[0]; };
${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
Bitte warten ..
Mitglied: mak-xxl
03.05.2012 um 17:12 Uhr
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:

01.
Write-host Datacollector 
02.
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt 
03.
$datei = Get-Content $loc\Temp\Datacollector.txt 
04.
$datei | select-object -last 2 > Temp\Datacollector.txt 
05.
for ($j=1;$j -le 2;$j++) { 
06.
    Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) { 
07.
        $SrvName = $i | %{ $_.Split(",")[0]; }; 
08.
        Write-Host $SrvName;   # Ausgabe bzw. Weiterverarbeitung 
09.
10.
}
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
Bitte warten ..
Mitglied: 106543
04.05.2012 um 10:02 Uhr
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
da funktioniert ja auch alles prima mit dem kleinen Problem, dass ich die Server gleich zweimal kriege -.-

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

Man schreibt sich...
Dominik
Bitte warten ..
Mitglied: mak-xxl
04.05.2012 um 11:47 Uhr
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
Bitte warten ..
Mitglied: 106543
04.05.2012 um 12:17 Uhr
Hallo Mario,

erstmal danke dass du nicht mit mir verzweifelst
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
Bitte warten ..
Mitglied: mak-xxl
04.05.2012 um 12:26 Uhr
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
Bitte warten ..
Mitglied: 106543
04.05.2012 um 13:09 Uhr
Hallo Mario,

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

Grüße
Dominik
Bitte warten ..
Mitglied: 106543
07.05.2012 um 14:37 Uhr
Hallo Mario,

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

Habe den folgenden Quelltext:
01.
##Datacollector 
02.
Write-Host Datacollector 
03.
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt 
04.
$datei = Get-Content $loc\Temp\Datacollector.txt 
05.
$datei | select-object -last 2 > Temp\Datacollector.txt 
06.
$j = 1 
07.
Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) { 
08.
$spalte1 = $i | %{ $_.Split("")[0]; }; 
09.
${Datacollector$j} = $spalte1; 
10.
write-host Datacollector $j 
11.
write-host ${Datacollector$j} 
12.
$j = $j + 1 
13.
14.
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:
01.
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
Bitte warten ..
Mitglied: mak-xxl
08.05.2012 um 08:45 Uhr
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 Code-Formatierung!

Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: 106543
08.05.2012 um 09:51 Uhr
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:
01.
Write-Host Datacollector 
02.
(Get-XAServer| Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > Temp\Datacollector.txt 
03.
$datei = Get-Content $loc\Temp\Datacollector.txt 
04.
$datei | select-object -last 2 > Temp\Datacollector.txt 
05.
$j = 1 
06.
Foreach ($i in $test1 = Get-Content Temp\Datacollector.txt) { 
07.
$spalte1 = $i | %{ $_.Split("")[0]; }; 
08.
${Datacollector$j} = $spalte1; 
09.
$j = $j + 1 
10.
write-host ${Datacollector$j} 
11.
12.
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
01.
${Datacollector$j}
übersetzt werden in
01.
$Datacollector1 bzw. 
02.
$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
Bitte warten ..
Mitglied: mak-xxl
LÖSUNG 08.05.2012, aktualisiert 11.12.2013
Moin Dominik,

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

Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: 106543
09.05.2012 um 08:43 Uhr
Hallo Mario,

eine kleine Kinderkrankheit hat das Script noch.
Ich poste trotzdem schonmal den Code:
01.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > $loc\Temp\Datacollector.txt 
02.
 
03.
$datei = Get-Content "$loc\Temp\Datacollector.txt"   # Datei mit Servernamen 
04.
 
05.
foreach ($i in $datei) {                             # jede Zeile in Datei 
06.
  If ($i.length -gt 2) {			     # Kein Fehler bei eventuellen Leerzeilen 
07.
    If ($i.substring(0, 2) -match "HM") {            # nur, wenn "HM" als Zeilenanfang 
08.
      $strBAT = $strBAT + $i + ",";	             # String zusammensetzen 
09.
10.
11.
12.
 
13.
$strBAT = $strBAT.substring(0, $strBAT.length - 1);  # letztes Komma weg 
14.
set-Content "Wirkserver.bat" "set ""Datacollector=$strBAT""";
Das Problem hierbei ist jetzt noch das Ergebnis, das in der Wirkserver.bat auftaucht:
01.
set "Datacollector=Servername1                                                                       ,Servername2                                                                       "
Da sind die Leerzeichen (keine Tabs) noch drin was den Befehl in einer Batch unsinnig macht.

Grüße Dominik
Bitte warten ..
Mitglied: 106543
09.05.2012 um 08:52 Uhr
Hallo Mario,

ok Problem gelöst
einfacher Replace Befehl eingefügt
01.
$text = $text -replace "\s{5,}", ""
Den hab ich dann vor
01.
$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
Bitte warten ..
Mitglied: 106543
09.05.2012 um 10:25 Uhr
So hier nochmal das komplette fertige Script
01.
write-host "Citrix-Befehle werden geladen..." 
02.
Add-PSSnapIn Citrix.Common.Commands 
03.
write-host "Citrix.Common.Commands wurden geladen." 
04.
Add-PSSnapin Citrix.XenApp.Commands 
05.
write-host "Citrix.XenApp.Commands wurden geladen." 
06.
Add-PSSnapIn Citrix.Common.GroupPolicy 
07.
write-host "Citrix.Common.GroupPolicy wurde geladen." 
08.
 
09.
$loc = Get-Location 
10.
New-Item -Path $loc\Temp -ItemType Directory 
11.
 
12.
#Script zum Auslesen der Server 
13.
##Datacollector 
14.
Write-Host Datacollector 
15.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Datacollector"} | Select-Object ServerName) > $loc\Temp\Datacollector.txt 
16.
 
17.
$DatacollectorDatei = Get-Content "$loc\Temp\Datacollector.txt" 
18.
 
19.
foreach ($i in $DatacollectorDatei) { 
20.
  If ($i.length -gt 2) { 
21.
    If ($i.substring(0, 2) -match "HE") { 
22.
      $string = $string + $i + ","; 
23.
24.
25.
26.
$string = $string -replace "\s{2,}","" 
27.
$string = $string.substring(0, $string.length - 1); 
28.
set-Content "Wirkserver.bat" "set ""Datacollector=$string"""; 
29.
 
30.
##Plottserver 
31.
write-host Plottserver 
32.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Plottserver"} | Select-Object ServerName) > $loc\Temp\Plottserver.txt 
33.
 
34.
$PlottserverDatei = Get-Content "$loc\Temp\Plottserver.txt" 
35.
$string = "" 
36.
foreach ($i in $PlottserverDatei) { 
37.
  If ($i.length -gt 2) { 
38.
    If ($i.substring(0, 2) -match "HE") { 
39.
      $string = $string + $i + ","; 
40.
41.
42.
43.
$string = $string -replace "\s{2,}","" 
44.
$string = $string.substring(0, $string.length - 1); 
45.
Add-Content "Wirkserver.bat" "set ""Plottserver=$string"""; 
46.
 
47.
##RA-GUI-Server 
48.
write-host RA-GUI-Server 
49.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/RA-GUI-Server"} | Select-Object ServerName) > $loc\Temp\RAGUIServer.txt 
50.
 
51.
$RAGUIServerDatei = Get-Content "$loc\Temp\RAGUIServer.txt" 
52.
$string = "" 
53.
foreach ($i in $RAGUIServerDatei) { 
54.
  If ($i.length -gt 2) { 
55.
    If ($i.substring(0, 2) -match "HE") { 
56.
      $string = $string + $i + ","; 
57.
58.
59.
60.
$string = $string -replace "\s{2,}","" 
61.
$string = $string.substring(0, $string.length - 1); 
62.
Add-Content "Wirkserver.bat" "set ""RAGUIServer=$string"""; 
63.
 
64.
##DM_STM 
65.
write-host DM-STM-Server 
66.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server DM_STM"} | Select-Object ServerName) > $loc\Temp\DMSTMServer.txt 
67.
 
68.
$DMSTMServerDatei = Get-Content "$loc\Temp\DMSTMServer.txt" 
69.
$string = "" 
70.
foreach ($i in $DMSTMServerDatei) { 
71.
  If ($i.length -gt 2) { 
72.
    If ($i.substring(0, 2) -match "HE") { 
73.
      $string = $string + $i + ","; 
74.
75.
76.
77.
$string = $string -replace "\s{2,}","" 
78.
$string = $string.substring(0, $string.length - 1); 
79.
Add-Content "Wirkserver.bat" "set ""DMSTMServer=$string"""; 
80.
 
81.
##EAI 
82.
write-host EAI 
83.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server EAI"} | Select-Object ServerName) > $loc\Temp\EAI.txt 
84.
 
85.
$EAIDatei = Get-Content "$loc\Temp\EAI.txt" 
86.
$string = "" 
87.
foreach ($i in $EAIDatei) { 
88.
  If ($i.length -gt 2) { 
89.
    If ($i.substring(0, 2) -match "HE") { 
90.
      $string = $string + $i + ","; 
91.
92.
93.
94.
$string = $string -replace "\s{2,}","" 
95.
$string = $string.substring(0, $string.length - 1); 
96.
Add-Content "Wirkserver.bat" "set ""EAI=$string"""; 
97.
 
98.
##FlexProd 
99.
write-host FlexProd 
100.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server FlexProd"} | Select-Object ServerName) > $loc\Temp\FlexProd.txt 
101.
 
102.
$FlexProdDatei = Get-Content "$loc\Temp\FlexProd.txt" 
103.
$string = "" 
104.
foreach ($i in $FlexProdDatei) { 
105.
  If ($i.length -gt 2) { 
106.
    If ($i.substring(0, 2) -match "HE") { 
107.
      $string = $string + $i + ","; 
108.
109.
110.
111.
$string = $string -replace "\s{2,}","" 
112.
$string = $string.substring(0, $string.length - 1); 
113.
Add-Content "Wirkserver.bat" "set ""FlexProd=$string"""; 
114.
 
115.
##IRPM 
116.
write-host IRPM 
117.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server IRPM"} | Select-Object ServerName) > $loc\Temp\IRPM.txt 
118.
 
119.
$IRPMDatei = Get-Content "$loc\Temp\IRPM.txt" 
120.
$string = "" 
121.
foreach ($i in $IRPMDatei) { 
122.
  If ($i.length -gt 2) { 
123.
    If ($i.substring(0, 2) -match "HE") { 
124.
      $string = $string + $i + ","; 
125.
126.
127.
128.
$string = $string -replace "\s{2,}","" 
129.
$string = $string.substring(0, $string.length - 1); 
130.
Add-Content "Wirkserver.bat" "set ""IRPM=$string"""; 
131.
 
132.
##KLS 
133.
write-host KLS 
134.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/SST-Server KLS"} | Select-Object ServerName) > $loc\Temp\KLS.txt 
135.
 
136.
$KLSDatei = Get-Content "$loc\Temp\KLS.txt" 
137.
$string = "" 
138.
foreach ($i in $KLSDatei) { 
139.
  If ($i.length -gt 2) { 
140.
    If ($i.substring(0, 2) -match "HE") { 
141.
      $string = $string + $i + ","; 
142.
143.
144.
145.
$string = $string -replace "\s{2,}","" 
146.
$string = $string.substring(0, $string.length - 1); 
147.
Add-Content "Wirkserver.bat" "set ""KLS=$string"""; 
148.
 
149.
##Terminalserver 
150.
write-host Terminalserver 
151.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Terminalserver"} | Select-Object ServerName) > $loc\Temp\Terminalserver.txt 
152.
 
153.
$TerminalserverDatei = Get-Content "$loc\Temp\Terminalserver.txt" 
154.
$string = "" 
155.
foreach ($i in $TerminalserverDatei) { 
156.
  If ($i.length -gt 2) { 
157.
    If ($i.substring(0, 2) -match "HE") { 
158.
      $string = $string + $i + ","; 
159.
160.
161.
162.
$string = $string -replace "\s{2,}","" 
163.
$string = $string.substring(0, $string.length - 1); 
164.
Add-Content "Wirkserver.bat" "set ""Terminalserver=$string"""; 
165.
 
166.
##Verteilserver 
167.
write-host Verteilserver 
168.
(Get-XAServer | Where-Object {$_.Folderpath -eq "Servers/Verteilserver"} | Select-Object ServerName) > $loc\Temp\Verteilserver.txt 
169.
 
170.
$VerteilserverDatei = Get-Content "$loc\Temp\Verteilserver.txt" 
171.
$string = "" 
172.
foreach ($i in $VerteilserverDatei) { 
173.
  If ($i.length -gt 2) { 
174.
    If ($i.substring(0, 2) -match "HE") { 
175.
      $string = $string + $i + ","; 
176.
177.
178.
179.
$string = $string -replace "\s{2,}","" 
180.
$string = $string.substring(0, $string.length - 1); 
181.
Add-Content "Wirkserver.bat" "set ""Verteilserver=$string"""; 
182.
 
183.
##Sonstige Variablen erstellen 
184.
Add-Content "Wirkserver.bat" "set ""AlleServer=%DATACOLLECTOR%,%PLOTTSERVER%,%RAGUISERVER%,%DMSTM%,%EAI%,%FLEXPROD%,%IRPM%,%KLS%,%TERMINALSERVER%,%VERTEILSERVER%"""; 
185.
Add-Content "Wirkserver.bat" "set ""SchnittStellenServer=%DMSTM%,%EAI%,%FLEXPROD%,%IRPM%,%KLS%"""; 
186.
 
187.
Remove-Item -LiteralPath $loc\Temp -Force -Recurse
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell Ordnername auslesen und verwenden (3)

Frage von zamsi7 zum Thema Batch & Shell ...

Windows Tools
gelöst Powershell Befehle aus Batch-Datei falsch überetzt? (2)

Frage von Chillministrator zum Thema Windows Tools ...

HTML
gelöst Mit HTML Datei eine Textdatei auslesen (7)

Frage von Maffi zum Thema HTML ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...