2016-01-15 26 views
11

Devralmayan izinler için dosya sunucularını arayacağım bir komut dosyası oluşturmaya çalışıyorum. Sonuç olarak dosya adları için 260 karakter sınırına girdim. Gördüğüm bir öneri, bir kaç kez derin olmayan bazı inatçı PS Sürücüleri oluşturmak ve bunları sorgulamak için birkaç kez yardım edeceğini düşündüm.Dosyaları bir sürücüye göre döndürürken geçici bir PS-Drive'ı nasıl sorgulayabilirim?

Sorun yeni PS karşı Get-ChildItem kullandığınızda o bunu atanan adını kullanarak tam ağ yolu ve değil nesneyi dönüyor Sürücüler olduğunu.

# 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 
} 

Eminim, bir sürücü harfi ile bazı uygun kalıcı ağ sürücüleri oluşturursam, bu sorun olmazdı.

Umarım sadece kaçırmadık ama bu senaryo hakkında net% 100 Technet for New-PSDrive değildi.

yeni sürücü adı göreli yolları dönerken ps-sürücü ve orada referans klasörleri yapmak için bir yol arıyorum. Yaptığım bir psdrive çıktısını düşünün (G :) daha sonra eşlenmiş ağ sürücülerimden biri (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   

Birden geçici çözümler benim kesin durum için var olduğunu farkındayım ama ben New-PSDrive ile gösteriyorum davranışını anlamak istiyorum.

+0

Şimdi kelle için aptal hissediyorum ama sorun kalıcı sürücüler. Eğer kalıcı bir şey yaparsam, göreceli yolları alırım. Bunu düzeltmek için hala belgelere ihtiyacım var .... Bir şey bulursanız somut bir şey yapmakta özgürsünüz. – Matt

+0

Bu sizin için ne soruyor olabilirsiniz, ama sınır 260 karakter değilse ve 32.000 mi? https://github.com/alphaleonis/AlphaFS –

+0

@MickyBalladelli Evet Buna birkaç kez bir öneri olarak rastladım. İnsanları bu kadar bilgili olmayanlarla paylaşacağım için dış kütüphanelere olan güveni ortadan kaldırmak istedim. İpucu için teşekkürler. Başka birine yardımcı olabilir. Bu sorun sadece bu yüzden sadece arkasındaki sebebi anlamaya çalışıyorum. – Matt

cevap

6

görünüyor için işe yarayabilecek böyle bir şey 'subst' kullanarak karşı değil: PowerShell yolu ve Sağlayıcı yolunu . PowerShell yolları, PowerShell dışında görünmez.

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

Ama Get-Item X:\System32\notepad.exe bazı dosyayı temsil eden FileInfo nesne oluşturmak başardı. Peki, ortaya çıkan FileInfo nesnesi tarafından hangi dosya temsil edilir? FileInfo nesne X: sürücü PowerShell hakkında hiçbir şey bilmiyor yana

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

, bu dahili anlayabilir dosya sistemi API'sini kullanan bir yolunu saklamak zorundadır.

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

döndü FileInfo ve DirectoryInfo nesneler hiçbir şey bilmiyor: Eğer bazı ağ yoluna PowerShell sürücü, nokta oluştururken

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

aynı olur: Sen Sağlayıcı yoluna PowerShell yolunu dönüştürmek için Convert-Path cmdlet'ini kullanabilirsiniz yaklaşık Y:, bu nedenle bu PowerShell sürücüsüne göre yollara sahip olamaz. Dahili olarak kullanılan dosya sistemi API bunları anlamayacaktır. Eğer -Persist seçeneğini kullandığınızda

şeyler değişir. Bu durumda, PowerShell dışındaki dosya sistemi API'sı tarafından anlaşılabilen gerçek eşlenmiş sürücüler oluşturulacaktır.

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

Gördüğünüz gibi size New-PSDrive cmdlet'indeki ama Z:\ sormak gibi Root değil \\Computer\Share olacaktır. Bu durumda, Z: gerçek bir sürücü olduğundan, Get-Item veya Get-ChildItem cmdlet tarafından döndürülen FileInfo ve DirectoryInfo nesneler, ilgili yollara sahip olabilir.

+0

Teşekkürler PetSerAl. Bunu görmeni umuyordum. Bu yeni bir problemdi ama şimdi neden böyle olduğunu anladım. – Matt

+0

"-Persist" kullanma Aşağıdaki hatayı alıyorum: "Yeni-PSDrive: Ağ kaynak türü doğru değil" – Segolas

+0

@Segolas Ağ sürücüsü paylaşmaya başvurabilir: '\\ Bilgisayar \ Share '- ancak bazı klasörlere değil \ \ Bilgisayar \ Hisse \ Folder'. – PetSerAl

1

test edilmedi, ama eğer iki farklı şeyler karıştırma gibi sen

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

Hala neden beklediğim şekilde çalışmadığını görmek için elimden geleni yapıyorum ama bu yine de merak ediyorum. – Matt