Prompt de comando do Windows - Obter pasta Documentos do usuário realocado

8

Estou tentando escrever um script em lote simples que copia alguns arquivos do %userprofile%\Documentsdiretório. Estou testando o script na minha máquina, mas após algumas falhas, percebi que movi os dados do meu usuário para uma partição separada . Portanto, %userprofile%\Documentsestá vazio e (obviamente) nada é copiado.

Eu já tentei outras variáveis ​​de ambiente como %homedrive%e %homepath%, mas elas ainda apontam para o padrãoC:\...

Existe uma maneira de descobrir a unidade real usada para os dados do usuário?

Estou usando o Windows 10.

Obrigado!

EDITAR

Como apontado por Ƭᴇcʜιᴇ007, não movi os dados do usuário para outra partição, mas apenas mudei as pastas "principais" (Documentos, Vídeos, ...) para algumas pastas correspondentes em outra partição: clique com o botão direito do mouse em (por exemplo, ) Documentos, Propriedades, Caminho.

Como posso descobrir o caminho de uma pasta de documentos que foi realocada dessa maneira?

Alessandro
fonte
2
% userprofile% deve ter a pasta correta, independentemente de onde você a colocou, desde que você tenha realocado as pastas de perfil corretamente, ela deve ser precisa. Então, como exatamente você o moveu para a outra partição?
Ƭᴇcʜιᴇ007
Ok, sinceramente não me lembro, então pesquisei um pouco e finalmente descobri o que fiz. Cliquei com o botão direito do mouse nas pastas "principais" (Documentos, Vídeos, etc.), selecione Propriedades, selecione a guia Caminho e alterei o caminho. (Estou usando a versão em italiano do Windows e, como mal traduzo os nomes que vejo na tela, algumas palavras podem ser diferentes). Então, você estava certo,% userprofile% não está fazendo nada errado. Mas a questão ainda é: como posso encontrar o caminho real da pasta "principal" de documentos?
Alessandro
Então eu acho que você está confundindo sua "biblioteca" do Documents com a pasta Documents no caminho do seu perfil de usuário. Duas coisas diferentes ...
Ƭᴇcʜιᴇ007
Existe uma maneira de descobrir o caminho da pasta Documentos, considerando que ela foi realocada dessa maneira?
Alessandro

Respostas:

5

Infelizmente, não há uma variável de ambiente simples que você possa verificar em um script em lote se você a redirecionou do caminho padrão relativo ao seu perfil. Você pode ver a lista completa de variáveis ​​de ambiente (incluindo algumas não documentadas) aqui:

http://ss64.com/nt/syntax-variables.html

Outro aspecto a ter em mente é que o redirecionamento de pasta permite até movê-los para um compartilhamento de rede. Não precisa haver uma "unidade", você pode usar tudo; pode ser apenas um caminho UNC.

A boa notícia é que as informações que você deseja estão disponíveis no registro no seguinte local:

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Pastas do Shell do Usuário \ Pessoal

Você pode mover um conjunto inteiro de pastas nessa User Shell Folderschave, mas ler a pasta Meus Documentos aqui usando o Windows Batch é assim:

reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal

Na minha máquina, isso produz a seguinte saída, que pode ser mais ou menos útil para você, dependendo do que você precisa e da qualidade dos scripts do Windows Batch:

Pastas do shell HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Usuário
    REG_EXPAND_SZ pessoal C: \ Users \ joel \ Documents

Você também pode tentar o vbscript:

Set wshshell = CreateObject("WScript.Shell")
Documents = wshShell.SpecialFolders("MyDocuments")

ou PowerShell:

[Environment]::GetFolderPath('MyDocuments')

Isso também pode estar disponível via bash no Windows (realmente!), Mas ainda não vi como fazê-lo de uma maneira que seja consistentemente precisa.

Joel Coehoorn
fonte
3

Supondo que você tenha acesso de gravação à pasta atual ou a um local conhecido no computador ... você pode usar o PowerShell!

A Environment.GetFolderPathfunção pode obter o caminho do sistema de arquivos de locais conhecidos , incluindo a pasta Documentos. Este comando do PowerShell imprime o caminho de documentos:

[Environment]::GetFolderPath('MyDocuments')

Pode ser gravado em um arquivo com o Out-Filecmdlet. O operador de redirecionamento >realmente não funciona aqui porque produz um arquivo de texto Unicode com uma lista técnica, difícil de trabalhar no processador em lote.

[Environment]::GetFolderPath('MyDocuments') | Out-File 'docspath.tmp' -Encoding ascii

Esse arquivo pode ser lido em uma variável de lote com set /p. Juntando tudo, obtemos este fragmento de script em lote:

powershell -Command "[Environment]::GetFolderPath('MyDocuments') | Out-File 'docspath.tmp' -Encoding ascii"
set /p DOCSPATH=< docspath.tmp
del docspath.tmp

O caminho para a pasta Documentos do usuário agora pode ser expresso como %DOCSPATH%.

Ben N
fonte
1

Eu tenho a resposta confiável. Combinação de PowerShell que retorna a resposta dos

for /f "delims=" %%a in ('powershell.exe -command "& {write-host $([Environment]::GetFolderPath('MyDocuments'))}"') do Set "$Value=%%a"
Echo Value received from Powershell : %$Value%
dcshoecomp
fonte
Eu não sabia que você pode usar um $em um nome de variável CMD. Mas você sabe que é um uso incomum, certo?
Scott
0

Bem, é bem simples :)

O local da pasta da área de trabalho está listado aqui:

Pastas \ HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell

ou ainda mais simples no PowerShell

$ DesktopPath = [Ambiente] :: GetFolderPath ("Desktop")

integratorIT
fonte