FOR /F "tokens=3 delims= " %%G IN
('REG QUERY
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders" /v "Personal"') DO (SET
docsdir=%%G)
where the character between delims= and the following " is a single tab. Make sure your editor emits a tab and not spaces.
EDIT:
On Windows 7 (and maybe all windows) you shouldn't specify delims= at all as it defaults to which is the whitespace used inbetween the tokens and not just a tab.
The best way to determine the location of My Documents is from the Windows Registry.
Several other answers and comments on this page have made reference to using "reg query". Below is the correct implementation that takes into account spaces in the path, as well as different versions of 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
)
Here is the one-liner for script writers:
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
This does not take into account localization or internationalization. This has not been tested on non-English versions of Windows. Comments on that topic are welcome.
This does work for Windows XP, Windows Vista, Windows 7, and Windows 8.
Note: Using the asterisk in the tokens= option is important for Windows XP, which usually contains spaces in the path for My Documents.
Note: If using implicit variables like %%B and %%C seems a little strange, you may have a look at this article:
tokens=3* will process the third token and the 4th + all subsequent
items, this can also be written as tokens=3,*
Each token specified will cause a corresponding parameter letter to be
allocated. The letters used for tokens are case sensitive.
If the last character in the tokens= string is an asterisk, then
additional parameters are allocated for all the remaining text on the
line.
The first variable is declared in the FOR statement and subsequent variables will be implicitly declared via the tokens= option.
The linked article gives the exact ordering of the variables that will be declared implicitly, but it is essentially alphabetic.
(With three tokens, by declaring %%A in the FOR statement, %%B and %%C will be declared implicitly. In the same way, by declaring %%X in the FOR statement, %%Y and %%Z will be declared implicitly.)
那将是系统知道的地方(尽管它是 XP 中的“我的文档”),但是您必须自己判断这对于您的环境是否是一个安全的假设。但是,如果您使用“我的文档”重定向,则该变量应设置为您重定向到的任何内容,默认设置为 XP 中的 c:\documents 和 settings[username] 或 Vista 中的 c:\users[username]。
:getuserdoc folder from registry
set idkey="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
call:fetchvalue errorlevelvariable %idkey% Personal
goto:eof
errorlevel is set if fail
:fetchvalue
set /a %1=0
REG query %2 /v %3
if ERRORLEVEL 1 (set /a %1=1&goto :eof)
FOR /F "tokens=3* skip=2 delims= " %%A IN ('REG QUERY %2 /v %3') DO SET %3="%%A"
goto:eof
Use Button GETSource as this wenpage cant display answer characters are removed!
For all who, like me, stumble upon this post while searching for a way to simply get the users documents folder, having next to zero experience about batch files, but want to use the great solution by Werkkrew or (probably?) the derived version by user55644, that's how I made it working on my windows 7 Pc:
echo off
setlocal enableextensions enabledelayedexpansion
FOR /F "tokens=3" %%G IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') DO (SET targetdir=%%G)
echo on
echo %targetdir%
所以我的最终版本是这样的:
where the character between delims= and the following " is a single tab. Make sure your editor emits a tab and not spaces.
EDIT: On Windows 7 (and maybe all windows) you shouldn't specify delims= at all as it defaults to which is the whitespace used inbetween the tokens and not just a tab.
可以在此处找到环境变量的完整参考,在microsoft 站点上,也可以在注册表项中找到它。
如果“我的文档”文件夹不在标准位置,则从注册表项中提取信息可能是最可靠的方法。
它只是英文窗口上的“我的文档”等。如果您使用的是另一种语言,则路径名是“翻译的”(Vista 除外)
The best way to determine the location of My Documents is from the Windows Registry.
Several other answers and comments on this page have made reference to using "reg query". Below is the correct implementation that takes into account spaces in the path, as well as different versions of Windows:
Here is the one-liner for script writers:
This does not take into account localization or internationalization. This has not been tested on non-English versions of Windows. Comments on that topic are welcome.
This does work for Windows XP, Windows Vista, Windows 7, and Windows 8.
Note: Using the asterisk in the tokens= option is important for Windows XP, which usually contains spaces in the path for My Documents.
Note: If using implicit variables like %%B and %%C seems a little strange, you may have a look at this article:
http://ss64.com/nt/for_f.html
The first variable is declared in the FOR statement and subsequent variables will be implicitly declared via the tokens= option.
The linked article gives the exact ordering of the variables that will be declared implicitly, but it is essentially alphabetic.
(With three tokens, by declaring %%A in the FOR statement, %%B and %%C will be declared implicitly. In the same way, by declaring %%X in the FOR statement, %%Y and %%Z will be declared implicitly.)
那将是系统知道的地方(尽管它是 XP 中的“我的文档”),但是您必须自己判断这对于您的环境是否是一个安全的假设。但是,如果您使用“我的文档”重定向,则该变量应设置为您重定向到的任何内容,默认设置为 XP 中的 c:\documents 和 settings[username] 或 Vista 中的 c:\users[username]。
对于 xp 来说不安全,这是我的文档并且可以本地化。
Windows XP 将其命名为“我的文档”,Vista 将其命名为“文档”。您可以输入一个脚本来确定您正在运行的操作系统。
在 Windows Vista 中,它是
但在 Windows XP 中,它是
这是两个不同操作系统之间的唯一区别。
并且不要忘记在 Windows Vista 中
Videos
,Music
和Photos
目录都在C:\Users\[%USERNAME]
Use Button GETSource as this wenpage cant display answer characters are removed!
For all who, like me, stumble upon this post while searching for a way to simply get the users documents folder, having next to zero experience about batch files, but want to use the great solution by Werkkrew or (probably?) the derived version by user55644, that's how I made it working on my windows 7 Pc: