Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to find type when running powershell -command

I have a PowerShell script which I intend to use as a deployment step in Bamboo. Opening PowerShell and running the script with ./script.ps1 works fine, but using powershell.exe -command ./script.ps1 fails with error Unable to find type [Microsoft.PowerShell.Commands.WebRequestMethod].

What is the difference between running the script directly from PowerShell and by using powershell.exe -command? What am I missing?

MWE for the issue in question:

function Test-RestMethod {
    param([string]$Uri, [Microsoft.PowerShell.Commands.WebRequestMethod] $Method = 'Get')

    $result = Invoke-RestMethod $uri -Method $Method
    return $result
}

Test-RestMethod -Uri https://blogs.msdn.microsoft.com/powershell/feed/ -Method 'Get' | Format-Table -Property Title, pubDate
like image 435
Richard Ryszka Avatar asked Apr 16 '18 08:04

Richard Ryszka


2 Answers

I guess it can be an issue with PowerShell.exe itself, I can reproduce the issue in PowerShell 2.0, 3.0, 4.0 and 5.0.

It's an issue that you can't use type constraint of namespace Microsoft.PowerShell.Commands if you don't run any other command first when you are running your script by using PowerShell.exe

I found two workarounds for you.

a. Run a senseless cmdlet in the beginning of your script, for example

Start-Sleep -Milliseconds 1
function Test-RestMethod {
param([string]$Uri, [Microsoft.PowerShell.Commands.WebRequestMethod] $Method = 'Get')

$result = Invoke-RestMethod $uri -Method $Method
return $result
}

Test-RestMethod -Uri https://blogs.msdn.microsoft.com/powershell/feed/ -Method 'Get' | Format-Table -Property Title, pubDate

b. Remove the type constraint, it's still working fine

function Test-RestMethod {
param([string]$Uri, $Method = 'Get')

$result = Invoke-RestMethod $uri -Method $Method
return $result
}

Test-RestMethod -Uri https://blogs.msdn.microsoft.com/powershell/feed/ -Method 'Get' | Format-Table -Property Title, pubDate
like image 111
Dong Mao Avatar answered Nov 15 '22 08:11

Dong Mao


To make a type available, if PowerShell does not load it already automatically, just add the corresponding module or assembly manually by using Import-Module or Add-Type. In your case, you have to load an Assembly as can be derived from the docs (Microsoft.PowerShell.Commands.WebRequestMethod):

Add-Type -AssemblyName Microsoft.PowerShell.Commands.Utility
like image 25
stackprotector Avatar answered Nov 15 '22 10:11

stackprotector