Назад | Перейти на главную страницу

поиск папки с документами пользователя в .bat скрипте

Как лучше всего найти папку с документами пользователя в 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, кажется немного странным, вы можете взглянуть на эту статью:

http://ss64.com/nt/for_f.html

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]