'PowerShell Get-ChildItem on folder that does not exist behaves different with the -recurse flag
I am testing a Power Shell script to clean out a folder and I noticed some unexpected (to me) behavior when i used the - recurse flag
I have read the help files and done some searching but cant find an explanation for what is happening here.
Consider these 3 Power Shell commands:
Get-ChildItem -Path C:\folderThatDoesNotExist -recurse
Get-ChildItem -Path C:\folderThatDoesNotExist\ -recurse
Get-ChildItem -Path C:\folderThatDoesNotExist\* -recurse
The first command appears to search all of C:\ and there are a bunch of access denied errors for folders outside C:\folderThatDoesNotExist (eg c:\windows)
The second errors out with c:\f does not exist
The third errors out with c:\folderThatDoesNotExist\ not found
I expected all 3 to give an error of c:\folderThatDoesNotExist\ Path not found. Why do the first 2 give different errors?
Solution 1:[1]
1st command: Get-ChildItem -Path C:\folderThatDoesNotExist -recurse
You're seeing an unfortunate nod to cmd.exe's dir command, where the last path component of the -Path argument is interpreted as a pattern to be searched for on all levels of the subtree hierarchy - even when that last component doesn't contain wildcard characters such as * and ?.
This highly problematic behavior is discussed in GitHub issue #5699.
To avoid it, use -LiteralPath instead of -Path.
Caveat: user3608068 reports that this doesn't help in PowerShell v4 (and possibly all lower versions).
2nd command: Get-ChildItem -Path C:\folderThatDoesNotExist\ -recurse
The behavior is more sensible - an error occurs - but the error message complains about only part of the path, C:\f.
This is in itself a bug, but a harmless one (if you omit -Recurse, the error message quotes the correct, full path).
3rd command: Get-ChildItem -Path C:\folderThatDoesNotExist\* -recurse
This command exhibits the expected behavior: C:\folderThatDoesNotExist is correctly interpreted as a directory path that doesn't exist (whose child elements are being requested with wildcard *), and the error message correctly reflects that.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
