Fragensteller
Lokales Laufwerk wird erst nach einem Zugriff darauf sichtbar

Allgemeine Diskussion
-
Hoi zäme
Ich entwickle ein PowerShell-Skript für einen Server. Bei dem wird aber das lokale D-Laufwerk erst sichtbar, wenn ich schon darauf zugegriffen habe. Woran liegt das bzw. wie kann ich PowerShell dazu bringen, seine Laufwerke richtig zu sortieren?
Liebe Grüsse
Thiemo
PS C:\Users\s00489> Get-PSDrive Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- Alias Alias C 29.65 38.68 FileSystem C:\ Cert Certificate \ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE I 217.35 132.65 FileSystem I:\ K 217.35 132.65 FileSystem K:\ L 217.35 132.65 FileSystem L:\ Variable Variable WSMan WSMan PS C:\Users\s00489> Get-PSDrive Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- Alias Alias C 29.65 38.68 FileSystem C:\ Cert Certificate \ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE I 217.35 132.65 FileSystem I:\ K 217.35 132.65 FileSystem K:\ L 217.35 132.65 FileSystem L:\ Variable Variable WSMan WSMan PS C:\Users\s00489> Get-Item 'D:' Directory: Mode LastWriteTime Length Name ---- ------------- ------ ---- d--hs 25.02.2015 15:16 D:\ PS C:\Users\s00489> Get-PSDrive Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- Alias Alias C 29.65 38.68 FileSystem C:\ Cert Certificate \ D 119.01 154.39 FileSystem D:\ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE I 217.35 132.65 FileSystem I:\ K 217.35 132.65 FileSystem K:\ L 217.35 132.65 FileSystem L:\ Variable Variable WSMan WSMan PS C:\Users\s00489>
- Typ geändert Denniver ReiningMVP, Moderator Sonntag, 7. August 2016 01:01 ....
Alle Antworten
-
Hallo Thiemo
warum Get-PSDrive das Laufwerk zunächst nicht auflistet, kann ich Dir nicht sagen. Um was für einen Laufwerkstyp handelt es sich denn? Um das mit einem USB-Laufwerk nachzuvollziehen, habe ich PowerShell (4.0) gestartet Get-PSDrive ausgeführt, anschließend einen USB-Stick eingesetzt und wieder Get-PSDrive ausgefühlt - und in der Liste erschein auch das neue Laufwerk. Also kein Problem an der Stelle.
Bezüglich der Sortierung. Was ist richtig? Get-PSDrive listet die Laufwerke nach Namen sortiert. Wenn Du die Ausgabe z.B. nach Provider-Typ sortieren möchtest, kannst Du das mit Sort-Object hinbekommen:
Get-PSDrive | Sort-Object -Property Provider
Frank-Peter Schultze www.out-web.net
-
Hallo Peter
Vielen Dank für die Antwort.
Oh, entschuldige bitte. Mit "sortieren" meinte ich nicht wirklich in eine bestimmte Reihenfolge bringen, sondern dass PowerShell die Laufwerke kennt, die tatsächlich da sind. Hintergrund ist der, dass ich aus PowerShell ein Anwendung, die auf D liegt, ausführen will. Dafür habe ich Test-Path benutzt, um sicher zu stellen, dass die Anwendung auch wirklich am erwarteten Ort ist. Der Test schlägt fehl, weil das Laufwerk D: nicht kennt.
Ich kenne die Hardware-Konfiguration unseres Servers leider nicht. Es müsste der Grösse (273 GB) nach zu urteilen, eine Festplattenpartition sein.
-
Wir müssen den Server wohl mit Applikationsvirtualisierung betreiben. Beim Start von PowerShell bekomme ich den fehler
Attempting to perform the InitializeDefaultDrives operation on the 'FileSystem' provider failed.
Ich habe dann den folgenden Code eingebaut, um die Laufwerke bekannt zu machen.foreach ( # drive types: # 3 - local hard drives # 4 - network drives # 5 - removable drives (DVD) $drive in Get-CimInstance ` -ClassName Win32_LogicalDisk ` -Filter 'DriveType=3 or DriveType=4' | select DeviceId) { try { assert-debug('$drive: ' + $drive) assert-debug('clear drive: ' + $drive.DeviceId.trimend(':')) Get-PSDrive $drive.DeviceId.trimend(':')) } catch { # we silently any error that may occur } }
Wenn ich den Codeblock im Hauptscript habe, dann funktiniert es, D wird "gemappt".
2015-03-04 17:02:34,233 DEBUG [?.CallSite.Target(:0)] - $drive: @{DeviceId=C:} 2015-03-04 17:02:34,248 DEBUG [?.CallSite.Target(:0)] - clear drive: C 2015-03-04 17:02:34,393 DEBUG [?.CallSite.Target(:0)] - C 2015-03-04 17:02:34,403 DEBUG [?.CallSite.Target(:0)] - $drive: @{DeviceId=D:} 2015-03-04 17:02:34,407 DEBUG [?.CallSite.Target(:0)] - clear drive: D 2015-03-04 17:02:34,464 DEBUG [?.CallSite.Target(:0)] - D
Wenn ich den Codeblock in einer Funktion in einem Modul habe, werden Fehler geworfen.
2015-03-04 17:03:29,956 DEBUG [?.CallSite.Target(:0)] - $drive: @{DeviceId=C:} 2015-03-04 17:03:29,971 DEBUG [?.CallSite.Target(:0)] - clear drive: C 2015-03-04 17:03:30,119 DEBUG [?.CallSite.Target(:0)] - C 2015-03-04 17:03:30,125 DEBUG [?.CallSite.Target(:0)] - $drive: @{DeviceId=D:} 2015-03-04 17:03:30,129 DEBUG [?.CallSite.Target(:0)] - clear drive: D Get-PSDrive : Cannot find drive. A drive with the name 'D' does not exist. At I:\WA_ANALYSE\AAA_INFA_CORE\Libs\BFS.Powershell.Utility\BFS.Powershell.Utility.psm1:315 char:25 + Get-PSDrive $drive.DeviceId.trimend(':')) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (D:String) [Get-PSDrive], DriveNotFoundException + FullyQualifiedErrorId : GetLocationNoMatchingDrive,Microsoft.PowerShell.Commands.GetPSDriveCommand
Also habe ich eine Lösung, aber ich hätte sie gerne in einem Modul gehabt. Danke für Deine Unterstützung Peter.
- Bearbeitet ThiemoKellner Mittwoch, 4. März 2015 16:21