Существует ли системная переменная среды для каталога документов? - PullRequest
57 голосов
/ 16 августа 2010

Я знаю о системной переменной среды %USERPROFILE%, определенной в Windows XP (и в Vista и Windows 7). Существует ли системная переменная среды, указывающая на расположение каталога «Мои документы»? В XP по умолчанию это %USERPROFILE%\My Documents, а в Win 7 - %USERPROFILE%\Documents. Я просто хотел избежать тестирования версии ОС в скрипте Powershell, если смогу избежать этого.

Ответы [ 16 ]

30 голосов
/ 16 августа 2010

В моей системе XP с установкой по умолчанию для этого нет переменной окружения.Вы можете перечислить все переменные с помощью команды «set» (без параметров) в командной строке.Поэтому, вероятно, вам придется выполнить тест.

Если вы не хотите тестировать версию ОС, вы можете просто проверить, существует ли «Документы», а если нет, то попробовать «Мои документы» или наоборот.Однако это не идеально, потому что у s / o может быть папка «Documents» на его компьютере с XP.

Кстати: моя система немецкая, поэтому папка называется «Dokumente».Возможно, вам придется принять это во внимание.

Путь к этой папке хранится в

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

в Personal.Вам необходим доступ к реестру.

Источник: Microsoft

29 голосов
/ 18 октября 2012

Для PowerShell следующие работы:

[environment]::getfolderpath("mydocuments")

и избегая волшебных струн

[Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments)

Для .NET справедливо следующее (т.е. не применимо в всех приложениях Windows):

Как указывает один из ответов, переменная среды, указывающая на Мои документы, отсутствует, но для .NET существует Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) (C #).

Я добавляю этот ответ, поскольку этот вопрос возникает при поиске в Google C #, переменных среды и моих документов, а ответ Джастина не содержит строку кода :)

Использование вышеупомянутой строки кода является предпочтительным способом доступа к моим документам в .NET:)

Скопируйте и вставьте эту строку для использования на C #:

var directoryNameOfMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Обратите внимание, что C # требует заглавной буквы D в MyDocuments.

22 голосов
/ 30 октября 2012

Нет встроенной переменной окружения, но в PowerShell вы можете найти местоположение с помощью:

[Environment]::GetFolderPath("mydocuments")

Вы также можете создать переменную среды с помощью:

$env:DOCUMENTS = [Environment]::GetFolderPath("mydocuments")
14 голосов
/ 02 сентября 2013

(просто для повторения предыдущих ответов). Нет встроенной переменной среды (WinXP) для каталога «Мои документы».

Однако вы можете установить переменную с помощьюследующая команда:

Протестировано в Windows 7 / 8.1:

for /f "tokens=3* delims= " %a ^
in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') ^
do (set mydocuments=%a %b)

или (один вкладыш)

for /f "tokens=3* delims= " %a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set mydocuments=%a %b)

Что даст вам переменную %mydocuments%:

C:\>echo mydocuments="%mydocuments%"

mydocuments="C:\pathto\My Documents"

(Кто-нибудь использует XP / Vista? Если да, можете проверить это и сообщить нам, работает ли он?)

7 голосов
/ 16 августа 2010

Если вы введете:

set

В командной строке вы получите список всех переменных среды, определенных в вашей системе.

Просмотр переменных, определенных в моей (Windows 7Home Premium) ни один из них не указывает на Мои документы.

К вашему сведению:

Функция SHGetSpecialFolderPath может использоваться для получения пути к каталогу «Мои документы».В качестве альтернативы метод Environment.GetFolderPath может использоваться в .Net

5 голосов
/ 16 августа 2010
C:\Documents and Settings\mrabinovitch>set | grep -i document
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\myuser\Application Data
HOMEPATH=\Documents and Settings\myuser
USERPROFILE=C:\Documents and Settings\myuser

, как вы можете видеть, такого нет.

4 голосов
/ 09 июня 2015

В дополнение к ответам, основанным на реестре , .NET и PowerShell , вы также можете использовать WshSpecialFolders из WSH . Вот автономный командный / пакетный скрипт, демонстрирующий, как:

@echo off
call :script > "%temp%\%~n0.js" && cscript //nologo "%temp%\%~n0.js" %*
goto :EOF

:script
echo var specialFolders = WScript.CreateObject('WScript.Shell').SpecialFolders;
echo if (WScript.Arguments.length === 0) {
echo     for (var e = new Enumerator(specialFolders); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(e.item());
echo     }
echo } else {
echo     for (var e = new Enumerator(WScript.Arguments); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(specialFolders(e.item()));
echo     }
echo }
goto :EOF

Он генерирует сценарий WSH на JScript и использует его для получения одного или нескольких путей для специальных токенов папок, предоставляемых в качестве аргументов. Предполагая, что вы сохраните вышеупомянутый скрипт как файл с именем specialf.cmd, использование для получения пути к каталогу документов текущего пользователя будет:

specialf MyDocuments

Вот еще один пример использования всех специальных токенов папок:

specialf ^
  AllUsersDesktop ^
  AllUsersStartMenu ^
  AllUsersPrograms ^
  AllUsersStartup ^
  Desktop ^
  Favorites ^
  Fonts ^
  MyDocuments ^
  NetHood ^
  PrintHood ^
  Programs ^
  Recent ^
  SendTo ^
  StartMenu ^
  Startup ^
  Templates

Вы можете использовать это для записи в переменную окружения следующим образом:

for /f "delims=/" %p in ('specialf MyDocuments') do @set MYDOCS=%p
3 голосов
/ 04 октября 2012

Некоторая путаница может быть вызвана доступностью значений CSIDL / KNOWNFOLDERID в сравнении с переменными среды командной оболочки.

2 голосов
/ 14 февраля 2016

Улучшен ответ @NickGrealy:

  1. reg query выходы
empty_line
reg_key_path
name  type  value
  1. может быть произвольное количество «пробелов» между словами в значении реестра, и строка %a %b в этом случае неверна

Итак, используя опцию skip=2 для пропуска первых строк и опцию tokens=2* для передачи значения реестра в %b var:

for /f "skip=2 tokens=2*" %A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "UserDocs=%B"

или для файлов сценариев:

for /f "skip=2 tokens=2*" %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do set "UserDocs=%%B"

Но с учетом значения реестра [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\!Do not use this registry key]

На основании ответа @AtifAziz:

for /f "tokens=*" %A in ('echo WScript.Echo^(^(new ActiveXObject^("WScript.Shell"^)^).SpecialFolders^("MyDocuments"^)^)^>%TEMP%\getdoc.js ^& cscript /nologo %TEMP%\getdoc.js ^& del /q %TEMP%\getdoc.js') do @set "UserDocs=%A"
2 голосов
/ 26 января 2015

Для пакетного файла в Windows 7 (по крайней мере) решение Ника Джи нуждается в небольшой настройке для установки пользовательской переменной UserDocuments:

FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set UserDocuments=%%a)

Обратите внимание, единственные различия:

  1. Используйте только один пробел для разделителей
  2. %% a вместо% a

Чтобы не видеть линию, но чтобы увидеть результаты, используйте:

@FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @(Set UserDocuments=%%a)
@Echo ~~~~~~~~ UserDocuments=%UserDocuments%

Спасибо, Ник Г. Твой ответ многому меня научил. Я надеюсь, что это помогает кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...