emeriks
Goto Top

PowerShell - Komische Ausgabe

Hi,
erstelle ich ein PS-Script mit
...
Get-Help Get-Item
$host.EnterNestedPrompt()
am Ende und starte dieses Script direkt aus dem Explorer, dann kommt folgendes als Ausgabe:
CommonParameters         : True
WorkflowCommonParameters : False
details                  : @{name=Get-Item; noun=Item; verb=Get}
Syntax                   : @{syntaxItem=System.Object}
parameters               : @{parameter=System.Object}
inputTypes               : @{inputType=}
relatedLinks             : @{navigationLink=System.Management.Automation.PSObject}
returnValues             : @{returnValue=}
aliases                  : gi

remarks                  : Die Hilfedateien für dieses Cmdlet können von "Get-Help" auf diesem Computer nicht gefunden  
                           werden. Es wird nur ein Teil der Hilfe angezeigt.
                               -- Sie können die Hilfedateien für das Modul, das dieses Cmdlet enthält, herunterladen
                           und installieren, indem Sie "Update-Help" verwenden.  
                               -- Wenn Sie das Hilfethema für dieses Cmdlet online anzeigen möchten, geben Sie
                           Folgendes ein: "Get-Help Get-Item -Online", oder  
                                  gehen Sie zu "https://go.microsoft.com/fwlink/?LinkID=113319".  
PSSnapIn                 :
alertSet                 :
description              :
examples                 :
Synopsis                 :
                           Get-Item [-Path] <string> [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>]
                           [-Force] [-Credential <pscredential>] [-UseTransaction] [-Stream <string[]>]
                           [<CommonParameters>]

                           Get-Item -LiteralPath <string> [-Filter <string>] [-Include <string[]>] [-Exclude
                           <string[]>] [-Force] [-Credential <pscredential>] [-UseTransaction] [-Stream <string[]>]
                           [<CommonParameters>]

ModuleName               : Microsoft.PowerShell.Management
nonTerminatingErrors     :
xmlns:command            : http://schemas.microsoft.com/maml/dev/command/2004/10
xmlns:dev                : http://schemas.microsoft.com/maml/dev/2004/10
xmlns:maml               : http://schemas.microsoft.com/maml/2004/10
Name                     : Get-Item
Category                 : Cmdlet
Component                :
Role                     :
Functionality            :
Die Shell bleibt dabei wie gewollt geöffnet. Gebe ich nun dort
Get-Help Get-Item
ein, dann kommt wie erwartet
NAME
    Get-Item

SYNTAX
    Get-Item [-Path] <string>  [<CommonParameters>]

    Get-Item  [<CommonParameters>]


ALIASE
    gi


HINWEISE
    Die Hilfedateien für dieses Cmdlet können von "Get-Help" auf diesem Computer nicht gefunden werden. Es wird nur  
    ein Teil der Hilfe angezeigt.
        -- Sie können die Hilfedateien für das Modul, das dieses Cmdlet enthält, herunterladen und installieren, indem
    Sie "Update-Help" verwenden.  
        -- Wenn Sie das Hilfethema für dieses Cmdlet online anzeigen möchten, geben Sie Folgendes ein: "Get-Help  
    Get-Item -Online", oder  
           gehen Sie zu "https://go.microsoft.com/fwlink/?LinkID=113319".  


Wieso funktioniert das nicht, wenn man das über ein Script ausführt?

Edit: Der Witz - mal funktioniert das gleich beim Script-Start und mal nicht. Auf dem selben Rechner. Hintereinander probiert.

E.

Content-Key: 361601

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

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: colinardo
Lösung colinardo 18.01.2018 aktualisiert um 17:33:34 Uhr
Goto Top
Servus,
schau dir mal die Ausgabe von
Get-Help get-item | gm * -Force
an. Dort siehst du das das Ergebnis ein Object und kein String ist.
 TypeName: MamlCommandHelpInfo#Microsoft.PowerShell.Management#Get-Item

Name                 MemberType   Definition                                                                                                      
----                 ----------   ----------                                                                                                      
Equals               Method       bool Equals(System.Object obj)                                                                                  
GetHashCode          Method       int GetHashCode()                                                                                               
GetType              Method       type GetType()                                                                                                  
ToString             Method       string ToString()                                                                                               
alertSet             NoteProperty MamlCommandHelpInfo#alertSet alertSet=@{alert=System.Management.Automation.PSObject; title=}                  
Category             NoteProperty string Category=Cmdlet                                                                                          
Component            NoteProperty object Component=null                                                                                           
description          NoteProperty psobject description=System.Management.Automation.PSObject                                                  
details              NoteProperty MamlCommandHelpInfo#details details=@{verb=Get; noun=Item; name=Get-Item; description=System.Management.Autom...
examples             NoteProperty MamlCommandHelpInfo#examples examples=@{example=System.Management.Automation.PSObject}                        
Functionality        NoteProperty object Functionality=null                                                                                       
inputTypes           NoteProperty MamlCommandHelpInfo#inputTypes inputTypes=@{inputType=@{type=@{description=System.Management.Automation.PSObj...
ModuleName           NoteProperty string ModuleName=Microsoft.PowerShell.Management                                                               
Name                 NoteProperty string Name=Get-Item                                                                                            
nonTerminatingErrors NoteProperty System.String nonTerminatingErrors=                                                                             
parameters           NoteProperty MamlCommandHelpInfo#parameters parameters=@{parameter=System.Management.Automation.PSObject}                  
PSSnapIn             NoteProperty object PSSnapIn=null                                                                                            
relatedLinks         NoteProperty MamlCommandHelpInfo#relatedLinks relatedLinks=@{navigationLink=System.Management.Automation.PSObject}         
returnValues         NoteProperty MamlCommandHelpInfo#returnValues returnValues=@{returnValue=@{type=@{description=System.Management.Automation...
Role                 NoteProperty object Role=null                                                                                                
Synopsis             NoteProperty string Synopsis=Ruft das Element am angegebenen Speicherort ab.                                                 
syntax               NoteProperty MamlCommandHelpInfo#syntax syntax=@{syntaxItem=System.Management.Automation.PSObject}                         
terminatingErrors    NoteProperty System.String terminatingErrors=                                                                                
xmlns:command        NoteProperty string xmlns:command=http://schemas.microsoft.com/maml/dev/command/2004/10                                      
xmlns:dev            NoteProperty string xmlns:dev=http://schemas.microsoft.com/maml/dev/2004/10                                                  
xmlns:maml           NoteProperty string xmlns:maml=http://schemas.microsoft.com/maml/2004/10                                                     
xmlns:MSHelp         NoteProperty string xmlns:MSHelp=http://msdn.microsoft.com/mshelp            

Willst du eine String-Ausgabe nutze
Get-Help get-item | out-string
Also wenn du zwingend String-Ausgaben haben möchstest solltest du das der Shell immer auch sagen denn sonst entscheidet die Shell das für dich.
Folgendes geht z.B. nicht (Datei bleibt leer)
get-help Get-Item | set-content "C:\datei.txt"  
Grund: Die ToString() Methode des Objects liefert keinen Text, was uns ein
(get-help Get-Item).toString()
bestätigt.

Immer dran denken auch wenn in der Shell alles nach Text aussieht sind es in den meisten Fällen Objekte statt einfache Strings.

Grüße Uwe
Mitglied: emeriks
emeriks 18.01.2018 um 17:45:08 Uhr
Goto Top
Danke, Uwe.
Das klappt so. Aber verstehen muss ich das jetzt nicht, oder? Ich meine, ich kenne schon den Unterschied zwischen den einzelnen Datentypen, aber eine Kommandoausgabe (Echo) sollte doch jedesmal gleich sein, egal ob am Prompt oder im Script ausgeführt? Zumal es ja mal funktioniert und mal nicht. (Mein konkretes Beispiel)
Mitglied: colinardo
colinardo 18.01.2018 aktualisiert um 18:00:23 Uhr
Goto Top
aber eine Kommandoausgabe (Echo) sollte doch jedesmal gleich sein egal ob am Prompt oder im Script ausgeführt? Zumal es ja mal funktioniert und mal nicht. (Mein konkretes Beispiel)
Nein das kommt drauf an, weil das die Shell wohl je nachdem entscheidet was vor dem Output von get-help ausgegeben wurde.
Die Shell schickt solche Objekte meist durch eine Formatting-Engine (Format-CMDLets) für den Output, in deinem Beispiel ist das dann ein format-list Ausgabe.