首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用powershell从文件中提取值

使用powershell从文件中提取值
EN

Stack Overflow用户
提问于 2020-08-12 08:46:03
回答 1查看 444关注 0票数 0

我有一个文件,包含关于我们正在使用的软件的所有配置数据。从该文件中,我需要提取档案的名称,并确定有多少档案存在,以便将此信息传递给另一个脚本,以便使用档案名称执行此档案的导出。存档名称可在此上下文中找到。

代码语言:javascript
复制
{
        "name": {
          "value": "Archiv1",
          "valid": true
        },
        "displayName": {
          "value": "Repository4",
          "valid": true
        },
        "systemLanguage": {
          "value": "de",
          "valid": true
        },

在这种情况下,Archiv1将是我正在寻找的值。为此,我创建了以下脚本:

代码语言:javascript
复制
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中。

代码语言:javascript
复制
 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名称的行,使用:

代码语言:javascript
复制
$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值之间的内容变化如下:

代码语言:javascript
复制
 {
        "name": {
          "value": "Arc9wa",
          "valid": true
        },
        "displayName": {
          "value": "Repository5",
          "valid": true
        },
        "systemLanguage": {
          "value": "de",
          "valid": true
        },

但仍然是其他后续Archive值的模式。因此,我想,我可以设置一个固定的数字,以始终跳转到正确的行,以获得存档值(在我工作的计算机上工作得很好)。

最后一步是将存档的值提取到一个新的文件Archives.txt中

代码语言:javascript
复制
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。我试着用这样的脚本

代码语言:javascript
复制
$db= Get-Content C:\temp\serversetup2\sample.conf
$db -match '    "archiveList(?<content>.*)  "databaseInfo": {'
$res= $matches['content'] > C:\Users\Administrator\Desktop\test.txt

代码语言:javascript
复制
$db= Get-Content C:\temp\serversetup2\sample.conf

$db | Select-String -Pattern 'archiveList(?<content>.*)databaseInfo'
$res= $matches['content'] 

代码语言:javascript
复制
Get-Content C:\temp\serversetup2\sample.conf | Select-String -Pattern 'archiveList.*?databaseInfo' |
 select -expandproperty matches | select captures  > C:\Users\Administrator\Desktop\test.txt

但他们都没用。我感谢你的每一个回答。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-12 11:11:47

不需要自己解析json,您可以使用内置cmdlet将json文本转换为结构化对象模型,您可以通过该模型来访问您感兴趣的属性。

这将有助于避免出现诸如换行符和其他空格干扰行号的问题,或者避免数据中的转义字符处理不当。

像这样的事情应该有效:

代码语言:javascript
复制
$data = Get-Content $myFile | ConvertFrom-Json;

write-host $data.name.value
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63372990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档