我发现的一切看起来都很复杂。 这几乎就像我只需要阅读一个文本文件。
ADAP.ini包含此内容,其他内容:
http://xxx.104.xxx.226
APP=2.3.6
DLL=2.3.6
使用Powershell, 我该如何阅读APP =值是什么? 和/或DLL =值是什么?
我会将值存储在变量中,稍后在Powershell脚本中使用它。
答案 0 :(得分:7)
这似乎是ConvertFrom-StringData
的一个很好的用例,它默认查找由等号符号分隔的键值对。
因为.ini文件的第一行没有等于,我们需要跳过它以避免错误。这可以通过Select -Skip 1
完成。
以下是代码:
$ADAP = Get-Content 'ADAP.ini' | Select -Skip 1 | ConvertFrom-StringData
然后,您可以通过访问它们作为$ADAP
对象的命名属性来获取APP和DLL的值,如下所示:
$ADAP.APP
$ADAP.DLL
答案 1 :(得分:5)
您可以轻松编写PowerShell函数,以便读取ini文件:
function Get-IniFile
{
param(
[parameter(Mandatory = $true)] [string] $filePath
)
$anonymous = "NoSection"
$ini = @{}
switch -regex -file $filePath
{
"^\[(.+)\]$" # Section
{
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
}
"^(;.*)$" # Comment
{
if (!($section))
{
$section = $anonymous
$ini[$section] = @{}
}
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = "Comment" + $CommentCount
$ini[$section][$name] = $value
}
"(.+?)\s*=\s*(.*)" # Key
{
if (!($section))
{
$section = $anonymous
$ini[$section] = @{}
}
$name,$value = $matches[1..2]
$ini[$section][$name] = $value
}
}
return $ini
}
$iniFile = Get-IniFile .\ADAP.ini
$app = $iniFile.NoSection.APP
$dll = $iniFile.NoSection.DLL
对于保存为Test.ini的此示例ini文件:
; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Widgets Inc.
[database]
; use IP address in case network name resolution is not working
server=192.0.2.62
port=143
file="payroll.dat"
这样做:
$testIni = Get-IniFile .\Test.ini
允许您检索如下值:
$server = $testIni.database.server
$organization = $testIni.owner.organization
答案 2 :(得分:3)
你做"只需要阅读文本文件" ..然后找到哪一行以APP开头,然后从中提取值。
# read text file # find line beginning APP=
$AppLine = Get-Content -Path test.ini | Where-Object { $_ -match 'APP=' }
# split on = symbol and take second item
$AppVersion = $AppLine.Split('=')[1]
您可能会从[version]$AppVersion
中受益,使其成为一个正确的可排序,可比较的版本号而不是字符串。
您可以通过多种方式进行阅读,匹配和提取值(Get-Content
,switch -file
,Select-String
,ForEach-Object
,-match 'APP=(.*)'
等各种组合。)
但Mark Wragg的答案总体上更好。
答案 3 :(得分:1)
$content = Get-Content ADAP.ini
$app = $content[1].Substring($content[1].IndexOf("=") + 1)
$dll = $content[2].Substring($content[2].IndexOf("=") + 1)
您可以通过调用cmdlet Get-Content并将其分配给变量来获取内容。通过访问数组中索引之类的行,您可以调用处理字符串的方法。
注意:代码很难看,我知道。
答案 4 :(得分:1)
马克·沃格(Mark Wragg)的答案的稍作修改的版本,通过简单的检查来确保每行有效,然后再将其传递到cmdlet进行处理。
set(app_compile_options "-Wall -Wextra -Wshadow -Wnon-virtual-dtor \
-Wold-style-cast \
-Woverloaded-virtual -Wzero-as-null-pointer-constant \
-pedantic -fPIE -fstack-protector-all -fno-rtti")
add_executable(foo foo.cpp)
target_compile_options(foo PUBLIC ${app_compile_options})
add_executable(bar bar.cpp)
target_compile_options(bar PUBLIC ${app_compile_options})
仅在我自己登陆时添加它,最后使用该解决方案来处理具有多个类别和注释行的配置文件。