A melhor maneira de determinar a localização dos Meus Documentos é no Registro do Windows.
Várias outras respostas e comentários nesta página fizeram referência ao uso de "reg query". Abaixo está a implementação correta que leva em conta os espaços no caminho, bem como diferentes versões do 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
)
Aqui está o one-liner para escritores de script:
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
Este não leva em conta a localização ou a internacionalização. Isso não foi testado em versões não inglesas do Windows. Comentários sobre esse tópico são bem-vindos.
Este funciona para o Windows XP, o Windows Vista, o Windows 7 e o Windows 8.
Observação: O uso do asterisco na opção tokens = é importante para o Windows XP, que geralmente contém espaços no caminho para Meus documentos.
Nota: Se usar variáveis implícitas como %% B e %% C parecer um pouco estranho, você pode dar uma olhada neste artigo:
link
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.
A primeira variável é declarada na instrução FOR e as variáveis subseqüentes serão implicitamente declaradas através da opção tokens =.
O artigo vinculado fornece a ordem exata das variáveis que serão declaradas implicitamente, mas é essencialmente alfabético.
(Com três tokens, declarando %% A na instrução FOR, %% B e %% C serão declarados implicitamente. Da mesma forma, declarando %% X na instrução FOR, %% Y e %% Z serão declarados implicitamente.