2016-01-15 18 views
11

Sto provando a creare uno script in cui cercherò i file server per le autorizzazioni non ereditate. Di conseguenza, ho raggiunto il limite di 260 caratteri per i nomi dei file. Un suggerimento che ho visto, che pensavo sarebbe stato di aiuto, un paio di volte è stato quello di creare alcuni PS Drives non persistenti un paio di livelli profondi e interrogarli.Come posso interrogare un PS-Drive temporaneo mentre restituisco file con un nome relativo all'unità?

Il problema è che quando uso Get-ChildItem contro il nuovo PS Drives sta tornando oggetto con il percorso di rete completo e non utilizzando il nome ho assegnato esso.

# Cycle the folders 
Get-ChildItem $rootPath -Directory | select -first 1 | ForEach-Object{ 
    $target = $_ 

    # Create a PS Drive for each sub directory and get all the folders 
    [void](New-PSDrive -Name $target.Name -PSProvider FileSystem $target.FullName) 

    # Get the file objects. 
    Get-ChildItem "$($target.Name):\" -Recurse 
} 

Sono sicuro che se avessi creato alcune unità di rete persistenti con una lettera di unità, non avrei questo problema.

Speriamo che non mi sia mancato ma lo Technet for New-PSDrive non era al 100% chiaro su questo scenario.

Sto cercando un modo per creare ps-drive e fare riferimento a tali cartelle durante la restituzione dei percorsi relativi al nuovo nome dell'unità. Considera l'output di uno psdrive che ho creato (G :), quindi una delle mie unità di rete mappate (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   

Sono consapevole che più soluzioni alternative esistono per la mia situazione esatta, ma vorrei capire il comportamento che sto mostrando con New-PSDrive.

+0

Ora mi sento stupido per la taglia, ma il problema sono le unità persistenti. Se ne faccio uno persistente, ottengo i relativi percorsi. Devo ancora trovare la documentazione per sostenerlo ... Se qualcuno trova qualcosa di concreto, sentiti libero di fare una risposta. – Matt

+0

Questo potrebbe non essere quello che stai chiedendo, ma cosa succede se il limite non era di 260 caratteri, ed erano 32.000? https://github.com/alphaleonis/AlphaFS –

+0

@MickyBalladelli Sì, mi sono imbattuto in questo come una raccomandazione più volte. Volevo rimuovere la dipendenza dalle librerie esterne, perché la condividerò con persone non altrettanto esperte. Grazie per la punta a prescindere. Potrebbe aiutare qualcun altro. Questo problema è solo un bug, quindi sto cercando di capire il motivo alla base. – Matt

risposta

6

Sembra che si stia mescolando due cose diverse: percorso PowerShell e il percorso Provider . I percorsi di PowerShell non sono visibili al di fuori di PowerShell.

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

Ma Get-Item X:\System32\notepad.exe riusciti a creare un oggetto FileInfo, che rappresenta alcuni file. Quindi, quale file è rappresentato dall'oggetto FileInfo risultante?

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

Poiché l'oggetto FileInfo sa nulla PowerShell guidare X:, si deve memorizzare un percorso, che utilizza internamente il sistema API fascicolo che si può capire. È possibile utilizzare Convert-Path cmdlet per convertire percorso PowerShell al percorso Provider:

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

stesso accade quando si crea l'unità di PowerShell, che indicano un certo percorso di rete:

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

restituito FileInfo e DirectoryInfo oggetti sanno nulla circa Y:, quindi non possono avere percorsi relativi a tale unità PowerShell. Le API del file system utilizzate internamente non le capiranno.

Le cose cambiano quando si utilizza l'opzione -Persist. In questo caso verranno create unità mappate reali, che possono essere comprese dall'API del file system al di fuori di PowerShell.

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

Come si può vedere, la Root sarà non \\Computer\Share come si chiede nel New-PSDrive cmdlet, ma Z:\. Dal momento che è un'unità reale in questo caso, gli oggetti FileInfo e DirectoryInfo restituiti dal cmdlet Get-Item o Get-ChildItem possono avere percorsi relativi ad esso.

+0

Grazie PetSerAl. Speravo che l'avresti visto. Sono nuovo questo era il problema, ma non capisco perché è il caso ora. – Matt

+0

Utilizzando "-Persist" viene visualizzato il seguente errore: "New-PSDrive: il tipo di risorsa di rete non è corretto" – Segolas

+0

@Segolas L'unità di rete può fare riferimento alla condivisione: '\\ Computer \ Share' - ma non a qualche cartella' \ \ Computer \ Share \ Folder'. – PetSerAl

1

non sono testati, ma se non siete anziché utilizzare 'subst' qualcosa di simile potrebbe funzionare per voi

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

Sto ancora cercando di capire perché non funziona come mi aspetto, ma questo è curioso di sapere comunque. – Matt