Завершено с помощью getprofiles.cmd
для вывода профилей и с помощью main.cmd
с циклом for для обработки путей к профилям.
main.cmd :
@echo off
setlocal
:: Install Wireshark.
echo Wireshark-win64-2.4.6.exe /S
:: Update Wireshark app data in user profiles.
for /f "tokens=*" %%A in ('getprofiles.cmd "\AppData\Roaming"') do (
call :skip_profile "%%~A" "\\Administrator\\" "\\MSSQL\$SQLEXPRESS\\" || (
echo mkdir "%%~A\Wireshark\"
echo xcopy preferences "%%~A\Wireshark"
)
)
exit /b
:skip_profile
for %%A in (%*) do (
if not "%%~A" == "" if /i not "%%~A" == "%~1" (
echo "%~1"| findstr /i "%%~A" >nul 2>nul
if not errorlevel 1 (
echo Skip account "%~1"
exit /b 0
)
)
)
exit /b 1
getprofiles.cmd :
@echo off
setlocal
if "%~1" == "/?" goto :help
:: ProfileList key that contains profile paths.
set "ProfileListKey=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
:: Get profiles directory path.
set "ProfilesDirectory="
for /f "tokens=1,3" %%A in (
'reg query "%ProfileListKey%" /v "ProfilesDirectory"'
) do if /i "%%~A" == "ProfilesDirectory" call set "ProfilesDirectory=%%~B"
if not defined ProfilesDirectory (
>&2 echo ProfilesDirectory is undefined
exit /b 1
)
:: Search all profile paths in profiles directory and echo existing paths appended with the 1st script argument.
for /f "delims=" %%A in (
'reg query "%ProfileListKey%"'
) do call :ProfilePath "%%~A" "%~1"
exit /b
:ProfilePath
setlocal
set "arg1=%~1"
:: Validate 1st call argument is a profile subkey.
if not defined arg1 exit /b 1
if /i "%arg1%" == "%ProfileListKey%" exit /b 1
if "%arg1:~,1%" == " " exit /b 1
:: Echo existing profile paths with defined 2nd argument appended.
for /f "tokens=1,3" %%A in (
'reg query "%arg1%" /v ProfileImagePath^|find /i "%ProfilesDirectory%"'
) do (
if "%%~A" == "ProfileImagePath" (
if exist "%%~B%~2" echo "%%~B%~2"
)
)
exit /b
:help
echo Prints profile paths from the registry that exist in the Profiles Directory.
echo 1st argument can be a path to be appended to the profile path.
echo i.e. "\AppData\Roaming" is appended to become "C:\Users\...\AppData\Roaming".
exit /b
Скрипт main.cmd
отображает результаты тестирования.Удалите эхо-сигналы, которые фактически используются, если команды верны.
Ключ ProfileList
в реестре хранит путь для поиска профилей и содержит подразделы с данными, такими как путь каждого профиля на компьютере.
main.cmd
позволяет избежать таких профилей, как Administrator
и MSSQL$SQLEXPRESS
.Вызываемая метка :skip_profile
принимает путь профиля в качестве 1-го аргумента.Следующие аргументы относятся к шаблонам и, если они совпадают, будут пропущенным профилем.findstr
используется для проверки пути к профилю на соответствие регулярным выражениям, поэтому используйте findstr /?
для требований синтаксиса.Регистр не зависит от использования /i
.
Сценарий getprofiles.cmd
получает путь ProfilesDirectory
, в котором можно найти папки профиля пользователя.Затем он запрашивает ключ для получения ключей профиля, используя вызываемую метку :ProfilePath
.Метка проверяет, найден ли путь ProfilesDirectory
в каждом найденном пути профиля.Затем он проверяет, существует ли путь, перед тем как повторить путь.Если передан необязательный 1-й параметр, он будет добавлен, и путь будет утвержден в качестве этого пути.
A выводит тест:
Wireshark-win64-2.4.6.exe /S
mkdir "C:\Users\Michael\AppData\Roaming\Wireshark\"
xcopy preferences "C:\Users\Michael\AppData\Roaming\Wireshark"
, что кажется нормальным, поскольку у меня есть только 1профиль пользователя на моем текущем компьютере.
Вероятно, вы могли бы объединить код, чтобы сделать всего 1 скрипт, хотя я решил оставить getprofiles.cmd
в качестве многоразового использования для других целей.