-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Description
PR #12386 introduced experimental feature PSNativePSPathResolution, which as of (at least) PowerShell Core 7.1.0-preview.7 has become a default feature.
- For problems with this feature in general, see Bypassing translation of PSDrive-based path arguments for external (native) executables is obscure and inadequate (PSNativePSPathResolution) #13644
Its purpose is to translate PowerShell-drive-based paths to native filesystem paths, because external executables only understand the latter.
This translation is currently overzealous in that it nonsensically translates an argument that starts with : (which clearly isn't a drive-based path).
@DHowett has pinpointed the problematic behavior to:
PowerShell/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs
Lines 388 to 406 in 3effa20
| if (path.Contains(':')) | |
| { | |
| LocationGlobber globber = new LocationGlobber(context.SessionState); | |
| try | |
| { | |
| ProviderInfo providerInfo; | |
| // replace the argument with resolved path if it's a filesystem path | |
| string pspath = globber.GetProviderPath(path, out providerInfo); | |
| if (string.Equals(providerInfo.Name, FileSystemProvider.ProviderName, StringComparison.OrdinalIgnoreCase)) | |
| { | |
| path = pspath; | |
| } | |
| } | |
| catch | |
| { | |
| // if it's not a provider path, do nothing | |
| } | |
| } |
Steps to reproduce
On Unix:
/bin/echo :foo | Should -Be ':foo'On Windows:
cmd /c echo :foo | Should -Be ':foo'
Expected behavior
The test should succeed.
Actual behavior
The test fails, because the the current location's path is unexpectedly prepended to :
Expected strings to be the same, but they were different. Expected length: 4 Actual length: 44 Strings differ at index 0.
Expected: ':foo' But was: '/Users/jdoe...'Environment data
PowerShell Core 7.1.0-preview.7