Существует Ли Системная Переменная Среды Для Каталога Документов?



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

927   16  

16 ответов:

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

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

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

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

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

под Personal. Вам нужен доступ к реестру,.

источник: Microsoft

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

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

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

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

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

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

обратите внимание, что C# нуждается в заглавной D в MyDocuments.

расширение ответа флиндеберга на PowerShell становится:

PS> [Environment]::GetFolderPath("mydocuments")

(просто чтобы повторить предыдущие ответы) для каталога "Мои Документы" нет переменной среды, предоставленной из коробки (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? Если да, можете проверить это и сообщите нам, если это так работает?)

если ввести:

set

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

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

FYI:

на SHGetSpecialFolderPath функция может быть использована для получения пути к каталогу Мои Документы. В качестве альтернативы окружающая среда.GetFolderPath метод может используется в .Net

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

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

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

@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

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

для пакетного файла в 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)

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

  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%

спасибо Ник г. Ваш ответ научил меня многому. Я надеюсь, что это поможет кому-то еще.

улучшено @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"

не существует по дизайну переменной среды документов в windows. Вы должны создать индивидуальный. Этого здесь. Определить переменную окружения под названием Мои документы ссылаться в зависимости от местоположения необходимо ссылаться. После этого это будет переменная среды, на которую вы ссылаетесь %MYDOCUMENTS%.

тестирование и worrking в win 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

Пакетный Файл Windows (.bat) или командный скрипт Windows (.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

обновить пакетный файл Windows (.bat) или командный скрипт Windows (.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

вот полный список пользовательских переменных для всех пользователей, работающих с Windows.

часть запроса reg кода найдет это значение и установит его так, чтобы его можно было использовать немедленно и позволяет другим кодам устанавливать его постоянно для всех пользователей. Часть реестра ad кода позволит его для всех пользователей. Setx делает это так, что вам не нужно выходить из системы и снова входить в систему, чтобы иметь возможность использовать коды.

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

@ECHO OFF
ECHO REG ALL USER variables

ECHO all user desktop
for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"') do @set "ALLDT=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDT" /t  "REG_SZ"  /d "%ALLDT%" /f
 setx ALLDT "%ALLDT%"

 Echo all user's documents
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Documents"') do @set "ALLDOC=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDOC" /t  "REG_SZ"  /d "%ALLDOC%" /f
   setx ALLDOC "%ALLDOC%"

 echo all user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Programs"') do    @set "ALLSM=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSM" /t  "REG_SZ"  /d "%ALLSM%" /f 
 setx ALLSM "%ALLSM%"

  Echo all users startup
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Startup"') do @set "ALLSMSTU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSMSTU" /t  "REG_SZ"  /d "%ALLSMSTU%" /f 
   setx ALLSMSTU "%ALLSMSTU%"

  Echo all users music
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonMusic"') do @set "ALLMU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLMU" /t  "REG_SZ"  /d "%ALLMU%" /f 
   setx ALLMU "%ALLMU%"

  echo all users pictures
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonPictures"') do @set "ALLPIC=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLPIC" /t  "REG_SZ"  /d "%ALLPIC%" /f 
 setx ALLPIC "%ALLPIC%"

 Echo all users videos
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonVideo"') do @set "ALLVID=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLVID" /t  "REG_SZ"  /d "%ALLVID%" /f
 setx ALLVID "%ALLVID%"

 Echo set cerrent user variables 

 Echo current users desktop
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"') do @set "myDesktop=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myDesktop" /t  "REG_SZ"  /d "%myDesktop%" /f 
setx myDesktop "%myDesktop%"

 Echo current users documents
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "mydoc=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "mydoc" /t  "REG_SZ"  /d "%mydoc%" /f 
   setx mydoc "%mydoc%"

 Echo current user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Start Menu"') do @set "myStart=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStart" /t  "REG_SZ"  /d "%myStart%" /f 
   setx myStart "%myStart%"

  Echo current user startup
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Startup"') do @set "myStartup=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStartup" /t  "REG_SZ"  /d "%myStartup%" /f 
   setx myStartup "%myStartup%"

  Echo current users music
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Music"') do @set "myMU=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myMU" /t  "REG_SZ"  /d "%myMU%" /f 
   setx myMU "%myMU%"

 Echo current users pictures
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Pictures"') do @set "myPIC=%%d"
  REG ADD "HKEY_CURRENT_USER\Environment"  /v "myPIC" /t  "REG_SZ"  /d "%myPIC%" /f 
  setx myPIC "%myPIC%"

 Echo current users video
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Video"') do @set "myVID=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "myVID" /t  "REG_SZ"  /d    "%myVID%" /f
   setx myVID "%myVID%"

 exit

на самом деле %USERPROFILE%\My Documents должен работать в Windows 7. Это то, что я использую.

Comments

    Ничего не найдено.