Powershell 剥离CMD输出以仅显示目录
我目前正在尝试用cmd脚本替换powershell脚本,因为它更适合尝试执行的操作 在Powershell中,我使用这段代码返回计算机上的个人文件夹目录列表Powershell 剥离CMD输出以仅显示目录,powershell,cmd,registry,Powershell,Cmd,Registry,我目前正在尝试用cmd脚本替换powershell脚本,因为它更适合尝试执行的操作 在Powershell中,我使用这段代码返回计算机上的个人文件夹目录列表 $Name = [Environment]::UserName get-item HKCU:\software\Microsoft\Office\15.0\Outlook\Search\Catalog - ErrorAction SilentlyContinue | select -expandProperty property | Out
$Name = [Environment]::UserName
get-item HKCU:\software\Microsoft\Office\15.0\Outlook\Search\Catalog - ErrorAction SilentlyContinue | select -expandProperty property | Out-File Z:\global\pst\PowershellOutput\$Name.txt -append
这就是我想要的,并输出一个目录列表,如下所示
H:\PST\My Outlook Data File 1.pst
H:\PST\My Outlook Data File 2.pst
C:\PST\My Outlook Data File 3.pst
但是,当我运行此行提取注册表项时
regedit.exe /e Z:\global\battest\%username%.txt "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog"
我得到一个包含大量不必要数据的输出
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog]
"H:\\PST\\My Outlook Data File 1.pst"=hex:0c,01,00,00,00,00,00,00
"H:\\PST\\My Outlook Data File 2.pst"=hex:f8,00,00,00,00,00,00,00
"C:\\PST\\My Outlook Data File 3.pst"=hex:ac,02,00,00,00,00,00,00
此数据被传递到另一个程序*上,因此解决方法可能是使用“”标记内的数据,但它也有双反斜杠,这使得数据难以传递
有没有更好的方法在CMD中获取这些值,或者是一个我忽略的参数,它只是显示目录
- -很抱歉,在此之前没有包括此程序,但是此程序不是CMD程序,它是visual basic
@echo OFF
for /f "usebackq tokens=1-3" %%A in (`REG QUERY "HKCU\Software\Microsoft\Office\15.0\Outlook\Search\Catalog"`) do (
set ValueName=%%A
)
echo %ValueName% > Z:\global\battest\%username%.txt
这是从获得的批处理代码,用于获取*.pst文件列表(不是目录),这些文件独立于*.pst文件的数量及其文件名,只要文件名以
.pst
结尾即可
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "skip=1 delims=" %%# in ('%SystemRoot%\System32\reg.exe query HKCU\Software\Microsoft\Office\15.0\Outlook\Search\Catalog 2^>nul') do (
set "RegData=%%#"
set "DelData=!RegData:*.pst=!"
if not "!DelData!" == "!RegData!" call :OutputFileName
)
endlocal
goto :EOF
:OutputFileName
set "RegData=!RegData:%DelData%=!"
echo !RegData:~4!
goto :EOF
*.pst文件是Outlook个人存储文件,是电子邮件、联系人等的容器文件
FOR的命令运行控制台应用程序REG查询注册表项的所有值:
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog
例如,Windows Vista和更高版本的Windows上的输出:
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog
H:\PST\My Outlook Data File 1.pst REG_SZ whatever the
H:\PST\My Outlook Data File 2.pst REG_SZ data value is
C:\PST\My Outlook Data File 3.pst REG_SZ of each value
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog
H:\PST\My Outlook Data File 1.pst REG_SZ whatever the
H:\PST\My Outlook Data File 2.pst REG_SZ data value is
C:\PST\My Outlook Data File 3.pst REG_SZ of each value
输出注册表项,然后是注册表值,每个值缩进4个空格,值名称和值类型之间缩进4个空格,值类型和数据值之间缩进4个空格
但在Windows XP上,输出为以下示例:
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog
H:\PST\My Outlook Data File 1.pst REG_SZ whatever the
H:\PST\My Outlook Data File 2.pst REG_SZ data value is
C:\PST\My Outlook Data File 3.pst REG_SZ of each value
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog
H:\PST\My Outlook Data File 1.pst REG_SZ whatever the
H:\PST\My Outlook Data File 2.pst REG_SZ data value is
C:\PST\My Outlook Data File 3.pst REG_SZ of each value
因此,在注册表项之前有前两行标题。注册表值也缩进4个空格。但在值名称和值类型之间有1个或多个制表符而不是空格,在值类型和数据值之间也有1个或多个制表符而不是空格
注意:我不知道REG_SZ
是否是正确的注册表值类型。我的Windows注册表中根本没有这个注册表项,因此只添加了3个注册表值作为带有伪字符串的字符串值
因此,棘手的部分是如何获取注册表值名称,该名称还包含空格,以便仅获取独立于文件名的*.pst文件的名称
这是通过将每个输出行(第一行除外)分配给环境变量skip=1
,并从此行获取分配给环境变量DelData
的.pst
之后的所有内容来完成的
如果行在任何情况下都包含.pst
,导致DelData
的值与RegData
的值不相等,则调用子例程OutputFileName
,以便进一步处理和打印*.pst文件的文件名
在子例程OutputFileName
中,首先使用字符串替换从RegData
中删除*.pst文件名的字符串右侧。接下来输出*.pst文件名,开头不带4个缩进空格
如果缩进空格的数量不总是正好是4个空格,那么行echo!RegData:~4代码>可以由以下代码替换,以独立于缩进空格/制表符的数量工作
for /F "tokens=1*" %%I in ("%RegData%") do (
if "%%J" == "" (
echo %%I
) else (
echo %%I %%J
)
)
使用REG而不是REGEDIT的优点是,运行此批处理代码不需要管理员的提升权限
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
呼叫/?
echo/?
获取/?
goto/?
reg/?
reg query/?
设置/?
setlocal/?
如果注册表项不存在,则不会输出任何内容。通过使用2^>nul
将错误消息输出重定向到设备nul来抑制要处理STDERR的错误消息输出。有关详细信息,请参阅Microsoft文章。重定向运算符
必须在此处转义,在解析FOR命令行时,必须使用插入符号^
将其解释为文字字符;在我没有Office的情况下,在执行FOR命令行时,必须将其解释为重定向运算符安装测试,这应该可以完成工作
@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“HKCU=&H80000001”
设置“subKey=software\Microsoft\Office\15.0\Outlook\Search\Catalog”
>>“Z:\global\pst\PowershellOutput\%username%.txt”(
对于/f“tokens=2 delims={”%%a in('
wmic
/命名空间:\\root\default
StdRegProv级
调用枚举值
hDefKey^=“%HKCU%”
sSubKeyName^=“%subkey%”
2^>nul
^|查找“sNames={”
“)在(%%a)中为%%b执行(
对于/f delims^=^“%%c in(“%%~b”)执行echo(%%~fc
)
)
它使用wmic
检索在指定键下定义的值列表,并过滤输出,以仅检索具有这些值名称的行,格式为sNames={“v1”、“v2”、“v3”}
{
用于将行的开头与值列表(%%a
)分开,并对该列表进行迭代(%%b
)以获取每个值。列表中的最后一个元素包括需要删除的结尾}
,这由%%c
使用t