Điểm:0

Xử lý ngoại lệ với đường dẫn dài trong Powershell

lá cờ in
ed7

Tôi là người mới ở đây và tôi đang gặp sự cố với tập lệnh powershell của mình với các đường dẫn dài. Tập lệnh này nhằm lấy đường dẫn tương đối và hàm băm từ tệp/thư mục và các thư mục con của nó. Nó hoạt động với một số với những người khác tôi gặp lỗi sau:

Get-ChildItem : Đường dẫn, tên tệp hoặc cả hai được chỉ định quá dài. Tên tệp đủ điều kiện phải ít hơn 260 ký tự và tên thư mục phải ít hơn 248 ký tự.

Tôi muốn biết cách xử lý việc này và tránh gây ra lỗi này cho tôi.

Tôi đã bật đường dẫn tệp dài trong máy chủ Windows 2012 nơi tôi đang chạy tập lệnh và nó vẫn không hoạt động.

Nếu tôi thêm cái này \\?\ trong biến đường dẫn, nó không thông báo rằng có các ký tự Bất hợp pháp trong đường dẫn ngay cả khi tôi thêm -LiteralPath.

Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời

Đây là tập lệnh mypowershell:

#Thông báo cho người dùng
  Đầu ra ghi "`nTập lệnh này sẽ thu thập Tên tệp, Tên, Đường dẫn tương đối và Hàm băm của các tệp/thư mục bạn đã chọn."
               "`nCuối cùng, nó sẽ cho bạn biết mất bao lâu để chạy tập lệnh"   
  Read-Host -Prompt "`nNhấn ENTER để tiếp tục hoặc CTRL+C để thoát" 
        
  #Đếm thời gian từ đầu
  $starttime = (Nhận ngày)
        
  #Biến
  #Chỉ có thể thêm tối đa 3 đường dẫn. Nếu thêm nhiều hơn 3, nó có thể thay đổi đường dẫn tương đối
  $root = "C:\mypath"
        
        
  #Biến để tạo Tệp CSV
  $report = "mycsvfile.csv"
        
        
  #Quy trình tạo HASH
  $hasher = [System.Security.Cryptography.SHA256]::Create()
  $AllFiles = @() 
        
  "`n"#dấu cách dòng
        
  Máy chủ ghi "Tạo hàm băm từ $root" 
        
        
        
  # Lấy thông tin từ thư mục
  foreach ($file in get-childitem $root -recurse | Select-Object FullName, Directory, Name, PSIsContainer, Length)
  {
      $acl = get-acl $file.fullname | chủ sở hữu đối tượng chọn, chuỗi truy cập, nhóm
      $obj = đối tượng mới psObject
        
        
  #Tạo tệp HASH
      if(!$file.PsIsContainer)
          {
          $relativePath = $file.FullName.Substring($root.Length)
          Máy chủ ghi "Gỡ lỗi $relativePath" -ForegroundColor Green
        
          $inputStream = Đối tượng mới IO.StreamReader $file.fullname
          $hashBytes = $hasher.ComputeHash($inputStream.BaseStream)
          $inputStream.Close()
        
          $builder = Đối tượng mới System.Text.StringBuilder
          $hashBytes | Foreach-Object { [void] $builder.Append($_.ToString("X2")) }
        
  #Thêm thông tin vào TỆP CSV
          $obj | Add-Member -membertype noteproperty -tên FilePathandName -Giá trị $file.FullName
          $obj | Add-Member -membertype noteproperty -name Name -Value $file.Name
          $obj | Add-Member -MemberType noteproperty -Name RelativePath -Value $relativePath #-force
          $obj | Add-Member -MemberType noteproperty -Name Hash -Value $builder.ToString()
          #$obj | Add-Member -membertype noteproperty -name CreationTime -Value $file.CreationTime
          #$obj | Add-Member -MemberType noteproperty -Name LastAccessTime -Value $file.LastAccessTime
          #$obj | Add-Member -MemberType noteproperty -Name LastWriteTime -Value $file.LastWriteTime
        
                
      #Variable để gửi thông tin tới CSV
      $AllFiles += $obj
      Clear-Biến tương đốiPath
      }
  Loại bỏ biến obj
  }
        
  #$Tất cả tệp += $obj
        
  #Đang tạo TỆP CSV
  $AllFiles |Xuất-Csv $report âNoTypeInformation
        
  "n"
  Máy chủ lưu trữ "$report Tệp đã được tạo"
        
  "n"
  Máy chủ lưu trữ "Kịch bản đã lấy:`n"
  $endTime = Nhận ngày
  New-TimeSpan -Bắt đầu $startTime -End $endTime
lá cờ br
[1] nếu bạn đang dùng win10 hoặc win11, bạn có thể đặt HĐH cho phép đặt tên dài. ///// [2] bạn cũng có thể sử dụng tiền tố unicode để cho phép các đường dẫn dài chỉ cho một cuộc gọi đó. ///// để biết thông tin về cả hai, hãy xem ... >>> Giới hạn độ dài đường dẫn tối đa - Ứng dụng Win32 | Microsoft Docs â https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd
Điểm:1
lá cờ ru

Để các lệnh ghép ngắn Powershell hoạt động bình thường bằng cách sử dụng \\?\ Bạn cần cài đặt các phiên bản tối thiểu sau của các thành phần này (đã được thử nghiệm và xác thực trên Windows Server 2012 R2):

Sau đó, bạn chỉ cần thay đổi biến đường dẫn gốc trong tập lệnh của mình như sau và nó sẽ hoạt động như mong đợi:

  #Biến
  #Chỉ có thể thêm tối đa 3 đường dẫn. Nếu thêm nhiều hơn 3, nó có thể thay đổi đường dẫn tương đối
  $root = "\?\C:\mypath\"
        

Không cần phải thay đổi bất kỳ khóa đăng ký nào để kích hoạt hỗ trợ đường dẫn dài hoặc sử dụng tham số -LiteralPath cho bất kỳ lệnh ghép ngắn nào.Tôi đã thấy những tuyên bố này nhiều lần trong các bài báo và diễn đàn khác nhưng điều đó không đúng ngoại trừ các phiên bản Windows rất cũ.


Bây giờ, nếu bạn không thể cài đặt các phiên bản mới hơn này, bạn sẽ phải sử dụng các giải pháp thay thế.

Lưu ý rằng trong tập lệnh của bạn, các chức năng sau bị ảnh hưởng bởi sự cố này:

  • Get-ChildItem
  • Get-Acl
  • Đối tượng mới IO.StreamReader

Một giải pháp sẽ là thay thế một phần của đường dẫn như một ổ đĩa khi nó trở nên quá dài và sử dụng ổ đĩa mới làm thư mục gốc. Tôi đã thử điều này bằng cách sử dụng SUBST lệnh nhưng nó sẽ hoạt động bằng cách sử dụng Mới-PSDrive lệnh ghép ngắn. Điều này yêu cầu thêm một số logic trong tập lệnh của bạn nhưng nó không tốn quá nhiều công sức và khá dễ dàng.

Hiện nay, nếu bạn muốn nhận danh sách tất cả các tệp trước khi thực hiện bất kỳ thay thế nào (để trước tiên bạn có thể kiểm tra tất cả độ dài đường dẫn và tên tệp), bạn có thể sử dụng cách giải quyết sau:

$root = "C:\mypath\" ;
$AllFiles = cmd /c dir $root /b /s /a-d ;

Điều này sẽ cung cấp cho bạn danh sách các tệp (tên đầy đủ).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.