Zum Inhalt wechseln


Foto

powershell: .net


  • Bitte melde dich an um zu Antworten
2 Antworten in diesem Thema

#1 blub

blub

    Moderator

  • 6.806 Beiträge

Geschrieben 26. Dezember 2007 - 22:49

Hallo,
Ich experimentiere momentan mit der Powershell 1.0 und komm nicht weiter .

folgender Code läuft einwandfrei
PS C:\mytest> $path="C:\WINDOWS\system32\aclui.dll"
PS C:\mytest> [System.Diagnostics.FileVersionInfo]::GetVersionInfo($path )
Ausgabe:
ProductVersion FileVersion FileName
-------------- ----------- --------
5.2.3790.3959 5.2.3790.3959... C:\WINDOWS\system32\aclui.dll

analog dazu will ich mit der Klasse System.IO.FileInfo
z.B. die Eigenschaft "lastaccesstime" eines Files auslesen

mit
PS C:\mytest> $path="C:\WINDOWS\system32\aclui.dll"
PS C:\mytest> [System.IO.FileInfo]::lastaccesstime($path)

bekomme ich die Ausgabe:
Method invocation failed because [System.IO.FileInfo] doesn't contain a method named 'lastaccesstime'.
At line:1 char:37
+ [System.IO.FileInfo]::lastaccesstime( <<<< $path)

Die Methode existiert natürlich bzw. auch andere Methoden liefern diegleiche Ausgabe


Dagegen läuft problemlos
PS C:\mytest> $path=get-item "C:\WINDOWS\system32\aclui.dll"
PS C:\mytest> write-host $path.LastWriteTime

Ausgabe:
17.02.2007 15:02:40


Was ist an diesem Aufruf falsch?
PS C:\mytest> [System.IO.FileInfo]::lastaccesstime($path)

merci
blub

Nec Cupias, Nec Metuas


#2 woiza

woiza

    Board Veteran

  • 2.056 Beiträge

Geschrieben 27. Dezember 2007 - 15:22

Hallo,
Ich experimentiere momentan mit der Powershell 1.0 und komm nicht weiter .


Trifft sich, ich auch ;)


folgender Code läuft einwandfrei

PS C:\mytest> $path="C:\WINDOWS\system32\aclui.dll"
PS C:\mytest> [System.Diagnostics.FileVersionInfo]::GetVersionInfo($path )
Ausgabe:
ProductVersion FileVersion FileName
-------------- ----------- --------
5.2.3790.3959 5.2.3790.3959... C:\WINDOWS\system32\aclui.dll


Klar, das geht, weil GetVersionInfo ja auch eine (statische) Funktion ist, der du einen Parameter übergibst. Da sie statisch ist, musst du vorher auch kein Objekt instanziieren.

analog dazu will ich mit der Klasse System.IO.FileInfo
z.B. die Eigenschaft "lastaccesstime" eines Files auslesen

mit

PS C:\mytest> $path="C:\WINDOWS\system32\aclui.dll"
PS C:\mytest> [System.IO.FileInfo]::lastaccesstime($path)

bekomme ich die Ausgabe:
Method invocation failed because [System.IO.FileInfo] doesn't contain a method named 'lastaccesstime'.
At line:1 char:37
+ [System.IO.FileInfo]::lastaccesstime( <<<< $path)

Die Methode existiert natürlich bzw. auch andere Methoden liefern diegleiche Ausgabe


Da liegt das Problem. Die Methode existiert eben nicht. lastaccesstime ist eine Eigenschaft eines Objektes vom Typ FileSystemInfo. Du rufst es aber wie eine Methode auf, daher mault die Powershell auch, dass es diese Methode nicht gibt.

Du müsstest folgendes aufrufen:

$path="C:\WINDOWS\system32\aclui.dll"
$file = New-Object -TypeName System.IO.FileInfo $path
$file.LastAccessTime

Mit dem new-Object instanziierst du ein Objekt vom Typ FileInfo und übergibst $path an den Konstruktor. Warum da keine Klammer kommt, müsste man mal den Sprachdesigner fragen.
Danach hast du ein Objekt $file, des Eigenschaft du dann in Zeile 3 abfragst.

Du musst übrigens FileInfo und nicht FileSystemInfo nehmen, weil zweiteres eine abstrakte Klasse ist.


Dagegen läuft problemlos

PS C:\mytest> $path=get-item "C:\WINDOWS\system32\aclui.dll"
PS C:\mytest> write-host $path.LastWriteTime


get-Item macht das gleiche, wie get-Object. Get-Item kann aber nur bestimmte Objekte erzeugen, etwa Filesystem, Registry.


Gruß

woiza

#3 blub

blub

    Moderator

  • 6.806 Beiträge

Geschrieben 27. Dezember 2007 - 22:18

Hallo Woiza,
Vielen Dank für deine SuperErklärung! Da wäre ich wohl alleine nicht drauf gekommen!

Schöne Grüsse
blub

Nec Cupias, Nec Metuas