Предопределенные переменные среды Windows для каждой учетной записи пользователя. Одна из предопределенных переменных среды - USERPROFILE
, содержащая путь к каталогу профиля пользователя.
Каталог рабочего стола пользователя по умолчанию %USERPROFILE%\Desktop
, как определено в реестре Windows под ключом HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
со значением Desktop
типа REG_EXPAND_SZ
.
Существует также ключ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
также со значением Desktop
, но типа REG_SZ
с путем к папке на рабочем столе пользователя с уже расширенной ссылкой на переменную среды.
Пользователь имеет возможность изменить путь к папке любой папки оболочки, включая папку на рабочем столе, хотя большинство путей к папке оболочки остаются такими, как определено по умолчанию.
Таким образом, безопасный способ получить путь к папке на рабочем столе пользователя:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DesktopFolder="
for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder for /F "skip=1 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder set "DesktopFolder=%UserProfile%\Desktop"
echo Desktop folder is: "%DesktopFolder%"
endlocal
Переменная среды DesktopFolder
сначала удаляется, если она случайно уже существует в локальной среде командного файла.
Далее по умолчанию запрашивается уже развернутое значение реестра Desktop
раздела реестра Shell Folders
, и если раздел реестра с этим значением реестра существует с непустой строкой, как и ожидалось, путь к папке назначается переменной среды DesktopFolder
. В целях безопасности тип значения реестра также оценивается, хотя это значение реестра всегда должно иметь тип REG_SZ
.
Маловероятно, что первый запрос реестра не будет успешным ни в одной Windows, включая Windows 2000, Windows XP и Windows Server 2003 и, конечно, во всех более новых версиях Windows. Но если первый запрос реестра не смог определить папку рабочего стола пользователя, выполняется еще один запрос реестра для строкового значения Desktop
под ключом User Shell Folders
, который по умолчанию имеет тип REG_EXPAND_SZ
. В этом случае call
используется для раскрытия ссылки на переменную среды уже перед тем, как назначить путь к папке для переменной среды DesktopFolder
путем двойного анализа этой последней части длинной командной строки.
Последняя переменная среды DesktopFolder
определяется с путем к папке по умолчанию, используя предопределенную переменную среды UserProfile
для почти 100% безопасности, если оба запроса реестра неожиданно завершились неудачей.
Итак, переменная среды DesktopFolder
содержит путь к папке на рабочем столе пользователя вплоть до строки с командой endlocal
.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
call /?
echo /?
endlocal /?
for /?
if /?
reg /?
и reg query /?
set /?
setlocal /?
Прочитайте статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul
. Оператор перенаправления >
должен быть экранирован с помощью символа вставки ^
в FOR командной строке, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , которая выполняет встроенную командную строку reg
в отдельном командном процессе, запущенном в фоновом режиме с %ComSpec% /c
, что обычно означает C:\Windows\System32\cmd.exe /c
.