Вот пакетный код, чтобы получить список * .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, файлы Personal Storage, которые являются файлами контейнеры для электронной почты, контактов, ...
Команда ДЛЯ работает консольное приложение 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
Выводится раздел реестра и следующие значения реестра, каждый из которых имеет 4 пробела и 4 пробела между именем значения и типом значения и 4 пробелами между типом значения и значением данных.
Но на Windows XP выход для примера:
! 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
переменной окружения RegData
и получить следующий из этой строки все после того, как .pst
присвоенного переменной окружения DelData
.
Если строка содержит .pst
в любом случае вообще, что приводит к значению DelData
быть не равно значение RegData
, подпрограмма OutputFileName
вызывается для дальнейшей обработки и печати имя файла * .pst файла.
В подпрограмме OutputFileName
сначала строка справа от * .pst имя файла удаляется из RegData
с помощью замены строки. Следующее * .pst имя файла выводится без 4 отступов в начале.
Если число отступов не всегда будет ровно 4 пробелами, то строка echo !RegData:~4!
может быть заменена следующим кодом, чтобы работать независимо от количества отступов/вкладок.
for /F "tokens=1*" %%I in ("%RegData%") do (
if "%%J" == "" (
echo %%I
) else (
echo %%I %%J
)
)
Использование REG вместо REGEDIT имеет то преимущество, что нет повышенных привилегий администратора, не является необходимым для выполнения этого пакетного кода.
Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.
call /?
echo /?
for /?
goto /?
reg /?
reg query /?
set /?
setlocal /?
Ничего не выводится, если ключ реестра не существует. Сообщение об ошибке для обработки STDERR здесь подавлено путем перенаправления его на 2^>nul
на устройство NUL. Подробнее см. Статью Microsoft Using command redirection operators.Оператор перенаправления >
должны быть экранированы здесь с характером ^
каретки следует интерпретировать как буквенный символ на разборе FOR командной строки и интерпретируется как оператор перенаправления на исполнение REG командной строки ДЛЯ.
Проблема с 'regedit' это создает Unicode текстовые файлы по-умолчанию, которые не являются тривиальными для обработки с помощью' cmd'; поэтому используйте команду 'reg query' вместо ... – aschipfl
Привет, могу спросить, почему cmd больше подходит для того, что пытается сделать, чем Powershell здесь? – sodawillow
@sodawillow Если бы я использовал CMD вместо powershell, то для этого не нужно будет менять групповую политику. –