2017-01-01 23 views
8

Tôi có một tập tin gọi là Eric Clapton - Nothing But The Blues - Full Concert (1994) [HQ].URL trong một thư mục C:\Hans\Hans4\.Tại sao tập lệnh PowerShell này tạo ra lỗi?

Mã để tạo này là bên dưới (mặc dù lỗi xảy ra bất kể nội dung tập tin)

$fileContents = @" 
[{000214A0-0000-0000-C000-000000000046}] 
Prop3=19,2 
[InternetShortcut] 
URL=http://example.com/ 
IDList= 
"@ 

New-Item -Path "C:\Hans\Hans4" ` 
     -Name "Eric Clapton - Nothing But The Blues - Full Concert (1994) [HQ].URL" ` 
     -ItemType "file" ` 
     -Value $fileContents ` 
     -Force 

Khi tôi chạy sau tôi nhận được một lỗi

Get-ChildItem 'C:\Hans' -Recurse | Resolve-ShortcutFile > Output.txt 

Mã tham chiếu chức năng dưới đây

function Resolve-ShortcutFile {   
    param(
     [Parameter(
      ValueFromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true, 
      Position = 0)] 
     [Alias("FullName")] 
     [string]$fileName 
    ) 
    process { 
     if ($fileName -like "*.url") { 
      Get-Content $fileName | Where-Object { 
       $_ -like "url=*" 
      } | 
      Select-Object @{ 
       Name='ShortcutFile' 
       Expression = {Get-Item $fileName} 
      }, @{ 
       Name='Url' 
       Expression = {$_.Substring($_.IndexOf("=") + 1)} 
      } 
     } 
    } 
} 

Đây là thông báo lỗi

 
Get-Content : An object at the specified path C:\Hans\Hans4\Eric Clapton - Nothing But 
The Blues - Full Concert (1994) [HQ].URL does not exist, or has been filtered by 
the -Include or -Exclude parameter. 
At line:33 char:28 
+    Get-Content $fileName | Where-Object { 
+    ~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception 
    + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand 

Tại sao tôi gặp lỗi này?

+14

Đối với du khách đến câu hỏi này: http://meta.stackoverflow.com/questions/340658/can-someone-help-a-new-guy-to-be-good-in-asking-questions- ở đây –

+0

Không nên là C: \ Hans nhưng C: \ Roman – ManOnAMission

Trả lời

15

Vấn đề là tên tập tin được cấp nước tập trung vào chức năng và truyền cho Get-Content

C: \ Hans \ Hans4 \ Eric Clapton - Nothing But The Blues - Full Concert (1994) [HQ] .URL

Bạn đang gặp phải sự cố được mô tả here.

Nó chứa dấu ngoặc vuông được hiểu như là một range operator with the set H and Q

Vì vậy, mô hình sẽ có nghĩa là nó cố gắng để đọc nội dung của tập tin với một trong các tên sau đây ...

  • Eric Clapton - Nothing But The Blues - Full Concert (1994) H .URL
  • Eric Clapton - Nothing But The Blues - Full Concert (1994) Q .URL

... nhưng sẽ không phù hợp với nghĩa đen [HQ] trong

  • Eric Clapton - Nothing But The Blues - Full Concert (1994) [HQ] .URL

Bạn có thể sử dụng thông số -literalPath để tránh sự cố này và có tên tệp được xử lý theo nghĩa đen.

function Resolve-ShortcutFile {   
    param(
     [Parameter(
      ValueFromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true, 
      Position = 0)] 
     [Alias("FullName")] 
     [string]$fileName 
    ) 
    process { 
     if ($fileName -like "*.url") { 
      Get-Content -literalPath $fileName | Where-Object { 
       $_ -like "url=*" 
      } | 
      Select-Object @{ 
       Name='ShortcutFile' 
       Expression = {Get-Item -literalPath $fileName} 
      }, @{ 
       Name='Url' 
       Expression = {$_.Substring($_.IndexOf("=") + 1)} 
      } 
     } 
    } 
} 
+0

Tôi có khoảng 200 tệp này và không có tệp nào vượt qua. Nó đã hoạt động với cùng một tập lệnh khoảng 2 tháng trước. Nhưng tôi chắc chắn sẽ thử giải pháp của bạn ngay sau khi tôi trở về nhà. – Roman

+2

@Roman - là quy ước đặt tên mới [HQ] 'mà bạn (hoặc một trang web mà bạn thường xuyên tạo và các phím tắt trên Internet) đã áp dụng chưa? Bởi vì nó gây ra vấn đề với mã hiện tại của bạn.Hầu hết thời gian mã hiện tại của bạn sẽ hoạt động tốt trừ khi nó gặp tên tệp có dấu ngoặc vuông. –

+0

Đó là các liên kết từ youtube. Tôi không hiểu nó hoạt động như thế nào và bây giờ không còn nữa. Có thể họ đã cập nhật quyền hạn. – Roman

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