Я знаю о системной переменной %USERPROFILE%
, установленной в Windows XP (и Vista и Windows 7). Существует ли системная переменная среды, указывающая на расположение каталога "Мои документы"? В XP по умолчанию он %USERPROFILE%\My Documents
, а на Win 7 он %USERPROFILE%\Documents
. Я просто хотел избежать тестирования версии ОС в Powershell script, если я могу избежать этого.
Существует ли переменная среды, определяемая системой для каталога документов?
Ответ 1
В моей системе XP, установленной по умолчанию, для этого нет переменной окружения. Вы можете перечислить все переменные с помощью команды "set" (без параметров) в командной строке. Поэтому, вероятно, вам нужно пройти тест.
Если вы не хотите тестировать версию ОС, вы можете просто проверить, существует ли "Документы", а если нет, попробуйте "Мои документы" или наоборот. Однако это не идеально, потому что s/o может иметь папку "Документы" на своей машине XP.
Btw: моя система немецкая, поэтому папка называется "Документ". Возможно, вам придется принять это во внимание.
Путь к этой папке сохраняется в
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
под Personal
. Однако вам нужен доступ к реестру.
Источник: Microsoft
Ответ 2
Для .NET выполняется следующее: (не применимо в приложениях все):
Как указывает один из ответов, нет переменной среды, указывающей на Мои документы, но для .NET существует Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
(С#).
Я добавляю этот ответ, так как этот вопрос возникает, когда googling для С#, переменных среды и моих документов и ответа Justin не содержит строки :)
Использование вышеуказанной строки кода является предпочтительным способом доступа к моим документам в .NET:)
Скопируйте эту строку для использования С#:
var directoryNameOfMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Обратите внимание, что С# нуждается в капитале D в MyDocuments.
Ответ 3
Расширение ответа flindeberg на PowerShell становится:
PS> [Environment]::GetFolderPath("mydocuments")
Ответ 4
(Просто повторить предыдущие ответы) В каталоге "Мои документы" отсутствует переменная среды, предоставленная вне коробки (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? Если да, можете проверить это и сообщить нам, если он работает?)
Ответ 5
Если вы наберете:
set
В командной строке вы получите список всех переменных среды, определенных в вашей системе.
Глядя на те, что определены на моем (Windows 7 Home Premium), ни один из них не указывает на Мои документы.
FYI:
Функция SHGetSpecialFolderPath может использоваться для получения пути к папке "Мои документы". В качестве альтернативы метод Environment.GetFolderPath можно использовать в .Net
Ответ 6
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
поскольку вы можете видеть, что такой недоступный нет.
Ответ 7
В дополнение к ответам на основе реестра, .NET и PowerShell, вы также можете использовать WshSpecialFolders
из WSH. Здесь автономная команда/пакет script демонстрирует, как:
@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 script в JScript и использует его для получения одного или нескольких путей для специальных токенов в качестве аргументов. Предполагая, что вы сохранили предыдущий script как файл с именем 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
Ответ 8
Некоторая путаница может быть связана с наличием значений CSIDL/KNOWNFOLDERID и переменных среды командной оболочки.
Ответ 9
Для пакетного файла в Windows 7 (по крайней мере) решение Nick G нуждается в небольшой настройке, чтобы установить пользовательскую переменную 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)
Обратите внимание, что существуют только различия,
- Используйте только один пробел для разделителей
- %% 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%
Спасибо Nick G. Ваш ответ научил меня многому. Надеюсь, это поможет кому-то другому.
Ответ 10
В дизайне не существует дизайн переменной среды документов в окнах. Вы должны создать индивидуальный. Сделайте это, перейдя здесь. Определите переменную среды, называемую MYDOCUMENTS, для ссылки на любое местоположение, на которое вам нужно ссылаться. Впоследствии это переменная среды, на которую ссылается% MYDOCUMENTS%.
Ответ 11
Улучшен ответ @NickGrealy:
-
reg query
выходы
empty_line reg_key_path name type value
- между словами в значении реестра может быть произвольное количество "пробельных символов", а строка
%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"
или для script файлов:
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"
Ответ 12
Протестировано и беспокоиться в победе XP, Vista, 8, 8.1 и 10!
@echo off
for /f "skip=2 tokens=2*" %%c in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "docs=%%d" && echo WIN XP - 10
xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT
Ответ 13
Пакетный файл Windows (.bat) или команда Windows Script (.cmd)
@echo off
ver | find "XP" > nul
if %ERRORLEVEL% == 0 set Docs=%UserProfile%\My Documents & echo WIN XP
if %ERRORLEVEL% == 1 set Docs=%UserProfile%\Documents & echo WIN vista - 10
xcopy "C:\test.txt" "%Docs%" /f /y
pause
EXIT
Ответ 14
обновить пакетный файл Windows (.bat) или команду Windows Script (.cmd)
@echo off
ver | find "XP" > nul
if %ERRORLEVEL% == 0 SET DOCS=%USERPROFILE%\My Documents & echo WIN XP
if %ERRORLEVEL% == 1 FOR /f "tokens=3" %%x IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set docs=%%x) & echo WIN vista - 10
xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT
Ответ 15
Собственно, %USERPROFILE%\My Documents
должен работать в Windows 7. Это то, что я использую.