如何使用Powershell

时间:2017-10-26 23:49:11

标签: powershell scripting

我有一个问题,我真的希望得到一些帮助。 它相当复杂但我会尽量让我的解释尽可能简单和客观。简而言之,我有包含数千行的日志文件。每行包含日期/时间,来源,类型和消息等信息。 在这种情况下,消息包含我需要屏蔽的可变大小... 999密码。基本上,消息看起来像这样(它是一个ISO消息):

今年日 - 月00:00:00,计算机名称,来源,资讯,RX 0210 22222222222222333333333333333333444444444444444444444444455555 008PASSWORD 6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff

对于每一行,我需要对密码长度标识符(008)进行归零,对其进行计数,然后继续掩盖后续字符的数量,在这种情况下将是PASSWORD。我会把它改成类似XXXXXXXX的东西,所以一旦完成线就会是这样的:

今年日 - 月00:00:00,计算机名称,来源,资讯,RX 0210 22222222222222333333333333333333444444444444444444444444455555 008XXXXXXXX 6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff

老实说,我不知道如何使用PowerShell开始这样做。我需要遍历日志文件中的每一行,并确定要屏蔽的字符数。

我一直把这个高级别作为一个起点,我希望稍后能解决一些其他的复杂问题,比如有不同类型的消息并且取决于密码的类型长度从另一个角色位置开始。我可能首先能够建立我前面提到的问题,但如果有人理解我的意思,那么我也会感谢一些帮助或提示。

感谢任何帮助。

谢谢!

原始帖子的其他信息:

首先,感谢大家为您提供的答案,我们非常感谢。现在我根据我的信息制定了答案的基线,我觉得我需要提供更多细节。

1)有一个问题是密码起始位置是否固定及其背后的逻辑。

  • 密码位置不固定。在ISO消息(这些是)中,密码和消息中的所有信息取决于消息中存在的数据元素,而这些数据元素又由位图指示。位图也是消息的一部分。因此,在我的情况下,我需要在提供的答案之上和之外编写其他逻辑,以便完整循环。

2)这就是我所知道的,这些是我希望用脚本完成的步骤。

我所知道的:   - 有3种不同的msg类型包含密码。我已经根据位图和存在的数据元素找出了每个msg类型的密码起始位置。 例如,0210在这种情况下包含一个:

今年日 - 月00:00:00,计算机名称,来源,资讯,RX 0210 22222222222222333333333333333333444444444444444444444444455555008PASSWORD6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff

我需要做什么:

  1. 将日志文件传递给脚本
  2. 对于日志中的每一行,确定该行是否具有包含密码的msg类型
  3. 如果邮件类型包含密码,则通过读取密码的前3位数来确定密码长度(" ans ... 999"这意味着字母数字 - 特殊,长度最大为999和3位数长度信息)。让我们说在这种情况下,为了论证,密码的字符位置将是107,所以我们知道在它之前读取3个数字。
  4. 从密码的字符位置开始,屏蔽XXX所需的字符数。循环记录直到完成。

2 个答案:

答案 0 :(得分:1)

看起来好像您指示了密码的位置,密码的长度会有所不同。只要你有'008'和#666; 666'表示这样的开始和停止点应该起作用。

$filePath = '.\YourFile.log'

(Get-Content $filePath) | ForEach-Object {
    $startIndex = $_.IndexOf('008') + 3
    $endIndex = $_.IndexOf('666', $startIndex)
    $passwordLength = $endIndex - $startIndex
    $passwordToReplace = $_.Substring($startIndex,$passwordLength)
    $obfuscation = New-Object 'string' -ArgumentList 'X', $passwordLength
    $_.Replace($passwordToReplace, $obfuscation)
} | Set-Content $filePath

如果文件太大而无法加载到内存中,则必须StreamReaderStreamWriter将内容写入新文件并删除旧文件。

答案 1 :(得分:0)

假设密码长度字段开始的固定位置,根据您的样本行(如果该位置是可变的,正如您所暗示的那样,您需要告诉我们更多信息) :

$line = '22222222222222333333333333333333444444444444444444444444455555008PASSWORD6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff'

$posStart = 62 # fixed 0-based pos. where length-of-password field stats
$pwLenFieldLen = 3  # length of length-of-password field
$pwLen = [int] $line.SubString($posStart, $pwLenFieldLen) # extract password length
$pwSubstitute = 'X' * $pwLen # determine the password replacement string

# replace the password with all Xs
$line -replace "(?<=^.{$($posStart + $pwLenFieldLen)}).{$pwLen}(?=.*)", $pwSubstitute 

注意:这不是最有效的方法,但它很简洁。