Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does this PowerShell script produce an error?

Tags:

powershell

I have a file called Eric Clapton - Nothing But The Blues - Full Concert (1994) [HQ].URL in a directory C:\Hans\Hans4\.

Code to create this is below (though the error occurs regardless of file contents)

$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

When I run the following I get an error

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

The code references the function below

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

This is the error message

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

Why do I get this error?

like image 708
Roman Avatar asked Jan 01 '17 11:01

Roman


People also ask

What is PowerShell error?

An error in PowerShell is a message that's displayed on screen when something goes wrong. By default, PowerShell displays its errors in red text on a black background (in the console host, that is; the Integrated Scripting Environment (ISE) uses red text).


1 Answers

The problem is the filename that is piped into the function and passed to Get-Content

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

You are encountering the problem described here.

It contains square brackets that are interpreted as a range operator with the set H and Q

So the pattern would mean that it attempts to read the contents of files with either of the following names...

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

... but will not match the literal [HQ] in

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

You can use the -literalPath parameter to avoid this problem and have the file name treated literally.

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 )}
            } 
        }
    }
}
like image 184
Martin Smith Avatar answered Nov 08 '22 17:11

Martin Smith