2016-01-15 15 views
11

Tôi đang cố gắng tạo tập lệnh nơi tôi sẽ tìm kiếm máy chủ tệp cho các quyền không được kế thừa. Tôi đã chạy vào giới hạn 260 ký tự cho tên tệp như là kết quả. Một gợi ý tôi thấy, mà tôi nghĩ sẽ giúp, một vài lần là tạo ra một số ổ đĩa PS không liên tục ở mức độ sâu và truy vấn chúng.Tôi làm cách nào để truy vấn PS-Drive tạm thời trong khi trả lại tệp có tên liên quan đến ổ đĩa?

Vấn đề là khi tôi sử dụng Get-ChildItem đối với Ổ đĩa PS mới, nó sẽ trả về đối tượng có đường dẫn mạng đầy đủ và không phải bằng tên tôi đã gán.

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

Tôi chắc chắn rằng nếu tôi tạo một số ổ đĩa mạng liên tục thích hợp với ký tự ổ đĩa, tôi sẽ không gặp phải vấn đề này.

Hy vọng rằng tôi không bỏ lỡ nó nhưng Technet for New-PSDrive không rõ 100% về trường hợp này.

Tôi đang tìm cách tạo ổ đĩa ps và tham chiếu có các thư mục trong khi trả về các đường dẫn tương ứng với tên ổ đĩa mới. Hãy xem xét đầu ra từ một psdrive tôi đã thực hiện (G :) sau đó một trong các ổ đĩa mạng được ánh xạ của tôi (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   

Tôi biết rằng nhiều biện pháp khắc phục tồn tại cho tình hình chính xác của tôi, nhưng tôi muốn hiểu được hành vi mà tôi đang thể hiện với New-PSDrive.

+0

Tôi cảm thấy ngớ ngẩn về tiền thưởng nhưng vấn đề là các ổ đĩa liên tục. Nếu tôi thực hiện một liên tục thì tôi sẽ có được các đường dẫn tương đối. Tôi vẫn cần phải tìm tài liệu để sao lưu điều đó .... Nếu ai đó tìm thấy thứ gì đó cụ thể, hãy tự do làm cho câu trả lời đó. – Matt

+0

Điều này có thể không phải là những gì bạn đang yêu cầu, nhưng nếu giới hạn không phải là 260 ký tự, và nó là 32.000? https://github.com/alphaleonis/AlphaFS –

+0

@MickyBalladelli Vâng tôi chạy vào đó như là một khuyến nghị nhiều lần. Tôi muốn loại bỏ sự phụ thuộc vào các thư viện bên ngoài vì tôi sẽ chia sẻ điều này với những người không hiểu biết. Cảm ơn cho tip bất kể. Nó có thể giúp người khác. Vấn đề này chỉ là bugging vì vậy tôi đang cố gắng tìm ra lý do đằng sau nó. – Matt

Trả lời

6

Hình như bạn đang trộn lên hai điều khác nhau: đường dẫn PowerShell và đường dẫn cung cấp . Đường dẫn PowerShell không hiển thị bên ngoài 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 

Nhưng Get-Item X:\System32\notepad.exe đã tạo ra đối tượng FileInfo đại diện cho một số tệp. Vì vậy, những gì tập tin được đại diện bởi các đối tượng FileInfo kết quả?

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

Kể từ khi đối tượng FileInfo biết gì về PowerShell lái X:, nó có để lưu trữ một con đường, mà trong nội bộ sử dụng hệ thống tập tin API mà nó có thể hiểu được. Bạn có thể sử dụng Convert-Path cmdlet để chuyển đổi con đường PowerShell để con đường Provider:

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

Cùng xảy ra khi bạn tạo ổ đĩa PowerShell, mà điểm đến một số đường dẫn mạng:

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

Returned FileInfoDirectoryInfo đối tượng không biết gì khoảng Y:, vì vậy chúng không thể có đường dẫn tương đối so với ổ đĩa PowerShell đó. API hệ thống tệp được sử dụng nội bộ sẽ không hiểu chúng.

Mọi thứ thay đổi khi bạn sử dụng tùy chọn -Persist. Trong trường hợp đó các ổ đĩa được ánh xạ thực sẽ được tạo, có thể được hiểu bởi API hệ thống tệp bên ngoài PowerShell.

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

Như bạn có thể thấy, Root sẽ không \\Computer\Share như bạn hỏi trong New-PSDrive cmdlet, nhưng Z:\. Vì Z: là một ổ đĩa thực sự trong trường hợp này, các đối tượng FileInfoDirectoryInfo được trả về bởi Get-Item hoặc Get-ChildItem cmdlet có thể có các đường dẫn tương ứng với nó.

+0

Cảm ơn PetSerAl. Tôi đã hy vọng bạn sẽ thấy điều này. Tôi mới đây là vấn đề nhưng tôi hiểu tại sao lại là trường hợp đó. – Matt

+0

Sử dụng "-Persist" Tôi nhận được lỗi sau: "New-PSDrive: Loại tài nguyên mạng không chính xác" – Segolas

+0

@Segolas Ổ đĩa mạng có thể tham khảo phần: '\\ Computer \ Share' - nhưng không phải đối với một số thư mục' \ \ Computer \ Share \ Folder'. – PetSerAl

1

chưa được thử nghiệm, nhưng nếu bạn không trái ngược với cách sử dụng 'subst' một cái gì đó như thế này có thể làm việc cho bạn

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

Tôi vẫn đang nắm giữ để xem tại sao nó không hoạt động theo cách tôi mong đợi nhưng điều này là tò mò muốn biết dù sao. – Matt

Các vấn đề liên quan