从批处理脚本中查找 XP 和 Vista 上的用户文档文件夹的最佳方法是什么?可以安全地假设它是 %USERPROFILE%\Documents 吗?
答案1
所以我的最终版本是这样的:
FOR /F“tokens=3 delims=”%%G IN('REG QUERY“HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders”/v“Personal”')DO(SET docsdir=%%G)
其中 delims= 和后面的 " 之间的字符是单个制表符。请确保您的编辑器发出制表符而不是空格。
编辑:在 Windows 7(也许是所有 Windows)上,您根本不应该指定 delims=,因为它默认为标记之间使用的空格,而不仅仅是制表符。
答案2
完整的环境变量参考可以在这里找到,微软网站,它也可以在注册表项中找到。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
String value: Personal
如果“我的文档”文件夹不在标准位置,则从注册表项中提取信息可能是最可靠的方法。
答案3
确定“我的文档”位置的最佳方法是通过 Windows 注册表。
本页上的其他几个答案和评论都提到了使用“reg query”。以下是考虑路径中的空格以及不同版本的 Windows 的正确实现:
for /f "tokens=1,2*" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do (
set RNAME=%%A
set RTYPE=%%B
set RDATA=%%C
)
以下是给脚本编写者的一句话:
for /f "tokens=1,2*" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do set MY_DOCS_ROOT=%%C
这才不是考虑本地化或国际化。这尚未在非英语版本的 Windows 上进行测试。欢迎就该主题发表评论。
这做适用于 Windows XP、Windows Vista、Windows 7 和 Windows 8。
笔记:对于 Windows XP 来说,在 tokens= 选项中使用星号非常重要,因为它的“我的文档”路径中通常包含空格。
笔记:如果使用像 %%B 和 %%C 这样的隐式变量看起来有点奇怪,你可以看看这篇文章:
tokens=3* 将处理第三个 token 和第四个 + 所有后续项目,也可以写为 tokens=3,*
每个指定的 token 都会分配一个对应的参数字母。token 使用的字母区分大小写。
如果 tokens= 字符串中的最后一个字符是星号,则会为该行上所有剩余的文本分配附加参数。
第一个变量在 FOR 语句中声明,后续变量将通过 tokens= 选项隐式声明。
链接的文章给出了隐式声明的变量的确切顺序,但它本质上是按字母顺序排列的。
(使用三个标记,通过在 FOR 语句中声明 %%A,将隐式声明 %%B 和 %%C。同样,通过在 FOR 语句中声明 %%X,将隐式声明 %%Y 和 %%Z。)
答案4
这将是系统知道的位置(尽管在 XP 中它是“我的文档”),但是您必须自己判断这对您的环境是否是一个安全的假设。但是,如果您使用“我的文档”重定向,则应将该变量设置为您重定向到的任何位置,默认设置为 XP 中的 c:\documents and settings[用户名] 或 Vista 中的 c:\users[用户名]。