所以我完全被这个问题难住了。
问题所在
我有一个powershell脚本(一个.ps1文件),它在某些时候执行以下操作:
Import-Module AzureRM
Login-AzureRmAccount -Credential $azureCredentials | out-null
Select-AzureRmSubscription -SubscriptionId $azureSubscriptionId -TenantId $azureTenantId | out-null
Write-Host (ConvertTo-Json((Get-AzureRmResource -Tag @{ "env"="dev"}) | Select Name, Location))
我通过执行以下操作在.NET控制台应用程序中运行该脚本:
Dim process = New Process() With {.StartInfo = New ProcessStartInfo With {
.FileName = "powershell.exe",
.Arguments = "-ExecutionPolicy ByPass -file """ & _powershellScriptsPath & "\get-webapps.ps1",
.UseShellExecute = False,
.RedirectStandardOutput = True,
.RedirectStandardError = True
}}
无论是从ISE还是从控制台应用程序运行,该脚本在我的笔记本电脑上都运行得很好。
然后在我的桌面上,它在ISE中工作正常,但在控制台应用程序中失败,并显示以下错误消息:
Get-AzureRmResource : A parameter cannot be found that matches parameter name 'Tag'.
我搞不懂这件事。
一些见解
我的$PSVersionTable
在两台计算机上是相同的:
Name Value
---- -----
PSVersion 5.1.17134.165
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17134.165
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
我的笔记本电脑有6.1.0版的AzureRm模块:
PS C:\WINDOWS\system32> Get-InstalledModule -Name AzureRm
Version Name Repository Description
------- ---- ---------- -----------
6.1.0 AzureRM PSGallery Azure Resource Manager Module
而我的桌面版本是6.5.0:
PS C:\WINDOWS\system32> Get-InstalledModule -Name AzureRm
Version Name Repository Description
------- ---- ---------- -----------
6.5.0 AzureRM PSGallery Azure Resource Manager Module
所以这里有不同的版本,但是-Tag确实存在于6.1.0中,因为在Powershell ISE中脚本可以工作。它必须使用6.1.0,因为它似乎是唯一安装的版本(?)。
此外,控制台应用程序在两个Visual Studios (笔记本电脑/台式机)中运行相同的配置(至少据我所知)。值得注意的是,它被编译为AnyCPU,并在两台计算机上以32位运行。
发布于 2018-07-24 20:48:41
从this上看,-tag
似乎缺少AzureRm 6.0.0之前的版本。这是通过以下方式确定的问题的根本原因:
get-command get-azurermresource -full
解决方法是升级该版本。您可以通过执行以下操作找到模块所在的位置:
get-module azurerm | select modulebase
ps。另一种解决方法是使用odata查询:
Get-AzureRmResource -ODataQuery "`$filter=tagname eq 'something'"
https://stackoverflow.com/questions/51498836
复制相似问题