Get-Item $Path where $Path contains underscore

Dick Watson 81 Reputation points
2021-09-18T17:10:21.77+00:00

Files exists in a folder. Get-Item [folder]* returns them. They include files with underscores embedded in their names. E.g.:

PS C:\Users\myuser> get-item "C:\Users\myuser\dest\CloudBkup\source\homes\me\archive\2021\zzzz\pre-closing disclosure\*"


    Directory: C:\Users\myuser\dest\CloudBkup\source\homes\me\archive\2021\zzzz\pre-closing disclosure


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---l         8/27/2021   3:22 PM       (192226) RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure
                                                  2.pdf.AES.7z
-a---l         9/13/2021  11:29 AM       (197474) Re_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure
                                                  20200830.pdf.AES.7z
-a---l         8/26/2021  11:00 AM       (193746) RE_ [SECURE] Re_ xxxx_ yyyy_ Closing
                                                  Disclosure.pdf.AES.7z

Problem is that when I try to do a Get-Item (or Remove-Item) on these, individually, by name, nothing happens.

PS C:\Users\myuser> get-item "C:\Users\myuser\dest\CloudBkup\source\homes\me\archive\2021\zzzz\pre-closing disclosure\RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure.pdf.AES.7z"
PS C:\Users\myuser>

The underscore is the problem, somehow, but what is the fix? This is occurring in a script where the .FullName of the item is being invoked, e.g.,

Remove-Item $vRmFile.FullName

So, that's the point at which I need to somehow make the underscores PowerShell safe. I've Googled this but can't seem to find any answer that reflects this general case; many are about how to replace the underscores with something else.

Thanks in advance for any help!

Windows for business Windows Server User experience PowerShell
{count} votes

Accepted answer
  1. Andreas Baumgarten 123.4K Reputation points MVP Volunteer Moderator
    2021-09-18T18:08:14.517+00:00

    Hi @Dick Watson ,

    the underscores aren't the issue. The square brackets [ and ] in the file name causing the trouble with Get-Item.

    You can try this:

    $file = 'C:\Junk\RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure.pdf.AES.7z'  
    Get-Item -Literalpath $file  
      
    $path  = "C:\Junk"  
    Get-ChildItem $path -File | ForEach-Object {Get-Item -Literalpath $path\$_}  
      
    # Output Get-Item  
      
    Mode                 LastWriteTime         Length Name  
    ----                 -------------         ------ ----  
    -a----        18.09.2021     19:55             11 RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure.pdf.AES.7z  
      
    # Output Get-ChildItem  
      
    Mode                 LastWriteTime         Length Name  
    ----                 -------------         ------ ----  
    -a----        27.03.2021     20:07          33592 ResultServices.txt  
    -a----        18.09.2021     19:55             11 RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure.pdf.AES.7z  
    

    And this will delete the file without any problems:

    $file = 'C:\Junk\RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure.pdf.AES.7z'  
    Get-Item -Literalpath $file | Remove-Item  
    

    ----------

    (If the reply was helpful please don't forget to upvote and/or accept as answer, thank you)

    Regards
    Andreas Baumgarten


3 additional answers

Sort by: Most helpful
  1. Andreas Baumgarten 123.4K Reputation points MVP Volunteer Moderator
    2021-09-18T18:50:59.103+00:00

    Hi @Dick Watson ,

    Please try these 3 options (all are working here):

    $file = 'C:\Junk\1\RE_ [SECURE] Re_ xxxx_ yyyy_ Closing Disclosure.pdf.AES.7z'  
    # Option1  
    Get-Item -Literalpath $file | Remove-Item  
    # Option 2  
    $a = Get-Item -Literalpath $file  
    $a | Remove-Item  
    # Option 3  
    $a = Get-Item -Literalpath $file  
    Remove-Item -LiteralPath $a  
    

    ----------

    (If the reply was helpful please don't forget to upvote and/or accept as answer, thank you)

    Regards
    Andreas Baumgarten


  2. Rich Matheisen 47,901 Reputation points
    2021-09-18T18:57:51.847+00:00

    As Andreas pointed out, the "[" and "]" characters are the reason for this happening. More specifically, most people assume that a "wildcard" character is only an asterisk. That assumption leads the unwary into trouble! PowerShell "wildcard" characters are "*" (asterisk), "?" (question mark), and the "[]" pair (range).

    You can, as Andreas pointed out, use "-LiteralPath" instead of "-Path", or you can surround your path string with single-quotes instead of double-quotes (which disables wildcards and variable interpolation (i.e. embedded strings that begin with "$" which may be interpreted as the name of a variable).

    However, the problem isn't obvious when you're using the full name of the file that's found in the property of another object. For example, the results of Get-ChildItem. In your case (where you've implicitly used the -Path parameter), you should be using the -LiteralPath parameter and not the -Path parameter (which is the default) in the Remove-Item.

    For more detail, have a look at this: about_wildcards


  3. Dick Watson 81 Reputation points
    2021-09-18T19:07:33.417+00:00

    (I'm at a bit of a loss whether this "Q&A" UI thinks we should reply, not answer, with Comment or "Write an Answer". Why Comment even exists is a bit of a mystery to me. It seems like Microsoft reinvented a wheel here with "Q&A" without looking at any other wheels to see how other people do them.)


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.