是否有文档目录的系统定义的环境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)
注意唯一的区别是,
- 只能使用一个空格字符作为分隔符
- %% 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答案:
-
reg query
输出
empty_line reg_key_path 名称types值
- 在registry值中的单词之间可以有任意数量的“空格字符”,并且在这种情况下
%a %b
string不正确
因此,使用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中工作。这就是我使用的。