Powershell 屏蔽场复制

Powershell 屏蔽场复制,powershell,replace,Powershell,Replace,我试图屏蔽字符串中的字段,如下所示。它在某种程度上起了作用,真的是半途而废。在$addresspostcode之后的某个阶段,替换字符不会替换为正确的位置。有人能想出解决办法吗 ADRESSE0行来自输出文件 ADDRESSEE0|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|Y

我试图屏蔽字符串中的字段,如下所示。它在某种程度上起了作用,真的是半途而废。在
$addresspostcode
之后的某个阶段,替换字符不会替换为正确的位置。有人能想出解决办法吗

ADRESSE0行来自输出文件

ADDRESSEE0|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY|ZZZZZZZZ|Sir or MadamZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ |A1|OM|Mr Patrick MurphyZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|45 CregtownZZZZZZZZZZZZZZZZ |EastRoad RoadZZZZZZZZZZZZZZZZ |TownnamersZZZZZZZZZZZZZZZZ |CityAB 16ZZZZZZZZZZZZZZZZ |ZZZZZZZZ| |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|ZZZZZZZZZZZZZZZZ |Sir or MadamZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ |IA|3319041| | |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZZZZZZZZ
假设
ADDRESSEE0 |…
是输入字符串,为什么不先拆分数据呢?这提供了可管理的块,而不是一个带有大量方法链接的巨大字符串。这样,

# Get input data
$raw = `'ADDRESSEE0|ADDRESSEE1|ADDRESSEELine0|ADDRESSEELine1|...'` 

# Split the string by each pipe | char. This uses regex syntax, so escape \ is needed
$lines = $raw -split '\|'

# Assign splitted elements into more readable variables
$addresseeName  = $lines[0]
$addresseeName2 = $lines[1]
$addresseeLine1 = $lines[2]
...

# mask the data whatever way floats your boat
$addresseeName = $addresseeName.substring(0,9) + $mask08 

假设
ADDRESSEE0 |…
是输入字符串,为什么不先拆分数据呢?这提供了可管理的块,而不是一个带有大量方法链接的巨大字符串。这样,

# Get input data
$raw = `'ADDRESSEE0|ADDRESSEE1|ADDRESSEELine0|ADDRESSEELine1|...'` 

# Split the string by each pipe | char. This uses regex syntax, so escape \ is needed
$lines = $raw -split '\|'

# Assign splitted elements into more readable variables
$addresseeName  = $lines[0]
$addresseeName2 = $lines[1]
$addresseeLine1 = $lines[2]
...

# mask the data whatever way floats your boat
$addresseeName = $addresseeName.substring(0,9) + $mask08 

代码的问题在于它根据字符串的内容(而不是位置)进行替换。这意味着,如果字符串中的其他位置存在相同的文本,则它也会替换该文本,从而中断后面的替换

我建议你这样做:

$mask50 = 'X' * 50
$mask30 = 'Y' * 30
$mask08 = 'Z' * 8

$SomeInput | ForEach-Object { 

    if ($_.Substring(0,10) -eq 'ADDRESSEE0')
    {
        $SplitString = $_.Split('|')
        1..2 | ForEach-Object { $SplitString[$_] = $mask50 }
        3..6 | ForEach-Object { $SplitString[$_] = $mask30 }
        $SplitString[7] = $mask08
        8..9 | ForEach-Object { $SplitString[$_] = $mask50 }
        10..13 | ForEach-Object { $SplitString[$_] = $mask30 }

        $SplitString -Join '|'
    }
}
这将根据
|
字符分割字符串,然后对每个字符串进行单独替换(我们使用..数组表示法使其更有效)


然后,我们在字符串的末尾再次使用
|
字符连接该字符串。

代码的问题在于它根据字符串的内容(而不是位置)进行替换。这意味着,如果字符串中的其他位置存在相同的文本,则它也会替换该文本,从而中断后面的替换

我建议你这样做:

$mask50 = 'X' * 50
$mask30 = 'Y' * 30
$mask08 = 'Z' * 8

$SomeInput | ForEach-Object { 

    if ($_.Substring(0,10) -eq 'ADDRESSEE0')
    {
        $SplitString = $_.Split('|')
        1..2 | ForEach-Object { $SplitString[$_] = $mask50 }
        3..6 | ForEach-Object { $SplitString[$_] = $mask30 }
        $SplitString[7] = $mask08
        8..9 | ForEach-Object { $SplitString[$_] = $mask50 }
        10..13 | ForEach-Object { $SplitString[$_] = $mask30 }

        $SplitString -Join '|'
    }
}
这将根据
|
字符分割字符串,然后对每个字符串进行单独替换(我们使用..数组表示法使其更有效)


然后,我们在字符串的末尾用
|
字符再次连接字符串。

这非常好,比我刚才做的要简单得多。因此,1..2是由“|”分隔的第一个字段,因此我所做的是
$SplitString[7]=$mask08 11..12 | ForEach对象{$SplitString[$\u]=$mask50}
,因为字段(8,9,10)不需要被屏蔽。谢谢你,马克!这太棒了,比我之前做的容易多了。因此,1..2是由“|”分隔的第一个字段,因此我所做的是
$SplitString[7]=$mask08 11..12 | ForEach对象{$SplitString[$\u]=$mask50}
,因为字段(8,9,10)不需要被屏蔽。谢谢你,马克!谢谢你的评论,拆分似乎是一条路要走。谢谢你的评论,拆分似乎是一条路要走。