如何使用 powershell 迭代特定键的文本文件并保存在变量中?

How to iterate a text file for a specific key and save in variable using powershell?

我正在尝试创建一个脚本,该脚本将循环遍历文本文件 <--(步骤 3.1)并查找特定键并将值保存到变量中。现在我在命令中使用该变量来生成输出文件 < --(第 4 步)。我现在正在使用代码。

代码:

# 1- Connect to Azure Account

$username = "abc@xyz.com"
$pass = ConvertTo-SecureString "abc123" -AsPlainText -Force
$cred = New-Object PSCredential($username,$pass)

#Connect-AzureRmAccount -Credential $cred | out-null
Connect-AzAccount -Credential $cred | out-null

# 2 - Input Area

$subscriptionName = 'Data Analytics'
$resourceGroupName = 'DataLake-Gen2'
 $dataFactoryName = 'dna-production-gen2'
$runStartDateTimeUTC = '2020-09-12T06:40:00Z'

# 3 - (All Triggers Information)

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path D:\Powershell\TriggerInfo.txt -append
Get-AzDataFactoryV2Trigger -ResourceGroupName $resourceGroupName -DataFactoryName $dataFactoryName
Stop-Transcript  

# 3.1 (Get the content in a variable)

Get-Content "D:\Powershell\TriggerInfo.txt" | ForEach-Object {
$trg_name = $_.TriggerName
} $trg_name

# 4 - (Write the output to a text file, The Get-AzDataFactoryV2TriggerRun command returns detailed information about trigger runs for the specified trigger 
#  in the given timeframe.)

foreach ($trg in $trg_name) {

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path D:\Powershell\output.txt -append
Get-AzDataFactoryV2TriggerRun -ResourceGroupName $resourceGroupName -DataFactoryName $dataFactoryName -TriggerName $trg -TriggerRunStartedAfter "2020-09-01" -TriggerRunStartedBefore "2020-09-17"
Stop-Transcript

"$trg = " + $trg.length
}

TriggerInfo.txt:

TriggerName       : TRG_CM_TBLEnhanced_prod
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CM_tblEnhanced_QA
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CustCaseData
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_RP_Dashboard_TAE
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

任何帮助将不胜感激?谢谢

更新代码

    # 3.1 (Get the content in a variable)
    
    # Get-Content "D:\Powershell\TriggerInfo.txt" | ForEach-Object {
    # $trg_name = $_.TriggerName
    # } $trg_name
    
    # $trg = (Get-AzDataFactoryV2Trigger -ResourceGroupName $resourceGroupName -DataFactoryName $dataFactoryName).TriggerName
    
    $log = Get-Content -Path 'D:\Powershell\TriggerInfo.txt' -Raw
    $result = ($log -split '(\r?\n){2,}' | Where-Object {$_ -match '\S'}) | ForEach-Object {
    [PsCustomObject](($_ -split 'TriggeredPipelines')[0] -replace ' : ', '=' | ConvertFrom-StringData)  |
        Select-Object 'TriggerName'
    }
    
    # output on screen
    $result | Format-Table -AutoSize
    
    # write to CSV file
    $result | Export-Csv -Path 'D:\Powershell\TriggerInforesult.csv' -Encoding UTF8 -NoTypeInformation -Force
    
    $trg_name = (Import-Csv -Path 'D:\Powershell\TriggerInforesult.csv').TriggerName
    
    # 4 - (Write the output to a text file, The Get-AzDataFactoryV2TriggerRun command returns detailed information about trigger runs for the specified trigger 
    #  in the given timeframe.)
    
    foreach ($trigger in $trg_name) {
    
    $ErrorActionPreference="SilentlyContinue"
    Stop-Transcript | out-null
    $ErrorActionPreference = "Continue"
    Start-Transcript -path D:\Powershell\output.txt -append
    
    Get-AzDataFactoryV2TriggerRun -ResourceGroupName $resourceGroupName -DataFactoryName $dataFactoryName -TriggerName $trigger -TriggerRunStartedAfter "2020-09-01" -TriggerRunStartedBefore "2020-09-17"
    
    Stop-Transcript
    
    "$trigger = " + $trigger.length
    }

****Recent Update****

TriggerName       : TRG_CM_TBLEnhanced_prod
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CM_tblEnhanced_QA
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CustCaseData
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_RP_Dashboard_TAE
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : GMB_Trigger
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.BlobEventsTrigger
RuntimeState      : Started

TriggerName       : TRG_RP_Optimizely_Import
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_USBusinessData_Monthly
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_Generic_CSV_To_DW
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Stopped

TriggerName       : TRG_CM_Dimension_Unit
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CM_PricingQuoteApproval
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

Transcript stopped, output file is D:\Powershell\new\TriggerInfo.txt
ConvertFrom-StringData : Data line '**********************' is not in 'name=value' format.
At line:36 char:37
+     $data  = $_ -replace ':', '=' | ConvertFrom-StringData
+                                     ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [ConvertFrom-StringData], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.ConvertFromStringDataCommand

Get-AzDataFactoryV2TriggerRun : Cannot validate argument on parameter 'DataFactoryName'. The argument is null or empty. Provide an argument that is not null or empty, and then try the
command again.
At line:47 char:34
+    Get-AzDataFactoryV2TriggerRun @splat
+                                  ~~~~~~
    + CategoryInfo          : InvalidData: (:) [Get-AzDataFactoryV2TriggerRun], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Azure.Commands.DataFactoryV2.GetAzureDataFactoryTriggerRunCommand

ConvertFrom-StringData : Data line '**********************' is not in 'name=value' format.
At line:36 char:37
+     $data  = $_ -replace ':', '=' | ConvertFrom-StringData
+                                     ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [ConvertFrom-StringData], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.ConvertFromStringDataCommand

TriggerInfo.txt


Windows PowerShell 脚本开始 开始时间:20201017093947 用户名:XXXXXX\XXXXXX 以用户身份运行:XXXXXX\XXXXXX 配置名称: 机器:INNOPHLTXETR138(Microsoft Windows NT 10.0.17134.0) 主机应用程序:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 进程号:20340 P版本:5.1.17134.858 PS版:桌面 PS兼容版本:1.0、2.0、3.0、4.0、5.0、5.1.17134.858 构建版本:10.0.17134.858 CLR版本:4.0.30319.42000 WSManStack 版本:3.0 PSRemotingProtocol版本:2.3 序列化版本:1.1.0.1


转录开始,输出文件为D:\Powershell\new\TriggerInfo.txt

TriggerName       : TRG_CM_TBLEnhanced_prod
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CM_tblEnhanced_QA
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CustCaseData
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_RP_Dashboard_TAE
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : GMB_Trigger
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.BlobEventsTrigger
RuntimeState      : Started

TriggerName       : TRG_RP_Optimizely_Import
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_USBusinessData_Monthly
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_Generic_CSV_To_DW
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Stopped

TriggerName       : TRG_CM_Dimension_Unit
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

TriggerName       : TRG_CM_PricingQuoteApproval
ResourceGroupName : DataLake-Gen2
DataFactoryName   : dna-production-gen2
Properties        : Microsoft.Azure.Management.DataFactory.Models.ScheduleTrigger
RuntimeState      : Started

**********************
Windows PowerShell transcript end
End time: 20201017093951
**********************

如评论所述,Get-Content 将文件读取为字符串数组。如果您想使用问题中给出的示例文本文件,则需要将其解析为 objects 数组,以便 select 属性 或属性你想过滤掉。

但是,在您的 中,您已经完成了艰苦的工作,并且拥有一个包含所有您想要的属性的结构化 CSV 文件,所以我建议您使用它作为输入。

代码可以很简单:

$trg_name = (Import-Csv -Path 'TheResultsFileFromEarlierQuestion.CSV').TriggerName

并用它来将 $trigger 数组保存到文件中,或者用它来迭代内容:

$trg_name | ForEach-Object {
    # using splatting here for prettier code
    $splat = @{
        ResourceGroupName       = $resourceGroupName
        DataFactoryName         = $dataFactoryName
        TriggerName             = $_
        TriggerRunStartedAfter  = "2020-09-01"
        TriggerRunStartedBefore = "2020-09-17"
    }
    Get-AzDataFactoryV2TriggerRun @splat
} | Export-Csv -Path 'PathToTheOutputFile.csv' -Encoding UTF8 -NoTypeInformation

P.S。如果 $resourceGroupName$dataFactoryName 也应该来自输入 CSV 文件,那么您根本不需要 $trg_name 并且可以简单地做:

Import-Csv -Path 'TheResultsFileFromEarlierQuestion.CSV' | ForEach-Object {
    $splat = @{
        ResourceGroupName       = $_.ResourceGroupName
        DataFactoryName         = $_.DataFactoryName
        TriggerName             = $_.TriggerName
        TriggerRunStartedAfter  = "2020-09-01"
        TriggerRunStartedBefore = "2020-09-17"
    }
    Get-AzDataFactoryV2TriggerRun @splat
} | Export-Csv -Path 'PathToTheOutputFile.csv' -Encoding UTF8 -NoTypeInformation 

这就是第 3.1 步和第 4 步的完整代码


编辑

根据您的意见,我了解到您不能使用您之前为此创建的 csv 文件,并且您被困在向我们展示的输入文本文件中。

这也不是很难用:

# split the text in 'trigger' text blocks on the empty line
$triggers = ((Get-Content "D:\Powershell\TriggerInfo.txt" -Raw) -split '\*+')[0] -split '(\r?\n){2,}'
# loop through these blocks (skip any possible empty textblock)
$triggers | Where-Object {$_ -match '\S'} | ForEach-Object {
    # and parse the data into Hashtables
    $data  = $_ -replace ':', '=' | ConvertFrom-StringData
    # if you have values containing a colon (:) character, this is safer:
    # $data  = ($_ -split ':', 2) -join '=' | ConvertFrom-StringData

    $splat = @{ 
        ResourceGroupName       = $data.ResourceGroupName
        DataFactoryName         = $data.DataFactoryName
        TriggerName             = $data.TriggerName
        TriggerRunStartedAfter  = "2020-10-15"
        TriggerRunStartedBefore = "2020-10-17"
   } 
   Get-AzDataFactoryV2TriggerRun @splat 
} | Export-Csv -Path 'D:\Powershell\new\Output.csv' -Encoding UTF8 -NoTypeInformation