powershell 在循环中动态处理哈希表中具有多个值的键

zpgglvta  于 2023-06-29  发布在  Shell
关注(0)|答案(2)|浏览(139)

我目前正在编写一份报告,这将是以后injested到excel表,使用csv文件的内容,将在脚本的末尾生成。我准备了一个变量文件,它看起来有点像这样:

app1name: "subid1","subid2"
app2name: "subid3","subid4"

我想使用foreach循环遍历这个列表,这将生成这样的输出:

app1name;subid1;$var1;$var2
app1name;subid2;$var1;$var2
app2name;subid3;$var1;$var2
app2name;subid4;$var1;$var2

以便稍后将其导出到CSV。我的目标是针对每个azure订阅运行资源图资源管理器kql,通过使用订阅名称(在文件中定义为subid)引用它们,将结果放入$var1和$var2中,生成上述输出。我准备了不同版本的json和yaml格式的变量列表,并将其转换为哈希表,pscustomobjects和数组,但无法使其工作。这真的可能吗?我正在考虑准备csv格式的变量文件,如下所示:

appname;subid
app1name;subid1
app1name;subid2
app2name;subid3
app2name;subid4

然而,它会非常方便,有一个可变的文件格式,我在开始的问题,因为它的更多的用户友好的格式。

ou6hu8tu

ou6hu8tu1#

如果您需要使用您列出的格式(下面)...

app1name: "subid1","subid2"
app2name: "subid3","subid4"

你可以在你的文本文件上使用Get-Content,迭代每一行,用replace来获取你的应用程序名称和id,构建自定义对象并导出到csv。

$file = 'C:\MyTestFile.txt'

# Test Function to get the variables from Azure
function AzureFunctionToGetVars {
    param($SubID)
    [PSCustomObject]@{
        'var1' = "$($subID)_value1"
        'var2' = "$($subID)_value2"
    }
}  

# Get the content of the file
Get-Content -Path $file | ForEach-Object {
    $appName = $_ -replace ':.*$','' # Get the application name
    $subApps = $($($_ -replace "^$($appName): ",'') -replace '"',"") -split ',' # Get the subIDs
    $subApps | ForEach-Object {
        # Create a custom object with the application name, subID, and the variables
        $results = AzureFunctionToGetVars -SubID $_ # Azure graph call
        [PSCustomObject]@{
            'Application' = $appName
            'SubID' = $_
            'Var1' = $results.var1 
            'Var2' = $results.var2
        }
    }
    #Export the results to a CSV file
} | Export-Csv -Path 'C:\MyCSVoutput.csv' -NoTypeInformation

输出:

"Application","SubID","Var1","Var2"
"app1name","subid1","subid1_value1","subid1_value2"
"app1name","subid2","subid2_value1","subid2_value2"
"app2name","subid3","subid3_value1","subid3_value2"
"app2name","subid4","subid4_value1","subid4_value2"
8nuwlpux

8nuwlpux2#

我建议您将输入以文本PowerShell哈希表的形式输入,然后您可以使用Import-PowerShellDataFile导入它。
给定test.ps1.ps1扩展名不是强制性的,它可以只是.txt或其他):

@{
    app1name = 'subid1', 'subid2'
    app2name = 'subid3', 'subid4'
}

然后你可以导入它并返回一个哈希表。唯一的缺点可能是哈希表是无序的,所以你需要Sort-Object它,以防你需要它。

PS ..\pwsh> Import-PowerShellDataFile .\test.ps1 

Name                           Value
----                           -----
app2name                       {subid3, subid4}
app1name                       {subid1, subid2}

相关问题