在 .bat 脚本中查找用户文档文件夹

在 .bat 脚本中查找用户文档文件夹

从批处理脚本中查找 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 这样的隐式变量看起来有点奇怪,你可以看看这篇文章:

http://ss64.com/nt/for_f.html

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[用户名]。

相关内容