运行 powershell -command 时找不到类型

Posted

技术标签:

【中文标题】运行 powershell -command 时找不到类型【英文标题】:Unable to find type when running powershell -command 【发布时间】:2018-04-16 08:36:51 【问题描述】:

我有一个 PowerShell 脚本,我打算将其用作 Bamboo 中的部署步骤。打开 PowerShell 并使用 ./script.ps1 运行脚本可以正常工作,但使用 powershell.exe -command ./script.ps1 失败并出现错误 Unable to find type [Microsoft.PowerShell.Commands.WebRequestMethod]

直接从 PowerShell 运行脚本和使用 powershell.exe -command 有什么区别?我错过了什么?

有关问题的 MWE:

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

【问题讨论】:

我猜你的 powershell 路径正在返回一个不同的版本,尝试使用 Get-Host 来确定每种方法使用的版本。 它们都使用相同的版本,在相同的架构上(都是 64 位 PowerShell v5.1.14393.1198)。 【参考方案1】:

我猜这可能是 PowerShell.exe 本身的问题,我可以在 PowerShell 2.0、3.0、4.0 和 5.0 中重现该问题。

如果您在使用 PowerShell.exe 运行脚本时不先运行任何其他命令,则无法使用命名空间 Microsoft.PowerShell.Commands 的类型约束是一个问题

我为您找到了两种解决方法。

一个。例如,在脚本开头运行一个无意义的 cmdlet,例如

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.去掉类型约束,它仍然可以正常工作

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

【讨论】:

是的,您的解决方法对我有用,它们帮助我找出真正的问题是什么。异常是由未加载/导入的 PowerShell 模块 Microsoft.PowerShell.Utility 引起的。在您的第一个解决方法中运行 Start-Sleep 会安静地加载此模块,但我不知道为什么它会以这种方式工作。我将在另一个答案中对此进行描述。 我知道这篇文章很旧,但我最近才遇到这个问题(使用 PowerShell 7)。鉴于您关于命名空间“延迟加载”的逻辑,那么也应该将引用命名空间中的枚举的代码行包装在 Measure-Command 块中。我将尝试将此作为修复(hack),看看它是否有效。【参考方案2】:

要使某个类型可用,如果 PowerShell 尚未自动加载它,只需使用 Import-ModuleAdd-Type 手动添加相应的模块或程序集。在您的情况下,您必须加载可以从文档 (Microsoft.PowerShell.Commands.WebRequestMethod) 派生的程序集:

Add-Type -AssemblyName Microsoft.PowerShell.Commands.Utility

【讨论】:

以上是关于运行 powershell -command 时找不到类型的主要内容,如果未能解决你的问题,请参考以下文章

通过make运行时找不到CMake

在物理设备上运行时找不到 -lBugsnagReactNative 的库

运行时找不到 Codebuild aws 命令?

运行任何 rails cmnd 时找不到“activesupport”

使用 sudo 运行时找不到命令

运行程序时找不到主类