powershell - Powershell每行替换一次文本

标签 powershell replace active-directory-group

我有一个Powershell脚本,我想尝试其中的一部分,因此输入的文本列出了他们所在的用户组。该PS脚本应该用我在 Activity 目录中为其分配的组替换该组(仅限于仅更改 Activity 目录中的组)。我的问题是,当到达HR并替换HR时,它将继续构建并替换所有新HR,但是所有这些都替换了CHRL中的HR,因此我的团队现在看起来很疯狂。但是我一直在寻找它,并不是每行都如此。但是对于gilchrist而言,它将以HR的名义加入一些内容。我可以做些什么来保持它的变化,还是必须将我的人力资源更改为人力资源?谢谢您的帮助。

$lookupTable = @{
'Admin' = 'W_CHRL_ADMIN_GS,M_CHRL_ADMIN_UD,M_CHRL_SITE_GS'
'Security' = 'W_CHRL_SECURITY_GS,M_CHRL_SITE_GS'
'HR' = 'M_CHRL_HR_UD,W_CHRL_HR_GS,M_CHRL_SITE_GS'

    $original_file = 'c:\tmp\test.txt'
    $destination_file =  'c:\tmp\test2.txt'

    Get-Content -Path $original_file | ForEach-Object {
        $line = $_

        $lookupTable.GetEnumerator() | ForEach-Object {
            if ($line -match $_.Key)
            {
                $line = $line -replace $_.Key, $_.Value
            }
        }
       $line
    } | Set-Content -Path $destination_file

    Get-Content $destination_file

test.txt:
user,group 
john.smith,Admin 
joanha.smith,HR 
john.gilchrist,security
aaron.r.smith,admin
abby.doe,secuity 
abigail.doe,admin

最佳答案

您的输入似乎是CSV格式(尽管请注意,示例行中包含尾随空格,如果它们是实际数据的一部分,则必须处理)。

因此,使用Import-CsvExport-Csv 来读取/重写您的数据,这提供了一个更加简洁方便的解决方案:

Import-Csv test.txt |
  Select-Object user, @{ Name='group'; Expression = { $lookupTable[$_.group] } } |
    Export-Csv -NoTypeInformation -Encoding Utf8 test2.txt
  • Import-Csv读取CSV文件作为其属性与CSV列值相对应的自定义对象的集合;也就是说,根据您的情况,每个对象都具有.user.name属性。
  • 因此,
  • $_.group仅健壮地报告抽象组名,您可以将其直接传递给您的查找哈希表。 Select-Object用于传递原始.user值,并使用计算所得的属性将原始.group值替换为查找结果。
  • Export-Csv将自定义对象重新转换为CSV文件:
  • -NoTypeInformation禁止在输出文件
  • 顶部的(通常无用的)数据类型信息行
    添加了
  • -Encoding Utf8以防止潜在的数据丢失,因为默认情况下使用的是ASCII编码。
  • 注意Export-Csv盲目地将所有字段值都用双引号引起来,无论是否需要;也就是说,CSV读取器应该能够处理该问题(而Import-Csv当然可以)。


  • 至于您尝试了什么:
    -replace运算符替换输入中所有出现的给定正则表达式(正则表达式)。

    您的正则表达式相当于查找(不区分大小写)子字符串,这说明了HR为什么同时匹配用户名HR中的hr组名和子字符串gilchrist

    一个简单的解决方法是在您的正则表达式中添加断言,以使子字符串仅在您需要的位置匹配;例如:,HR$仅在行末尾的,($)之后匹配。

    但是,枚举每个输入CSV行的哈希表键的方法效率低下,最好拆分组名并基于它进行直接查找:
    # Split the row into fields.
    $fields = $line -split ','
    
    # Update the group value (last field)
    $fields[-1] = $lookupTable[$fields[-1]]
    
    # Rebuild the line
    $line = $fields -join ','
    

    请注意,您必须为标题行设置异常(exception)(例如,测试查找结果是否为空,如果更新,则避免更新)。

    关于powershell - Powershell每行替换一次文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784869/

    相关文章:

    C# Powershell 互操作

    javascript - 替换 - 用 - 使用 replace()

    sharepoint - 无法在 Sharepoint 2010 受众中查看新的 Active Directory 安全组

    .net - 快速获取群组成员资格

    powershell - Azure Powershell 失败并出现模糊错误 : One or more errors occurred

    powershell - 如何获取 “Invoke-Expression”的状态,成功还是失败?

    r - 将数据帧中的值与另一个数据帧中的值进行匹配,并用另一个数据帧中的相应模式替换前一个

    awk - 如果与另一个 file.txt 匹配,则替换文件 (fasta) 中的 header

    C# 将事件目录用户添加到组

    powershell - 术语 'New-AzureRmUserAssignedIdentity' 未被识别为名称