Windows命令提示符-获取重定位的用户的Documents文件夹


8

我正在尝试编写一个简单的批处理脚本,该脚本从%userprofile%\Documents目录中复制一些文件。我正在我的机器上测试脚本,但是经过几次失败后,我意识到我将用户的数据移到了单独的分区。因此,%userprofile%\Documentsempty,并且(显然)没有任何内容被复制。

我已经尝试了其他环境变量,例如%homedrive%%homepath%,但是它们仍然指向标准C:\...

有没有办法找出用于用户数据的实际驱动器?

我正在使用Windows 10。

谢谢!

编辑

正如Ƭᴇcʜιᴇ007所指出的那样,我没有将用户的数据移动到另一个分区,但是我只是将“主”文件夹(文档,视频等)重新定位到另一个分区上的某些对应文件夹:右键单击(例如)文档,属性,路径。

如何找到以这种方式重定位的Document文件夹的路径?


2
不管您放置在哪里,%userprofile%都应具有正确的文件夹,只要正确地重新放置了配置文件文件夹,它应该是正确的。那么,您究竟如何将其移动到另一个分区?
Ƭᴇcʜιᴇ007

好吧,老实说我不记得了,所以我浏览了一下,终于找到了我所做的。我右键单击“主”文件夹(“文档”,“视频”等),选择“属性”,选择“路径”选项卡并更改路径。(我使用的是意大利语版本的Windows,并且由于我几乎不翻译在屏幕上看到的名称,因此某些单词可能有所不同)。所以您说对了,%userprofile%确实没有做错任何事情。但是问题仍然是:如何找到“主” Documents文件夹的实际路径?
亚历山德罗(Alessandro)

然后,我认为您是在将您的文档“库”与用户个人资料路径中的“文档”文件夹相混淆。两个不同的东西......
Ƭᴇcʜιᴇ007

考虑到它已经以这种方式重新定位,是否可以找到文档文件夹的路径?
亚历山德罗(Alessandro)

Answers:


5

不幸的是,如果您已从相对于配置文件的默认路径中重定向了此变量,则无法从批处理脚本中检查该变量。您可以在此处查看环境变量的完整列表(包括一些未记录的信息):

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

要记住的另一件事是,文件夹重定向甚至允许您将它们移至网络共享。不必有一个可以全部使用的“驱动器”。它可能只是UNC路径。

好消息是您想要的信息可在以下位置的注册表中找到:

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell文件夹\个人

您可以在该User Shell Folders键中移动一整套文件夹,但是使用Windows Batch在此处读取“我的文档”文件夹看起来像这样:

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

在我的机器上,这将产生以下输出,根据您的需求以及您对Windows Batch脚本的满意程度,这些输出可能或多或少对您有用:

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ User Shell文件夹
    个人REG_EXPAND_SZ C:\ Users \ joel \ Documents

您也可以尝试vbscript:

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

或Powershell:

[Environment]::GetFolderPath('MyDocuments')

这也许最终也可以通过Windows上的bash来使用(真的!),但是我还没有看到如何以始终如一的精确度来做到这一点。


3

假设您具有对当前文件夹或计算机上某些已知现有位置的写访问权,则可以使用PowerShell!

Environment.GetFolderPath函数可以获取众所周知位置(包括“文档”文件夹)的文件系统路径。此PowerShell命令将显示“文档”路径:

[Environment]::GetFolderPath('MyDocuments')

可以使用Out-Filecmdlet 将其写入文件。重定向运算符>在这里实际上并不起作用,因为它会生成带有BOM的Unicode文本文件,这在批处理程序中很难使用。

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

可以使用将该文件读取到批处理变量中set /p。放在一起,我们得到以下批处理脚本片段:

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

用户的Documents文件夹的路径现在可以表示为%DOCSPATH%


1

我有可靠的答案。Powershell的组合返回dos的答案

for /f "delims=" %%a in ('powershell.exe -command "& {write-host $([Environment]::GetFolderPath('MyDocuments'))}"') do Set "$Value=%%a"
Echo Value received from Powershell : %$Value%

我不知道您可以$在CMD变量名中使用。但是您知道这是一种不常见的用法,对吗?
斯科特,

0

好吧,这很简单:)

此处列出了桌面文件夹的位置:

\ HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell文件夹

甚至在PowerShell中更简单

$ DesktopPath = [Environment] :: GetFolderPath(“ Desktop”)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.