Powershell 剥离CMD输出以仅显示目录

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

我目前正在尝试用cmd脚本替换powershell脚本,因为它更适合尝试执行的操作

在Powershell中,我使用这段代码返回计算机上的个人文件夹目录列表

$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

您可能需要使用REG QUERY命令。在单个bat文件中,它希望:

@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