Board logo

标题: [问题求助] 使用Powershell将注册表内容改为特定格式 [打印本页]

作者: 5i365    时间: 2022-5-6 08:37     标题: 使用Powershell将注册表内容改为特定格式

本帖最后由 5i365 于 2022-5-6 08:56 编辑

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

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


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


百度了一些资料, 说是导出的注册表里面,就是ini文件的键值对, 但是powershell好像没有处理ini文件的相关函数, 估计只能用万能的正则了
__________________________________________________________________________________________________________________________
总结了一下, 导出的注册表文件中:


键值的前面一行是其所在的路径, 是用[xxx\xxx\xxx]括起来的, 第一个 \ 之前是根路径, 之后是具体路径

表达方式改为: 在其前面加个;分号就可以了注意: 路径可能有多个, 路径下方的键值,在表达时,要使用其所在的 根路径 和 具体路径 的值

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

1.字符串类型, 为了方便区分, 这个类型就定义为 T
这种类型的特点是 = 后跟着"" 引号里面就是值
要改成的格式为:


T 键名="键值"
set 键名 "键名" "具体路径" 根路径


A.键值有时会为空,例如下面例子中的t1,此时就用""表达
B.键值有时会多行还可能会有空行,例如下面例子中的t4,要表达方式如下:
所有行写在=的下面, 且每行前有一空格,如下所示

T 键名=
第一行字符

第三行字符

第五行字符


--------------------------------------------------------------
2.数字类型, 为了方便区分, 这个类型就定义为 D
这种类型的特点是 = 后跟着dword: 冒号后面就是值,要表达方式如下:

D 键名=键值
set 键名 "键名" "具体路径" 根路径


--------------------------------------------------------------
3.十六进制类型, 为了方便区分, 这个类型就定义为 H
这种类型的特点是 = 后跟着hex:  冒号后面就是值,要表达方式如下:

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

键值有多行时: 把多行拼成一行,并删除\ 把逗号改为空格, 例如下面例子中的h2:

______________________________________________________________________________________
Test.reg文件内容:


[HKEY_CURRENT_USER\Software\A\B\C]
"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


"


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


bb,,0x5


cc,,0x7


"

_________________________________________________________________________________
期待转换为下面的格式:



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


T t1=""
set t1 "t1" "Software\A\B\C" HKEY_CURRENT_USER


D d1=064
set d1 "d1" "Software\A\B\C" HKEY_CURRENT_USER


H h1
h1.str(1 "20 01 00")
set h1 "h1" "Software\A\B\C" HKEY_CURRENT_USER


T t2="C:\a\b.txt"
set t2 "t2" "Software\A\B\C" HKEY_CURRENT_USER


T t3="C:\c d\e\"
set t3 "t3" "Software\A\B\C" HKEY_CURRENT_USER


D d2=01
set d2 "d2" "Software\A\B\C" HKEY_CURRENT_USER


H h2
h2.str(1 "02 0c 00 00 00 00 00 00 00 00 00 00 00")
set h2 "h2" "Software\A\B\C" HKEY_CURRENT_USER


T t4=
a,,0x0

b,,0x2

c,,0x5
set t4 "t4" "Software\A\B\C" HKEY_CURRENT_USER


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


D d1=064
set d1 "d1" "Software\D\E\F" HKEY_LOCAL_MACHINE


H h1
h1.str(1 "20 01 00")
set h1 "h1" "Software\D\E\F" HKEY_LOCAL_MACHINE


T t3="C:\c d\e\"
set t3 "t3" "Software\D\E\F" HKEY_LOCAL_MACHINE


T t4=
a,,0x0

b,,0x2

c,,0x5
set t4 "t4" "Software\D\E\F" HKEY_LOCAL_MACHINE

作者: idwma    时间: 2022-5-7 12:20

  1. $a=(gc test.reg) -join "`n"
  2. $a -split '(?=\[.*\])'|%{
  3. $_ -split '(?=".+"=.*)'|%{
  4. if($_ -match '^\s*\[([^\\]+)\\(.+)\]\s*$'){$b=$matches[1..2];";$_"}
  5. if($_ -match '"(?s)([^"]+)"=(.+)'){
  6. $c=$matches[1..2]|%{$_.trim()}
  7. 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]}
  8. if($s -eq 'H'){$c[1]=$c[1] -replace ',\\\s*|,',' ';$d='.str(1 "';$e='")'}else{$d='=';$e=''}
  9. "{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
  10. }
  11. }
  12. }
复制代码

作者: 5i365    时间: 2022-5-7 18:38

回复 2# idwma

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

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

T 键名=
第一行字符

第三行字符

第五行字符
作者: idwma    时间: 2022-5-7 19:34

  1. $a=(gc test.reg) -join "`n"
  2. $a -split '(?=\[.*\])'|%{
  3. $_ -split '(?=".+"=.*)'|%{
  4. if($_ -match '^\s*\[([^\\]+)\\(.+)\]\s*$'){$b=$matches[1..2];";$_"}
  5. if($_ -match '"(?s)([^"]+)"=(.+)'){
  6. $c=$matches[1..2]|%{$_.trim()}
  7. 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]}
  8. if($s -eq 'H'){$c[1]=$c[1] -replace ',\\\s*|,',' ';$d="`n{0}{1}" -f $c[0],'.str(1 "';$e='")'}else{$d='=';$e=''}
  9. $c[1]=$c[1] -replace '\\\\','\'
  10. $g="`n"
  11. if($c[1] -match '.*\n.*\n'){$c[1]=$c[1] -replace '^"|"$' -split '\n'|%{if($_.trim() -ne ''){'',$_.trim()}};$c[1]=$c[1]|out-string;$g=''}
  12. "{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
  13. }
  14. }
  15. }
复制代码
回复 3# 5i365




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2