批处理之家's Archiver

5i365 发表于 2022-5-6 08:37

使用Powershell将注册表内容改为特定格式

[i=s] 本帖最后由 5i365 于 2022-5-6 08:56 编辑 [/i]

[size=3]我从系统注册表中将某个软件的一些数据导出为了一个文件,文件名为 [b]Test.reg[/b]

在这个文件中,包含很多类似hash表形式的键和值, 我想改变一下表达的格式


想按hash表来处理, 但是无从下手, 期待高手指引一下, 提前感谢


百度了一些资料, 说是导出的注册表里面,就是ini文件的键值对, 但是powershell好像没有处理ini文件的相关函数, 估计只能用万能的正则了
[/size]__________________________________________________________________________________________________________________________[size=3]
总结了一下, 导出的注册表文件中:[/size][size=3]
[/size]
[size=3]键值的前面一行是其所在的路径, 是用[xxx\xxx\xxx]括起来的, 第一个 \ 之前是根路径, 之后是具体路径[/size][size=3]
[/size]
[size=3]表达方式改为: 在其前面加个[color=#ff0000];分号[/color]就可以了[/size][size=3]注意: 路径可能有多个, 路径下方的键值,在表达时,要使用其所在的 [/size]根路径 和 具体路径 的值[size=3]

--------------------------------------------------------------
键值大致分为三大类型:

1.[color=#ff0000][b]字符串[/b][/color]类型, 为了方便区分, 这个类型就定义为[b][color=#ff0000] T[/color][/b]
这种类型的特点是 = 后跟着"" 引号里面就是值
要改成的格式为:[/size]
[size=3]
T 键名="键值"
set 键名 "键名" "具体路径" 根路径[/size]
[size=3]
[color=#ff0000][b]A.[/b][/color]键值有时会为空,例如下面例子中的t1,此时就用""表达
[b][color=#ff0000]B.[/color][/b]键值有时会多行还可能会有空行,例如下面例子中的t4,要表达方式如下:
所有行写在=的下面, 且每行前有一空格,如下所示

T 键名=
第一行字符

第三行字符

第五行字符[/size]
[size=3]
[/size]--------------------------------------------------------------[size=3]
2.[b][color=#ff0000]数字[/color][/b]类型, 为了方便区分, 这个类型就定义为 [b][color=#ff0000]D[/color][/b]
这种类型的特点是 = 后跟着dword: 冒号后面就是值,要表达方式如下:

D 键名=键值
set 键名 "键名" "具体路径" 根路径[/size]
[size=3]
[/size]--------------------------------------------------------------[size=3]
3.[b][color=#ff0000]十六进制[/color][/b]类型, 为了方便区分, 这个类型就定义为[b] [color=#ff0000]H[/color][/b]
这种类型的特点是 = 后跟着hex:  冒号后面就是值,要表达方式如下:

H 键名
键名.str(1 "键值")
set 键名 "键名" "具体路径" 根路径

[b][color=#ff0000]键值有多行时:[/color][/b] 把多行拼成一行,并删除\ 把逗号改为空格, 例如下面例子中的h2:

______________________________________________________________________________________
[b]Test.reg[/b]文件内容:


[[color=#ff0000]HKEY_CURRENT_USER[/color]\[color=#0000ff]Software\A\B\C[/color]]
"t1"=""
"d1"=dword:064
"h1"=hex:20,01,00
"t2"="C:\\a\\b.txt"
"t3"="C:\\c d\\e\\"
"d2"=dword:01
"h2"=hex:02,0c,\
  00,00,00,00,\
  00,00,00,00,\
  00,00,00
  
"t4"="a,,0x0


b,,0x2


c,,0x5


"


[[color=#ff0000]HKEY_LOCAL_MACHINE[/color]\[color=#0000ff]Software\D\E\F[/color]]
"d1"=dword:064
"h1"=hex:20,01,00
"t3"="C:\\c d\\e\\"
"t4"="aa,,0x9


bb,,0x5


cc,,0x7


"

_________________________________________________________________________________
[b]期待转换为下面的格式:[/b]



;[HKEY_CURRENT_USER\Software\A\B\C]


T t1=""
set t1 "t1" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


D d1=064
set d1 "d1" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


H h1
h1.str(1 "20 01 00")
set h1 "h1" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


T t2="C:\a\b.txt"
set t2 "t2" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


T t3="C:\c d\e\"
set t3 "t3" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


D d2=01
set d2 "d2" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


H h2
h2.str(1 "02 0c 00 00 00 00 00 00 00 00 00 00 00")
set h2 "h2" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


T t4=
a,,0x0

b,,0x2

c,,0x5
set t4 "t4" [color=#0000ff]"Software\A\B\C"[/color] [color=#ff0000]HKEY_CURRENT_USER[/color]


;[HKEY_LOCAL_MACHINE\Software\D\E\F]


D d1=064
set d1 "d1" [color=#0000ff]"Software\D\E\F"[/color] [color=#ff0000]HKEY_LOCAL_MACHINE[/color]


H h1
h1.str(1 "20 01 00")
set h1 "h1" [color=#0000ff]"Software\D\E\F"[/color] [color=#ff0000]HKEY_LOCAL_MACHINE[/color]


T t3="C:\c d\e\"
set t3 "t3" [color=#0000ff]"Software\D\E\F"[/color] [color=#ff0000]HKEY_LOCAL_MACHINE[/color]


T t4=
a,,0x0

b,,0x2

c,,0x5
set t4 "t4" [color=#0000ff]"Software\D\E\F"[/color] [color=#ff0000]HKEY_LOCAL_MACHINE[/color][/size]

idwma 发表于 2022-5-7 12:20

[code]$a=(gc test.reg) -join "`n"
$a -split '(?=\[.*\])'|%{
$_ -split '(?=".+"=.*)'|%{
if($_ -match '^\s*\[([^\\]+)\\(.+)\]\s*$'){$b=$matches[1..2];";$_"}
if($_ -match '"(?s)([^"]+)"=(.+)'){
$c=$matches[1..2]|%{$_.trim()}
if($c[1] -match '^"'){$s='T'}elseif($c[1] -match '^dword:(.*)'){$s='D';$c[1]=$matches[1]}elseif($c[1] -match '(?s)^hex:(.*)'){$s='H';$c[1]=$matches[1]}
if($s -eq 'H'){$c[1]=$c[1] -replace ',\\\s*|,',' ';$d='.str(1 "';$e='")'}else{$d='=';$e=''}
"{0} {1}{4}{2}{5}`n{3}`n" -f $s,$c[0],($c[1] -replace '\\\\','\'),$('set {0} "{1}" "{2}" {3}' -f $c[0],$c[0],$b[1],$b[0]),$d,$e
}
}
}
[/code]

5i365 发表于 2022-5-7 18:38

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255393&ptid=62639]2#[/url] [i]idwma[/i] [/b]

大侠, 多行字符串, 没有实现

[b][color=#ff0000]B.[/color][/b]键值有时会多行还可能会有空行,例如下面例子中的t4,要表达方式如下:
所有行写在=的下面, 且每行前有一空格,如下所示

T 键名=
第一行字符

第三行字符

第五行字符

idwma 发表于 2022-5-7 19:34

[code]$a=(gc test.reg) -join "`n"
$a -split '(?=\[.*\])'|%{
$_ -split '(?=".+"=.*)'|%{
if($_ -match '^\s*\[([^\\]+)\\(.+)\]\s*$'){$b=$matches[1..2];";$_"}
if($_ -match '"(?s)([^"]+)"=(.+)'){
$c=$matches[1..2]|%{$_.trim()}
if($c[1] -match '^"'){$s='T'}elseif($c[1] -match '^dword:(.*)'){$s='D';$c[1]=$matches[1]}elseif($c[1] -match '(?s)^hex:(.*)'){$s='H';$c[1]=$matches[1]}
if($s -eq 'H'){$c[1]=$c[1] -replace ',\\\s*|,',' ';$d="`n{0}{1}" -f $c[0],'.str(1 "';$e='")'}else{$d='=';$e=''}
$c[1]=$c[1] -replace '\\\\','\'
$g="`n"
if($c[1] -match '.*\n.*\n'){$c[1]=$c[1] -replace '^"|"$' -split '\n'|%{if($_.trim() -ne ''){'',$_.trim()}};$c[1]=$c[1]|out-string;$g=''}
"{0} {1}{4}{2}{5}{6}{3}`n" -f $s,$c[0],$c[1],$('set {0} "{1}" "{2}" {3}' -f $c[0],$c[0],$b[1],$b[0]),$d,$e,$g
}
}
}[/code][b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=255406&ptid=62639]3#[/url] [i]5i365[/i] [/b]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.