поиск папки документов пользователя в .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 (и, возможно, на всех версиях Windows) вам не следует указывать delims= вообще, так как по умолчанию используется пробел, который используется между токенами, а не только табуляция.

Полная справка по переменным окружения доступна здесь, на сайте microsoft, она также может быть найдена в ключе реестра.

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
Строковое значение: Personal

Если папка Мои Документы не находится в стандартном месте, получение информации из ключа реестра, вероятно, является самым надежным способом.

Лучший способ определить местоположение Мои документы — это обратиться к реестру 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 будут объявлены неявно.)

Это только “Мои Документы” и т. д. на английских версиях Windows. Если вы используете другой язык, путь будет “переведен” (за исключением Vista).

Это будет место, о котором знает система (хотя это Мои Документы в 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
)

:получить папку пользователя из реестра
set idkey="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
call:fetchvalue errorlevelvariable %idkey% Personal
goto:eof
errorlevel устанавливается, если ошибка
: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]

Ответ или решение

Как найти папку «Документы» пользователя с помощью сценария .bat в Windows XP и Vista

При разработке сценариев на языке .bat для автоматизации задач в операционных системах Windows XP и Vista часто возникает необходимость получить доступ к папке «Документы» пользователя. В этой статье мы рассмотрим наиболее эффективные способы достижения этой цели, а также уделим внимание нюансам, связанным с различиями и локализацией в разных версиях Windows.

Понимание структуры папок

В Windows XP и Vista папка «Документы» имеет разные названия. В XP это «Мои документы» (My Documents), в то время как в Vista это просто «Документы» (Documents). Это важное различие следует учитывать при написании сценария, чтобы гарантировать кросс-совместимость с различными версиями Windows.

Для получения пути к папке «Документы» рекомендуется использовать реестр Windows, поскольку это наиболее надежный метод, который учитывает возможные изменения местоположения папки пользователем.

Получение пути через реестр

Чтобы получить доступ к информации о папке «Документы» из реестра, мы можем использовать команду reg query. Вот пример скрипта, который находит соответствующую папку и динамически устанавливает переменную окружения для использования в дальнейшем:

@echo off
setlocal enableextensions enabledelayedexpansion

REM Получение пути к папке Документы из реестра
FOR /F "tokens=3*" %%G IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') DO (
    SET "targetdir=%%G"
)

REM Вывод результата
echo Папка Документы расположена по следующему пути: %targetdir%

Объяснение скрипта

  1. @echo off — отключает вывод команд на экран для повышения читаемости.
  2. setlocal enableextensions enabledelayedexpansion — включает расширенные возможности скриптов, что позволяет работать с переменными, изменяющимися во время выполнения.
  3. FOR /F — используется для выполнения команды и обработки её результатов. Здесь мы выполняем команду reg query, которая возвращает значение ключа реестра, относящегося к папке «Документы».
  4. *`tokens=3`** — указывает, что мы хотим получить третий токен (в данном случае путь к папке), а также все остальные токены после него (для обработки возможных пробелов в пути).
  5. SET "targetdir=%%G" — сохраняет полученный путь в переменной targetdir.
  6. В завершении — выводим путь к папке с помощью команды echo.

Локализация и учёт версий ОС

Как было упомянуто ранее, важно учитывать, что на локализованных версиях Windows названия папок могут отличаться. Например, в русскоязычной версии Windows XP папка может называться «Мои документы». Чтобы обеспечить работоспособность сценария на разных языках и версиях ОС, можно дополнительно проверить существование определенных папок:

IF EXIST "%USERPROFILE%\Documents" (
    SET "docsdir=%USERPROFILE%\Documents"
) ELSE (
    IF EXIST "%USERPROFILE%\My Documents" (
        SET "docsdir=%USERPROFILE%\My Documents"
    )
)

echo Папка Документы: %docsdir%

Заключение

Использование реестра Windows для нахождения пути к папке «Документы» — это надежный способ, который позволяет учесть версионные и локализационные различия. Убедитесь, что ваш скрипт корректно работает в различных средах, и протестируйте его на всех версиях Windows, с которыми вы работаете. Следуя представленным рекомендациям, вы сможете создать универсальный и эффективный .bat-скрипт для вашей организации.

Оцените материал
Добавить комментарий

Капча загружается...