marabunta
Goto Top

PowerShell Transkript Problem

Hi,

ich will in einem Transkript Log(Start-Transcript) die Ordnerinhalte auflisten...

Das funktioniert:
$DirDesktop=$env:Userprofile + "\Desktop"  
gci $DirDesktop

Das hier allerdings nicht:
(gci "$env:ProgramFiles").FullName  

Der entsprechende Eintrag bleibt einfach leer. In der Konsole funktioniert es.
Warum schreibt das Log die Ausgabe nicht mit?

Danke.


Edit:
Damit gehts dann doch:
gci "$env:ProgramFiles"|select -ExpandProperty Fullname  

Die Frage bleibt - warum?

Content-Key: 330036

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

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: H41mSh1C0R
H41mSh1C0R 21.02.2017 um 06:10:53 Uhr
Goto Top
Moin,

mit dem gci bekommst du ja ein Set von Objekten und nicht ein einzelnes.
Dieses Set kannst du dann via Pipe weiter aufdrieseln. In dem Fall mit "select -ExpandProperty Fullname".

VG
Mitglied: 132456
132456 21.02.2017 um 06:20:41 Uhr
Goto Top
Powershell arbeitet objektorientiert. gci liefert dir eine Liste mit Objekten zurück (items, welche Ordner und Files repräsentieren). In deinem ersten Befehl gci $DirDesktop lässt du dir einfach die Liste ausgeben, die in $DirDesktop gespeichert ist. Das funktioniert.

Bei deinem zweiten Befehl (gci "$env:ProgramFiles").FullName) versucht du hingegen auf der Liste das Fullname Attribut aufzurufen, was es in einer Liste nicht gibt. So wie du den Ausdruck hier aufbaust, behandelst du durch die Punktnotation die Liste wie ein Objekt und sagst "hey Liste, gib mir mal deinen Fullname".

Was du in wirklichkeit machen willst ist, auf den einzelnen Objekten das Fullname Attribut aufzurufen, nicht auf er Liste selbst. In deinem letzten Befehl der funktioniert machst du genau das.

gci "$env:ProgramFiles"| select -ExpandProperty Fullname  

Hier "erzeugst" du erst die Liste (gci "$env:ProgramFiles") und reichst den Output Objektweise (das passiert hier durch das Pipe-Zeichen | ) an den zweiten Befehl weiter und rufst dann dort für jedes Objekt dass weiter gereicht wird das Fullname Attribut auf. Das funktioniert dann.

Du musst bei Powershell immer diesen Objektorientierten Ansatz berücksichtigten und dir merken, in welchem Kontext du dich gerade befindest.

Wenn du mit Powershell arbeitest solltest du unbedingt ein Grundverständnis für OOP haben und dir das Pipe-Lining Konzept einmal verinnerlichen, ansonsten kann man mit der Powershell nicht vernünftig arbeiten. Ich empfehle diesen Artikel:

https://msdn.microsoft.com/de-de/powershell/scripting/getting-started/fu ...

LG
Mitglied: 132272
132272 21.02.2017 aktualisiert um 09:11:35 Uhr
Goto Top
Zitat von @Marabunta:
> (gci "$env:ProgramFiles").FullName  
> 
Der entsprechende Eintrag bleibt einfach leer. In der Konsole funktioniert es.
Warum schreibt das Log die Ausgabe nicht mit?
Weil du hier das Array-Objekt "Fullname" der Collection(gci) ansich in die Konsole ausgibst und nicht die einzelnen Strings im Array.
Btw. die Anführungszeichen um $env:ProgramFiles sind hier überflüssig.

Gruß
Mitglied: Marabunta
Marabunta 21.02.2017 um 11:37:52 Uhr
Goto Top
verstehe ich das also richtig, dass "Start-Transcript" nur ausgegebene Objekte mit aufzeichnet? Muss mir mal die Doku dazu genauer ansehen
Mitglied: 132456
132456 21.02.2017 um 20:09:32 Uhr
Goto Top
Zitat von @Marabunta:

verstehe ich das also richtig, dass "Start-Transcript" nur ausgegebene Objekte mit aufzeichnet? Muss mir mal die Doku dazu genauer ansehen

Start-Transcript zeichnet einfach alles auf, was während einer Powershell-Session bei der Abarbeitung von Befehlen ausgegeben werden würde. Das wird dann in die Logfile geschrieben.

https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powe .... Daher ist der Name "Transkript" ja ganz passend. Wie ein fleißiger Student, der Wort für Wort einfach alles mitschreibt, was der Professor sagt face-smile ...