powershell 难以使用Import-Module函数输出正确返回哈希表

uqjltbpv  于 2023-03-23  发布在  Shell
关注(0)|答案(1)|浏览(171)

所以我想在导入模板中设置一个函数,它返回一个哈希表。但是当发生这种情况时,我遇到了一个奇怪的转换问题。主脚本:

$MigrationConfig = 'Migrate.Default',
$MigrationConfigPath = '.\MigrationConfigs\' + $MigrationConfig + '.psm1';
Import-Module -Name $($MigrationConfigPath);
if (((Get-Command -Module $MigrationConfig -ListImported) | Where-Object Name -eq 'GetSections').Length -ne 1) {throw "Migration Config $MigrationConfig which should be located at $MigrationConfigPath must export a function named 'GetSections'.";}

我们的想法是在$MigrationConfig(param)中给它一个新的值来加载一个新的查询集,然后主脚本通过名称GetSections来查找函数,然后使用该函数的返回值(期望HashTable易于使用)来运行脚本的其余部分,下面是psm文件的示例。

function GetSections {
    return [HashTable]@{
        'MigrationProc' = [ordered]@{
            '1' = @{<#...#>}
        };
    };
};

然而,我已经在安装程序上运行测试,手动导入文件并尝试将输出视为哈希表……

foreach($f in ((Get-Command -Module 'Migrate.Default' -ListImported) | Where-Object Name -eq 'GetSections')) {([HashTable]([ScriptBlock]::Create($f.ScriptBlock).Invoke('1'))).Keys}

但我得到的结果是:

Cannot convert the "System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSObject]" value of type 
"System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35]]" to type "System.Collections.Hashtable".

我如何构造主脚本或导入模块,以将函数输出视为哈希表?

gv8xihay

gv8xihay1#

按如下方式调用您的命令,该命令利用调用操作符&的功能来调用表示为System.Management.Automation.CommandInfo类型示例的命令,作为Get-Command的输出:

(& (Get-Command -Module Migrate.Default -Name Get-Sections) 1).Keys

如果不担心 * 命名冲突 *(即,如果您只希望 * 一个 * 安装的模块导出名为Get-Sections的命令):

(Get-Sections 1).Keys

相关问题