gpt4 book ai didi

Powershell正则表达式产生与.NET在线测试器不同的结果

转载 作者:行者123 更新时间:2023-12-02 23:33:57 25 4
gpt4 key购买 nike

我正在尝试从文件中读取参数并自动将它们分配给 powershell 中的变量。但是,与使用相应的 .NET regex 风格相比,在 powershell 中使用正则表达式时,我得到了不同的输出。

这是我的输入文件(install.ini)的内容:

[sqlinstall]

Switch Parameters
------------------
Active = "Off"
Install = "false"
Update = "false"
Config = "false"
Local = "false"
New_Variable = "Test Variable"

Path Parametres
----------------
InstallPath = "C:\"

我使用以下 powershell 脚本 (extract.ps1) 提取了内容:

Set-Location $PSScriptRoot
$checkfile = "install.ini"
$readfile = Get-Content $checkfile
$filecontent = "$readfile"

# REGEX FILTER Install.ini
# -------------------
# Getting all 'switchname = switchvalue'
$regex_equals = '(?m)(?<switchname>\w+)(?=)\s*=\s*"(?<switchvalue>\w+|.*)"'

#Getting all folder paths: 'pathname = C:\ or C:\FOLDER\filde.pdf'
$regex_path = '(?m)(?<pathname>\w+)(?=)\s*=\s*\"?(?<pathvalue>\w:\\*[\\]{1}.*\w|\w:\\)'

# get everything: 'Parameter = Fullpath, Filepath, Filename, ext'
#$regex='(?<ParameterName>\w+)(?=)\s*=\s*\"?(?<FullPathAndFile>(?<FilePathOnly>\w:\\*[\\]{1}.*\"?)\\(?<FileName>\w+\.(?<Extension>\w{2,3})))'

$options = @('MultiLine') #[Text.RegularExpressions.RegexOptions]'Multiline'


# READ Install.ini ('switchname = switchvalue')
#---------------------------------------------
#[regex]::matches($filecontent, $regex_equals, $options)
$null = [regex]::matches($filecontent, $regex_equals, $options) | % { $_.Groups[1].Value } -OutVariable switchname
$null = [regex]::matches($filecontent, $regex_equals, $options) | % { $_.Groups[2].Value } -OutVariable switchvalue


# READ Install.ini ('pathname = C:\ or C:\FOLDER\filde.pdf')
#---------------------------------------------
#[regex]::matches($filecontent, $regex_path, $options)
$null = [regex]::matches($filecontent, $regex_path, $options) | % { $_.Groups[1].Value } -OutVariable pathname
$null = [regex]::matches($filecontent, $regex_path, $options) | % { $_.Groups[2].Value } -OutVariable pathvalue


#Asssign file parameters to Variables
#-------------------------------------
$dollar = "$"
$mark = '"'

<#
('switchname = switchvalue') => $Active = "Off"
$Install = "false"
$Update = "false"
$Config = "false"
$Local = "false"
$New_Variable = "Test input"

#>

foreach ($name in $switchname ) {
for ($i = 0; $i -lt $switchname.Count; $i++) {
switch ($switchname[$i]) {
($name) { New-Variable -Name $name -Value $switchvalue[$i] }
}
}
}


#('pathname = C:\ or C:\FOLDER\filde.pdf') => $InstallPath = "C:\"

foreach ($name in $pathname ) {
for ($i = 0; $i -lt $pathname.Count; $i++) {
switch ($pathname[$i]) {
($name) { New-Variable -Name $name -Value $pathvalue[$i] }
}
}
}

在线测试正则表达式时,两种模式都没有显示错误:
  • Online Test Pattern1
  • Online Test Pattern2

  • Powershell 显示大多数变量的正确结果:

    ------
    INPUT:
    ------
    Write-Host $Active
    Write-Host $Install
    Write-Host $Update
    Write-Host $Config
    Write-Host $Local
    Write-Host $InstallPath
    ------
    OUTPUT:
    ------
    Off
    false
    false
    false
    false
    C:\

    但它不会为所有变量产生正确的输出:

    ------
    INPUT:
    -----
    Write-Host $New_Variable
    ------
    OUTPUT:
    ------
    Test Variable" Path Parametres ------------------ InstallPath = "C:\

    也许我错误地放置了多行选项?任何建议将不胜感激。

    最佳答案

    您的 ini 文件看起来有点奇怪,因为它包含不应出现在 ini 文件中的字符串和分隔线。

    无论如何,使用辅助函数,您可以解析文件以接收具有文件属性的(有序)哈希表:

    function Parse-Ini {
    [CmdletBinding()]
    param(
    [Parameter(Mandatory = $true, Position = 0)]
    $Content
    )

    # PowerShell < 3.0
    # $ini = New-Object System.Collections.Specialized.OrderedDictionary([System.StringComparer]::OrdinalIgnoreCase)
    $ini = [ordered]@{}
    $section = "UNDEFINED"
    $line = 0

    $Content | ForEach-Object {
    $line++
    switch -regex ($_) {
    # a section
    '^\s*\[(.+)\]\s*$' {
    $section = $matches[1].Trim()
    if (!($ini[$section])) { $ini[$section] = [ordered]@{} }
    break
    }

    # a property: Key = Value
    '^\s*([^#]+?)\s*=\s*(.*)' {
    if (!($ini[$section])) { $ini[$section] = [ordered]@{} }
    # remove inline comment, trim and unquote
    $name, $value = ($matches[1..2] -replace '#.*$').Trim() -replace '^(?:"(.*)"|''(.*)'')$', '$1$2'
    $ini[$section][$name] = $value
    break
    }

    # skip comment and empty or whitespace only lines
    '^\s*#?$' { }

    # bad entry
    default {
    # comment out the next line if you don't want to seen the warnings
    Write-Warning "Bad entry detected in line $($line): '$_'"
    }
    }
    }

    return $ini
    }

    有了这个函数,你可以这样称呼它:
    $Params = Parse-Ini (Get-Content -Path 'D:\install.ini')

    它为您提供一个带有一个条目的哈希表 sqlinstall包含另一个具有您所追求的所有属性的哈希表:
    $Params.sqlinstall

    Name                           Value
    ---- -----
    Active Off
    Install false
    Update false
    Config false
    Local false
    New_Variable Test Variable
    InstallPath C:\


    并获得不同的条目,只需使用点符号
    $installPath = $Params.sqlinstall.InstallPath

    由于前面提到的无效条目,该函数将发出警告消息。如果您不关心这些消息,只需将 Write-Warning "Bad entry detected in line $($line): '$_'" 注释掉即可。

    关于Powershell正则表达式产生与.NET在线测试器不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60113247/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com