PowerShell Transkript Problem
Hi,
ich will in einem Transkript Log(Start-Transcript) die Ordnerinhalte auflisten...
Das funktioniert:
Das hier allerdings nicht:
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:
Die Frage bleibt - warum?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 330036
Url: https://administrator.de/forum/powershell-transkript-problem-330036.html
Ausgedruckt am: 03.04.2025 um 04:04 Uhr
5 Kommentare
Neuester Kommentar

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

Zitat von @Marabunta:
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.> (gci "$env:ProgramFiles").FullName
>
Warum schreibt das Log die Ausgabe nicht mit?
Btw. die Anführungszeichen um $env:ProgramFiles sind hier überflüssig.
Gruß

Zitat von @Marabunta:
verstehe ich das also richtig, dass "Start-Transcript" nur ausgegebene Objekte mit aufzeichnet? Muss mir mal die Doku dazu genauer ansehen
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