I have been trying to access a URL with a /
character in it from powershell, using the following command (it's a query to a gitlab server to retrieve a project called "foo/bar"
):
Invoke-WebRequest https://server.com/api/v3/projects/foo%2Fbar -Verbose
Now, the odd thing is that using the PowerShell ISE or Visual Studio, the request is OK. When using PowerShell itself, the URL is automatically un-escaped and the request fails. E.g.
In ISE/VS:
$> Invoke-WebRequest https://server.com/api/v3/projects/foo%2Fbar -Verbose
VERBOSE: GET https://server.com/api/v3/projects/foo%2Fbar with 0-byte payload
VERBOSE: received 19903-byte response of content type application/json
StatusCode : 200
StatusDescription : OK
Content : .... data ....
In Powershell:
$> Invoke-WebRequest https://server.com/api/v3/projects/foo%2Fbar -Verbose
VERBOSE: GET https://server.com/api/v3/projects/foo/bar with 0-byte payload
Invoke-WebRequest : {"error":"404 Not Found"}
At line:1 char:1
+ Invoke-WebRequest 'https://server.com/api/v3/projects/foo%2Fbar ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
I have tried adding single and double quotes around the URL, but nothing is helping.
What could be the reason for this behaviour, and how do I make PS not un-escape the URL string?
Environment: Windows 7, also tested on Server 2012R2 with same results.
$> $PSVersionTable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.16406
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
I have encountered similar issue in PowerShell 5.1. My purpose was to get a single project by Git Lab Web API. As Web API described:
What different with nik was that my Invoke-WebRequest call was successful by directly invoke but failed inside a Job. Here's the code:
To Get the output inside a Job. Run command:
And exception as below:
And thanks Oleg SH's answer. My problem was solved. But I think there might be a bug in the Start-Job cmdlet
Environment: Windows 7
Try the URL through this function
Here is an alternate port of https://stackoverflow.com/a/784937/2864740 - it accepts a string and returns a new URI.
Usage: