如何解决如何使用Powershell迭代特定键的文本文件并保存在变量中?
代码:
# 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 ':',Microsoft.PowerShell.Commands.ConvertFromStringDataCommand
TriggerInfo.txt
Windows PowerShell成绩单开始 开始时间:20201017093947 使用者名称:XXXXXX \ XXXXXX RunAs用户:XXXXXX \ XXXXXX 配置名称: 机器:INnopHLTXETR138(Microsoft Windows NT 10.0.17134.0) 主机应用程序:C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe 进程ID:20340 PS版本:5.1.17134.858 PSEdition:台式机 PSCompatibLeversions:1.0、2.0、3.0、4.0、5.0、5.1.17134.858 生成版本:10.0.17134.858 版本号:4.0.30319.42000 WSManStackVersion:3.0 PSRemotingProtocolVersion: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
将文件读取为字符串数组。如果要使用问题中提供的示例文本文件,则需要将其解析为对象数组,以选择要过滤掉的一个或多个属性。
但是,在您的previous question中,您已经完成了艰苦的工作,并拥有一个结构化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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。