Mark
Mark

Reputation: 11

Variable in Invoke-WebRequest -Uri path

I am trying to pass a MAC Address and code (1,2,3,4) to Invoke-WebRequest. Manually the command is working fine, but I am not able to do it via command.

The manual command that works is:

Invoke-WebRequest -Uri https://mywebsite.org/pcconfig/setstate.php?mac=F832E3A2503B"&"state=4

Now when I break this up into variable to use with the mac from the machine I do the following.

$LiveMAC = Get-NetAdapter -Physical |
           where Status -eq "Up" |
           Select-Object -ExpandProperty PermanentAddress

$Str1 = "https://mywebsite.org/pcconfig/setstate.php?mac=$LiveMAC"
$Str2 = $Str1 + '"&"' + 'state=4'
Invoke-WebRequest -Uri $Str2

When I run the above code I do not see errors in red, it seems to process but does not work.

Looking at $Str2 I see the below output, which seems correct, but when passing it as above it fails to work.

https://mywebsite.org/pcconfig/setstate.php?mac=F832E3A2503B"&"state=4

Upvotes: 1

Views: 4655

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200523

The double quotes in a statement like

Invoke-WebRequest -Uri https://example.org/some/sit.php?foo=x"&"bar=y

mask the ampersand for PowerShell, because otherwise otherwise PowerShell would throw an error that a bare & is reserved for future use. A more canonical way of avoiding this is to put the entire URI in quotes:

Invoke-WebRequest -Uri "https://example.org/some/sit.php?foo=x&bar=y"

Either way the actual URI that is passed to Invoke-WebRequest is

https://example.org/some/sit.php?foo=x&bar=y

without the quotes.

However, in a code snippet like this:

$Str1 = "https://example.org/some/site.php?foo=$foo"
$Str2 = $Str1 + '"&"' + 'state=4'

you're including literal double quotes as part of the URI, so the actual URI passed to the cmdlet would be

https://example.org/some/sit.php?foo=x"&"bar=y

which is invalid.

With that said, you don't need string concatenation for building your URI anyway. Simply put your variable in the double-quoted string:

$uri = "https://example.org/some/sit.php?foo=${foo}&bar=y"

If you need to insert the value of an object property or array element use either a subexpression

$uri = "https://example.org/some/sit.php?foo=$($foo[2])&bar=y"

or the format operator

$uri = 'https://example.org/some/sit.php?foo={0}&bar=y' -f $foo[2]

Upvotes: 3

Related Questions