none
Lokales Laufwerk wird erst nach einem Zugriff darauf sichtbar RRS feed

  • 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>
    
    Mittwoch, 4. März 2015 12:29

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

    Mittwoch, 4. März 2015 14:42
  • 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.

    Mittwoch, 4. März 2015 14:59
  • 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.


    Mittwoch, 4. März 2015 16:20