Jump to content

Powershell - Zeilenabschnitt quoten


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

Empfohlene Beiträge

Ich bin mir nicht sicher, ob meine Beschreibung im Titel korrekt ist, deshalb hier nochmal ausführlicher, was ich meine:

Ich frage folgendes ab für mehrere Clients im Netzwerk:

$ausgabe = "\\localhost\ausgabe.txt"
"\\netzwerk-client3\c$\Windows\system.ini" | Out-File $ausgabe -Encoding Default -append
Get-Content "\\netzwerk-client3\c$\Windows\system.ini" | select-string -pattern "wave=" -context 0, 0 | Out-File $ausgabe -Encoding Default -append

Die Abfrage funktioniert, gibt aber nur die gefundenen Strings aus; der Host-Name, auf dem die Strings gefunden wurden, wird nicht ausgegeben (so wurde es ja in der Abfrage auch definiert):

wave=mmdrv.dll

Ich möchte gerne, dass der Host-Name mit ausgegeben wird, weshalb ich den String "\\netzwerk-client3\c$\Windows\system.ini" aus Zeile 3 einfach als Ausgabe für Zeile 2 kopierte und einfügte. Die Ausgabe schaut nun so aus:

"\\netzwerk-client3\c$\Windows\system.ini"
wave=mmdrv.dll

Nun zur eigentlichen Frage: Kann ich entweder definieren, dass PS den "hostname" des Ziel-PCs ermittelt und ausgibt (Wenn ja, wie mache ich das?) bzw. wie kann ich PS anweisen, den String, der mit "Get-Content "\\netzwerk-client3\c$\Windows\system.ini"" verknüpft ist, über eine Variable oder eine Anweisung in Zeile 2 oder nach Zeile 3 auszugeben?

 

Link zu diesem Kommentar

Hi,

 

wie frägst du denn die einzelnen Computer ab?

 

Möglich wäre es die Computer in einen Array zu definieren. Mittels foreach kannst du dann nach und nach die Computer abfragen. Mittels $computer erhälst du den aktuell abgefragten Computer zurück.

 

Als kleines Beispiel:

 

[array]$computers = "Server1", "Server2"
foreach ($computer in $computers)
{
"\\" + $computer + "\c$\Windows\System.ini"
}

 

 

Hilft Dir das bei deiner ersten Frage weiter?
 
Viele Grüße!
bearbeitet von Timsk
Link zu diesem Kommentar

Die Richtung stimmt, nun werden zumindest alle Hosts, die im Array definiert wurden, ausgegeben. Wie kann ich nun obige Ausgabe

"\\netzwerk-client3\c$\Windows\system.ini"
wave=mmdrv.dll

erreichen? Mit 

{
"\\" + $computer + "\c$\Windows\system.ini" | Out-File $ausgabe -Encoding Default -append
Get-Content "\\" + $computer + "\c$\Windows\system.ini" | select-string -pattern "wave=" -context 0, 0 | Out-File $ausgabe -Encoding Default -append
}

geht es nicht.

Bzgl. PS-Syntax sieht es bei mir recht mau aus. Ist es generell mgl., die Computer und das Ergebnis von select-string untereinander auszugeben?

Link zu diesem Kommentar

Hi,

 

 

Also bei mir funktioniert es folgendermaßen:

 

[array]$computers = "Server1", "Server2"

$ausgabe = "C:\temp\test.txt"
foreach ($computer in $computers)
{
"\\" + $computer + "\c$\Windows\system.ini" | Out-File $ausgabe -append
gc ("\\" + $computer + "\c$\Windows\system.ini")  | select-string -pattern "wave=" -context 0, 0 | Out-File $ausgabe -append
}

 

 

 

Ist zwar nicht besonders schön formatiert aber es erfüllt seinen Zweck. Eine schönere Formatierung würde man beispielsweise mit einer csv Datei erreichen können.

 

Viele Grüße!

 

Edit:

 

So ist die Ausgabe schöner :)

 

[array]$computers = "Server1", "Server2"

$ausgabe = "C:\temp\test.txt"
$computers | % {
"\\" + $_ + "\c$\Windows\system.ini" | Out-File $ausgabe -append
(gc ("\\" + $_ + "\c$\Windows\system.ini")  | select-string -pattern "wave=" -context 0, 0).ToString() | Out-File $ausgabe -append
}
bearbeitet von Timsk
Link zu diesem Kommentar

Ja, so passt es. Die Ausgabe ist nicht schön, aber praktisch. ;) Wenn ich das Ergebnis mit notepad öffne und je ein Leerzeichen durch keinen Character ersetze, passt die Formatierung. Insofern - tausend Dank für deine Hilfe (nicht nur insofern, sondern überhaupt).

Generell ist PS relativ übersichtlich und man kann sich einarbeiten. Nur wenn es um Formatierungen geht, artet alles recht schnell in ein Script-Monster aus, welches schwer durchschaubar wird.

Link zu diesem Kommentar

Evtl. findest Du hier eine bessere Formatierung für die Ausgabe: http://technet.microsoft.com/de-de/library/dd347677.aspx Format-Table macht sich ganz gut. ;)

 

Na warum dann nicht gleich die passende Lösung? :)

 

[array]$computers = "Server1", "Server2"
$ausgabe = "C:\Temp\Test.txt"
$output = @()
$computers | % {
$temp = "" | Select Computername, Information
$temp.Computername = $_
$temp.Information = (gc ("\\" + $_ + "\c$\Windows\system.ini")  | select-string -pattern "wave=" -context 0, 0).ToString()
$output += $temp
} 
$output | out-File $ausgabe
Link zu diesem Kommentar

Auch gut, aber ich bevorzuge die Schreibweise der Ergebnisse untereinander, ich finde es übersichtlicher (das ist aber Geschmackssache).

Eine andere Frage: Wie kann ich bei einer Ausgabe einen String an eine Zeile ohne Zeilenumbruch anfügen? Bsp., ich gebe Datum und Uhrzeit aus,



Dienstag, 12. Februar 2013 16:05:54

 

möchte aber den String "Uhr" (ohne") an die Ausgabe hängen.



Dienstag, 12. Februar 2013 16:05:54 Uhr

 

Ich frage nicht nach Formatierungen a la "-Format u" etc., denn die Standardformatierung genügt mir. Es geht mir prinzipiell um das Anhängen von Strings an eine Ausgabe, ohne in die nächste Zeile umzubrechen. Get-Date ist nur ein Bsp., ich suche generell nach einer Möglichkeit, sowas zu bewerkstelligen.

Danke vorab.

Link zu diesem Kommentar

Hi,

 

mit einen "+" verbindest du die einzelnen Teile. Du kannst einen String mit einen String verbinden oder eben einen in einer variablen gespeicherten String mit einen String.

 

"Hallo, " + "dies ist ein Test"

 

oder

 

$date = (get-date).DayOfWeek
"Heute ist " + $date

 

 

Führe einfach die beiden Befehle die im Codeblock stehen aus, das sollte die Sache klar machen.

 

Wenn du jetzt zum Beispiel aber ein Command wie test-path ausführst müsste das Ganze so aussehen (in Klammern setzen).

 

test-path ("C:\" + $Pfadstück + "\Datei.txt")

 

 

Viele Grüße!

bearbeitet von Timsk
Link zu diesem Kommentar

Vielen Dank für den Tipp.

Einfaches aneinanderreihen funktioniert unproblematisch, auch ""Heute ist " + $date" ist nachvollziehbar, aber "$date + " Uhr"" funktioniert offenbar nicht:

 

Das Argument "1" mit dem Wert " Uhr" für "op_Addition" kann nicht in den Typ "System.TimeSpan" konvertiert werden: "Der Wert " Uhr" kann nicht in den Typ "System.TimeSpan" konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format.""

 

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...