文档目录是否有系统定义的环境变量?

时间:2010-08-16 12:06:05

标签: windows environment-variables

我知道Windows XP(以及Vista和Windows 7)上%USERPROFILE%系统定义的环境变量。是否有系统定义的环境变量指向“我的文档”目录的位置?在XP上默认为%USERPROFILE%\My Documents,在Win 7上为%USERPROFILE%\Documents。我只是想避免在Powershell脚本中测试操作系统版本,如果我可以避免它。

16 个答案:

答案 0 :(得分:30)

在我的默认安装XP系统上,没有环境变量。您可以在命令行中使用“set”命令(无参数)列出所有变量。所以你可能需要做一个测试。

如果您不想测试操作系统版本,只需检查“文档”是否存在,如果不存在,则尝试“我的文档”,反之亦然。然而,这并不完美,因为s / o可能在他的XP机器上有一个“Documents”文件夹。

顺便说一下:我的系统是德语,因此该文件夹名为“Dokumente”。您可能需要考虑到这一点。

该文件夹的路径存储在

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
Personal下的

。但是,您需要注册表访问。

来源:Microsoft

答案 1 :(得分:29)

对于powershell,以下工作:

[environment]::getfolderpath("mydocuments")

并避免魔术字符串

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

对于.NET,以下内容适用(即不适用于所有 Windows应用程序):

正如一个答案所指出的,没有环境变量指向我的文档但是.NET有Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)(C#)。

我正在添加这个答案,因为在搜索C#,环境变量和我的文档时出现了这个问题,而Justin的答案不包含 代码行:)

使用上面提到的代码行是在.NET中访问我的文档的首选方法:)

复制粘贴此行以获取C#用法:

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

请注意,C#需要MyDocuments中的大写字母D.

答案 2 :(得分:22)

没有内置环境变量,但在PowerShell中,您可以找到位置:

[Environment]::GetFolderPath("mydocuments")

您还可以使用以下方法创建环境变量:

$env:DOCUMENTS = [Environment]::GetFolderPath("mydocuments")

答案 3 :(得分:14)

(只是重申之前的答案)“我的文档”目录没有为开箱即用(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?如果有,可以测试一下,让我们知道它是否有效吗?)

答案 4 :(得分:7)

如果输入:

set

在命令提示符下,您将获得系统上定义的所有环境变量的列表。

查看我所定义的内容(Windows 7 Home Premium),它们似乎都没有指向我的文档。

供参考:

SHGetSpecialFolderPath函数可用于获取My Documents目录的路径。或者,Environment.GetFolderPath方法可以在.Net

下使用

答案 5 :(得分:5)

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

你可以看到没有这样的变量。

答案 6 :(得分:4)

除了基于registry.NETPowerShell的答案外,您还可以使用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

它在JScript中发出一个WSH脚本,并使用它来获取作为参数提供的特殊文件夹标记的一个或多个路径。假设您将上述脚本保存为名为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

答案 7 :(得分:3)

有些混淆可能是由于CSIDL / KNOWNFOLDERID值与命令shell环境变量的可用性有关。

答案 8 :(得分:2)

对于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. 仅使用一个空格字符进行delims
  2. %% a而不是%a
  3. 为避免看到该行,但要查看结果,请使用:

    @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.你的回答教会了我很多。我希望这有助于其他人。

答案 9 :(得分:2)

改进了@NickGrealy回答:

  1. reg query输出
  2. empty_line
    reg_key_path
    name  type  value
    
    1. 可以有任意数量的空间字符'注册表值中的单词之间,%a %b字符串在这种情况下不正确
    2. 因此,使用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"
      

答案 10 :(得分:1)

Windows中没有设计文档环境变量。你必须创建一个自定义的。通过here来做到这一点。定义一个名为MYDOCUMENTS的环境变量,以引用您需要引用的任何位置。此后,它应该是您通过%MYDOCUMENTS%引用的环境变量。

答案 11 :(得分:1)

在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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

更新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

答案 14 :(得分:0)

以下是运行Windows的所有用户的完整用户变量列表。

代码的reg查询部分将找到该值并将其设置为可以立即使用,并允许其他代码为所有用户永久设置它。 代码的广告注册表部分将为所有用户启用它。 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

答案 15 :(得分:-2)

实际上,%USERPROFILE%\My Documents应该适用于Windows 7.这就是我使用的。