标题: [问题求助] 使用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
- $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
- }
- }
- }
复制代码
作者: 5i365 时间: 2022-5-7 18:38
回复 2# idwma
大侠, 多行字符串, 没有实现
B.键值有时会多行还可能会有空行,例如下面例子中的t4,要表达方式如下:
所有行写在=的下面, 且每行前有一空格,如下所示
T 键名=
第一行字符
第三行字符
第五行字符
作者: idwma 时间: 2022-5-7 19:34
- $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
- }
- }
- }
复制代码
回复 3# 5i365
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |