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

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

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

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

顺便说一句:我的系统是德语,所以文件夹被称为“Dokumente”。 您可能需要考虑这一点。

该文件夹的path存储在

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

Personal下。 虽然你需要registry访问。

资料来源: 微软

对于下面的.NET适用(即不适用于所有的 Windows应用程序):

作为一个答案指出,没有指向我的文档的环境variables,但有.NET的Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) (C#)。

我添加这个答案,因为这个问题出现时,searchC#,环境variables和我的文件,贾斯廷的答案不包含代码行:)

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

复制粘贴这行为C#用法:

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

请注意,C#在MyDocuments中需要大写D.

将flindeberg的答案扩展到PowerShell成为:

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

(只是重申以前的答案)“我的文档”目录中没有提供开箱即用的(WinXP)环境variables。

但是,您可以使用以下命令设置variables:

在Windows 7 / 8.1上testing:

 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) 

或(一class)

 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%variables:

 C:\>echo mydocuments="%mydocuments%" mydocuments="C:\pathto\My Documents" 

(有没有人使用XP / Vista?如果是的话,可以testing这个,让我们知道它是否工作?)

如果你input:

 set 

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

看看我的(Windows 7家庭高级版)定义的那些,他们都没有指向我的文档。

供参考:

SHGetSpecialFolderPath函数可用于获取“我的文档”目录的path。 或者,可以在.Net下使用Environment.GetFolderPath方法

 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 

正如你所看到的,没有这样一个可以宽容的东西。

除了基于registry , .NET和PowerShell的答案之外,还可以使用WSH中的 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 

它在JScript中发出一个WSH脚本,并使用它获取一个或多个path作为参数提供的特殊文件夹标记。 假设您将上述脚本另存为名为specialf.cmd的文件,则获取当前用户文档目录path的用法为:

 specialf MyDocuments 

以下是testing所有特殊文件夹标记的另一个用法:

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

你可以用它来捕获到这样一个环境variables:

 for /f "delims=/" %p in ('specialf MyDocuments') do @set MYDOCS=%p 

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

  • 从Microsoft获得认可的CSIDL值
  • 来自Microsoft的KNOWNFOLDERID

对于Windows 7中的batch file(至less),Nick G的解决scheme需要稍微调整以设置用户定义的variablesUserDocuments:

 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% 

感谢Nick G.你的回答教会了我很多。 我希望这可以帮助别人。

在Windows中不存在通过devise文档环境variables。 你必须创build一个定制的。 去这里做这个。 定义一个名为MYDOCUMENTS的环境variables来引用你需要引用的位置。 此后,它应该是您通过%MYDOCUMENTS%引用的环境variables。

改进@NickGrealy答案:

  1. reg query输出
 empty_line
 reg_key_path
名称types值
  1. 在registry值中的单词之间可以有任意数量的“空格字符”,并且在这种情况下%a %bstring不正确

因此,使用skip=2选项跳过第一行,并使用tokens=2*选项将registry值传递给%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" 

但考虑到registry值[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" 

经过testing,在赢得XP,Vista,8,8.1和10的worrking!

 @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 

Windowsbatch file(.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 

更新Windowsbatch file(.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 

实际上, %USERPROFILE%\My Documents应该可以在Windows 7中工作。这就是我使用的。