我有一个文件,包含关于我们正在使用的软件的所有配置数据。从该文件中,我需要提取档案的名称,并确定有多少档案存在,以便将此信息传递给另一个脚本,以便使用档案名称执行此档案的导出。存档名称可在此上下文中找到。
{
"name": {
"value": "Archiv1",
"valid": true
},
"displayName": {
"value": "Repository4",
"valid": true
},
"systemLanguage": {
"value": "de",
"valid": true
},在这种情况下,Archiv1将是我正在寻找的值。为此,我创建了以下脚本:
findstr /N 'systemLanguage' $dpath\temp\serversetup2\sample.conf > $dpath\temp\serversetup2\temp\findarch.txt
$content = Get-Content $dpath\temp\serversetup2\temp\findarch.txt
$content -split ':' > $dpath\temp\serversetup2\temp\archs.txt 由于systemLanguage是每个归档的变量,并且没有出现在任何其他上下文中,所以我正在查找systemLanguage的行号,并将结果以行号和整行字符串保存到findarch.txt中。之后,我简单地使用一个游标将行号从后面的字符串中分离出来,因为每个行号都有以下模式: 123:§内容§。在将分离的数字和字符串保存到archs.txt中之后,我将以数字开头的行提取到一个新的文件numlist.txt中。
foreach($file in (Get-Content -Path $dpath\temp\serversetup2\temp\archs.txt)){
$first_letter=$file.Substring(0,1)
if($first_letter -match '\d'){
Add-Content $dpath\temp\serversetup2\temp\numlist.txt -Value $file
}
}使用numlist.txt,我(认为我)可以简单地跳回包含Archive名称的行,使用:
$count = 0
foreach($file in (Get-Content -Path $dpath\temp\serversetup2\temp\numlist.txt)){
if($count -eq 0){
$a=$file-10
$count=$count+1}
else{
$a=$file-8
}
Get-Content $dpath\temp\serversetup2\sample.conf | Select-Object -Index $a >> $dpath\temp\serversetup2\temp\archs.txt
}最后,我真正需要的行是使用新的行号从archs.txt中提取到sample.conf。我使用if来确定第一次运行,就好像我有许多档案(不止一个)一样,包含systemlanguage的行和Archive值之间的内容变化如下:
{
"name": {
"value": "Arc9wa",
"valid": true
},
"displayName": {
"value": "Repository5",
"valid": true
},
"systemLanguage": {
"value": "de",
"valid": true
},但仍然是其他后续Archive值的模式。因此,我想,我可以设置一个固定的数字,以始终跳转到正确的行,以获得存档值(在我工作的计算机上工作得很好)。
最后一步是将存档的值提取到一个新的文件Archives.txt中
foreach($file in (Get-Content -Path $dpath\temp\serversetup2\temp\archs.txt)){
if($file -match ' "value": "(?<content>.*)",'){
$res= $matches['content']
Add-Content $dpath\temp\serversetup2\temp\archives.txt -Value $res
}}此代码在开发pc上运行良好。后来我发现,这个软件的每一个安装都会创建一个唯一的(非常相似但不同的) sample.conf文件,因此我不能使用固定操作(例如$a-10)跳转到正确的行来获取Archive值。
我需要帮助,以始终达到我正在寻找的价值。我试图找到唯一的关键字,以提取之间的数据,并进一步处理,以获得值。我发现的关键词是archiveInfo和hostInfo。我试着用这样的脚本
$db= Get-Content C:\temp\serversetup2\sample.conf
$db -match ' "archiveList(?<content>.*) "databaseInfo": {'
$res= $matches['content'] > C:\Users\Administrator\Desktop\test.txt和
$db= Get-Content C:\temp\serversetup2\sample.conf
$db | Select-String -Pattern 'archiveList(?<content>.*)databaseInfo'
$res= $matches['content'] 或
Get-Content C:\temp\serversetup2\sample.conf | Select-String -Pattern 'archiveList.*?databaseInfo' |
select -expandproperty matches | select captures > C:\Users\Administrator\Desktop\test.txt但他们都没用。我感谢你的每一个回答。
发布于 2020-08-12 11:11:47
不需要自己解析json,您可以使用内置cmdlet将json文本转换为结构化对象模型,您可以通过该模型来访问您感兴趣的属性。
这将有助于避免出现诸如换行符和其他空格干扰行号的问题,或者避免数据中的转义字符处理不当。
像这样的事情应该有效:
$data = Get-Content $myFile | ConvertFrom-Json;
write-host $data.name.valuehttps://stackoverflow.com/questions/63372990
复制相似问题