Как лучше всего найти папку с документами пользователя в XP и Vista с помощью пакетного сценария? Можно ли предположить, что это% USERPROFILE% \ Documents?
итак, моя окончательная версия выглядит так:
FOR / F "tokens = 3 delims =" %% G IN ('REG QUERY "HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders" / v "Personal"') DO (SET docsdir = %% G)
где символ между delims = и следующим "- это одна табуляция. Убедитесь, что ваш редактор использует табуляцию, а не пробелы.
РЕДАКТИРОВАТЬ: в Windows 7 (и, возможно, во всех окнах) вы вообще не должны указывать delims =, поскольку по умолчанию используется пробел между токенами, а не только вкладка.
Полный справочник переменных среды можно найти здесь, на сайт Microsoft, его также можно найти в разделе реестра.
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
String value: Personal
Если папка «Мои документы» находится не в стандартном месте, извлечение информации из раздела реестра, вероятно, является наиболее надежным способом.
В английских окнах только "Мои документы" и т. Д. Если вы используете другой язык, путь будет «переведен» (кроме Vista)
Лучший способ определить местонахождение «Мои документы» - из реестра Windows.
В нескольких других ответах и комментариях на этой странице упоминается использование «reg query». Ниже представлена правильная реализация, учитывающая пробелы в пути, а также различные версии Windows:
for /f "tokens=1,2*" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do (
set RNAME=%%A
set RTYPE=%%B
set RDATA=%%C
)
Вот краткое описание для сценаристов:
for /f "tokens=1,2*" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do set MY_DOCS_ROOT=%%C
это не учитывать локализацию или интернационализацию. Это не было проверено на неанглоязычных версиях Windows. Комментарии по этой теме приветствуются.
это делает работают с Windows XP, Windows Vista, Windows 7 и Windows 8.
Примечание: Использование звездочки в параметре tokens = важно для Windows XP, которая обычно содержит пробелы в пути к Моим документам.
Примечание: Если использование неявных переменных, таких как %% B и %% C, кажется немного странным, вы можете взглянуть на эту статью:
tokens = 3 * будет обрабатывать третий токен и 4-й + все последующие элементы, это также можно записать как tokens = 3, *
Для каждого указанного токена будет назначена соответствующая буква параметра. Буквы, используемые для токенов, чувствительны к регистру.
Если последним символом в строке tokens = является звездочка, то для всего оставшегося текста в строке назначаются дополнительные параметры.
Первая переменная объявляется в операторе FOR, а последующие переменные будут неявно объявлены через параметр tokens =.
Связанная статья дает точный порядок переменных, которые будут объявлены неявно, но по существу алфавитный.
(С тремя токенами при объявлении %% A в операторе FOR %% B и %% C будут объявлены неявно. Таким же образом, объявив %% X в операторе FOR, %% Y и %% Z будут объявляться неявно.)
Это будет то место, о котором система знает (хотя это Мои документы в XP), однако вам придется судить сами, является ли это безопасным предположением для вашей среды. Если вы используете перенаправление «Мои документы», эта переменная должна быть установлена на то, на что вы перенаправляете, со значением по умолчанию c: \ documents and settings [имя пользователя] в XP или c: \ users [имя пользователя] в Vista.
небезопасно для xp, вот это мои документы и его можно локализовать.
Windows XP называет его «Мои документы», а Vista называет его «Документы». Вы можете добавить сценарий, чтобы определить, какую ОС вы используете.
@echo off
IF EXIST "%USERPROFILE%\My Documents" (
echo Windows XP
) ELSE (
echo Vista
)
:getuserdoc folder from registry
set idkey="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
call:fetchvalue errorlevelvariable %idkey% Personal
goto:eof
errorlevel is set if fail
:fetchvalue
set /a %1=0
REG query %2 /v %3
if ERRORLEVEL 1 (set /a %1=1&goto :eof)
FOR /F "tokens=3* skip=2 delims= " %%A IN ('REG QUERY %2 /v %3') DO SET %3="%%A"
goto:eof
Используйте кнопку GETSource, так как эта веб-страница не может отображать символы ответа, удалены!
Для всех, кто, как и я, наткнулся на этот пост в поисках способа просто получить папку с документами пользователей, практически не имея опыта работы с пакетными файлами, но желающих использовать отличное решение от Werkkrew или (возможно?) Производную версию от user55644, вот как я заставил его работать на моем компьютере с Windows 7:
echo off
setlocal enableextensions enabledelayedexpansion
FOR /F "tokens=3" %%G IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') DO (SET targetdir=%%G)
echo on
echo %targetdir%
В Windows Vista это
%USERPROFILE%\Documents
но в Windows XP это
%USERPROFILE%\My Documents
Это единственное различие между двумя разными операционными системами.
И не забывайте, что в Windows Vista Videos
, Music
, и Photos
каталоги все под C:\Users\[%USERNAME]