Существует Ли Системная Переменная Среды Для Каталога Документов?
Я знаю, о %USERPROFILE% системная переменная среды в Windows XP (а также Vista и Windows 7). Существует ли системная переменная среды, указывающая на расположение каталога "Мои Документы"? На XP по умолчанию это %USERPROFILE%My Documents и на Win 7 это %USERPROFILE%Documents. Я просто хотел избежать необходимости тестировать версию ОС в сценарии Powershell, если я могу этого избежать.
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)обратите внимание, что единственные различия,
- используйте только один символ пробела для разделителей
- %%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 ответ:
reg queryвыходыempty_line reg_key_path name type value
- между словами в значении реестра может быть произвольное количество "пробелов" и
%a %bстрока не является правильным в этом случаеИтак, используя
skip=2возможность пропустить первые строки иtokens=2*возможность передать значение реестра в%bvar: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
Comments