2016-01-15 17 views
11

Ich versuche ein Skript zu erstellen, in dem ich die Dateiserver nach nicht vererbten Berechtigungen durchsuchen werde. Ich habe die 260 Zeichen Grenze für Dateinamen als Ergebnis erreicht. Ein Vorschlag, den ich sah, dass ich dachte, würde helfen, war ein paar Mal, um einige nicht persistente PS-Laufwerke ein paar Ebenen tief zu erstellen und diese abzufragen.Wie kann ich ein temporäres PS-Laufwerk abfragen, während Dateien mit einem Namen relativ zum Laufwerk zurückgegeben werden?

Problem ist, wenn ich Get-ChildItem gegen die neue PS verwende Laufwerke es Objekt mit dem vollen Netzwerkpfad und nicht mit dem Namen I zugeordnet zurückkehrt.

Ich bin sicher, dass ich dieses Problem nicht hätte, wenn ich einige richtige persistente Netzlaufwerke mit einem Laufwerksbuchstaben erstellt.

Hoffentlich habe ich es gerade nicht verfehlt, aber Technet for New-PSDrive war nicht 100% klar über dieses Szenario.

Ich bin auf der Suche nach einer Möglichkeit, ps-Laufwerk und Referenz-Ordner zu machen, während Pfade relativ zum neuen Laufwerksnamen zurückgeben. Betrachten Sie die Ausgabe von einem psdrive, das ich gemacht habe (G :) dann eines meiner gemappten Netzlaufwerke (M :).

PS M:\> Get-ChildItem G:\ 

    Directory: \\server01\COMMON\Folder 

Mode    LastWriteTime  Length Name                            
----    -------------  ------ ----                            
d----   6/18/2011 8:14 AM   Folder 1                           
d----   6/18/2011 8:14 AM   Folder 2 

PS M:\> Get-ChildItem M:\ 

    Directory: M:\ 

Mode    LastWriteTime  Length Name                            
----    -------------  ------ ----                            
d----   5/8/2015 11:00 AM   Backup                           
d----   5/8/2015 11:00 AM   covers                           
d----   5/8/2015 11:00 AM   drop                            
d----   5/8/2015 11:00 AM   Expense   

Ich bin mir bewusst, dass mehrere Abhilfen für meine genaue Situation existiert, aber ich möchte das Verhalten verstehen, dass ich mit New-PSDrive bin zeigt.

+0

Ich fühle mich jetzt albern für das Kopfgeld, aber das Problem ist persistente Laufwerke. Wenn ich eine dauerhafte mache, dann bekomme ich die relativen Pfade. Ich muss noch Unterlagen finden, um das zu untermauern .... Wenn jemand etwas Konkretes findet, ist es eine gute Antwort. – Matt

+0

Dies ist möglicherweise nicht das, wonach Sie fragen, aber was ist, wenn das Limit nicht 260 Zeichen und 32.000 ist? https://github.com/alphaleonis/AlphaFS –

+0

@MickyBalladelli Yeah Ich lief das als eine Empfehlung mehrmals. Ich wollte die Abhängigkeit von externen Bibliotheken beseitigen, da ich dies mit Leuten teilen werde, die nicht so versiert sind. Danke für den Tipp, egal. Es könnte jemand anderem helfen. Dieses Problem wird nur abgehört, also versuche ich, den Grund dafür herauszufinden. – Matt

Antwort

6

Sieht aus wie Sie zwei verschiedene Dinge mischen könnten aufzuarbeiten: Powershell-Pfad und Provider-Pfad . PowerShell-Pfade sind außerhalb von PowerShell nicht sichtbar.

New-PSDrive X FileSystem C:\Windows 
(Get-Item X:\System32\notepad.exe).get_Length() #OK 
([IO.FileInfo]'X:\System32\notepad.exe').get_Length() #Error 

Aber Get-Item X:\System32\notepad.exe schaffte FileInfo Objekt zu erstellen, die eine Datei darstellt. Also, welche Datei wird durch das resultierende FileInfo Objekt dargestellt?

(Get-Item X:\System32\notepad.exe).FullName 
# C:\Windows\System32\notepad.exe 

Da das FileInfo Objekt weiß nichts über Powershell X: fahren, hat es einen Pfad zu speichern, die intern verwendet das Dateisystem-API, die es verstehen kann. Sie können Convert-Path Cmdlets verwenden Powershell-Pfad zum Provider Pfad zu konvertieren:

Convert-Path X:\System32\notepad.exe 
# C:\Windows\System32\notepad.exe 

Gleiche passiert, wenn Sie die Powershell-Laufwerk zu erstellen, welcher Punkt zu einem gewissen Netzwerkpfad:

New-PSDrive Y FileSystem \\Computer\Share 
Get-ChildItem Y:\ 

Retour FileInfo und DirectoryInfo Objekte wissen nichts etwa Y:, so dass sie keine Pfade relativ zu diesem PowerShell-Laufwerk haben können. Intern verwendete Dateisystem API wird sie nicht verstehen.

Die Dinge ändern sich, wenn Sie die Option -Persist verwenden. In diesem Fall werden tatsächlich zugeordnete Laufwerke erstellt, die von der Dateisystem-API außerhalb von PowerShell verstanden werden können.

New-PSDrive Z FileSystem \\Computer\Share -Persist|Format-Table *Root 
# Root  : Z:\ 
# DisplayRoot : \\Computer\Share 

Wie Sie sehen können, wird die Root nicht \\Computer\Share, wie Sie in New-PSDrive Cmdlets fragen, aber Z:\. Da Z: in diesem Fall ein reales Laufwerk ist, können FileInfo und DirectoryInfo Objekte, die von Get-Item oder Get-ChildItem zurückgegeben werden, Cmdlet-Pfade relativ dazu haben.

+0

Danke PetSerAl. Ich hatte gehofft, dass du das sehen würdest. Ich war neu, das war das Problem, aber ich verstehe, warum das jetzt der Fall ist. – Matt

+0

Mit "-Persist" erhalte ich den folgenden Fehler: "New-PSDrive: Der Netzwerkressourcentyp ist nicht korrekt" – Segolas

+0

@Segolas Netzwerklaufwerk kann auf Freigabe verweisen: '\\ Computer \ Share' - aber nicht zu irgendeinem Ordner' \ \ Computer \ Freigabe \ Ordner'. – PetSerAl

1

nicht getestet haben, aber wenn Sie mit ‚subst‘ nicht dagegen sind so etwas wie dies für Sie

function Get-FreeDriveLetter { 
    $drives = [io.driveinfo]::getdrives() | % {$_.name[0]} 
    $alpha = 65..90 | % { [char]$_ } 
    $avail = diff $drives $alpha | select -ExpandProperty inputobject 
    $drive = $avail[0] + ':' 
    $drive 
} 

$file = gi 'C:\temp\file.txt' 
$fullname = $file.FullName 

if ($fullname.length -gt 240) { 
    $drive = Get-FreeDriveLetter 
    $path = Split-Path $fullname 
    subst $drive $path 
    $subst = $true 
    rv path 
    $fullname = Join-Path $drive $(Split-Path $fullname -Leaf) 
} 

$fullname 
+0

Ich halte immer noch aus, um zu sehen, warum es nicht so funktioniert, wie ich es erwarte, aber das ist neugierig, es trotzdem zu wissen. – Matt