我知道我可以使用%userprofile%\Documents
,但这仅在 Documents 文件夹仍在默认位置时才有效。我正在寻找即使用户更改了位置(即从 Documents Properties 中的 Location 选项卡)也能正常工作的方法。
答案1
为什么不读取直接在 Windows 注册表中注册的这些信息呢:
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
@echo off && setlocal enabledelayedexpansion
set "_Key_HKCU_Path=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
set "_Folders_Refer={374DE290-123F-4565-9164-39C4925E467B},Documments,Desktop,Favorites,My Music,My Pictures,My Video,Personal,Programs,Start Menu,Startup"
(for %%i in ("!_Folders_Refer:,=","!")do call :^) %%~i) && endlocal && goto :EOF
:^)
for /f tokens^=3* %%i in ('%__APPDIR__%reg.exe query "!_Key_HKCU_Path!"^|find/i "%~1"
')do <con: set "_user_path=%%i%%j" && cmd /v/c "echo\!_user_path:REG_EXPAND_SZ=! && exit /b"
- 输出结果:
C:\Users\ecker\Downloads
C:\Users\ecker\Desktop
C:\Users\ecker\Favorites
C:\Users\ecker\Music
C:\Users\ecker\Pictures
C:\Users\ecker\Videos
C:\Users\ecker\Music
C:\Users\ecker\Pictures
C:\Users\ecker\Videos
C:\Users\ecker\Music
C:\Users\ecker\Pictures
C:\Users\ecker\Videos
C:\Users\ecker\Documents
C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs
C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup
C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs
C:\Users\ecker\AppData\Roaming\Microsoft\Windows\Start Menu
C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup
C:\Users\ecker\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup
仅针对个人/文档文件夹:
@echo off && setlocal enabledelayedexpansion
set "_Key=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
for /f tokens^=3 %%i in ('%__APPDIR__%reg.exe query "!_Key!"^|find/i "Personal"')do <con: call set "_docs_folder=%%~i"
if exist "!_docs_folder!\My_File.docx" (
echo\!_docs_folder!\My_File.docx
echo\File exist
) else (
echo\!_docs_folder!\My_File.docx
echo\File do not exist
)
endlocal && goto :EOF
- 输出结果:
C:\Users\ecker\Documents
观察:1使用<con: call
和set "_docs_folder=%%~i"
扩展变量中的完整路径%%~i
(%UserProfile%\Documents
) 到C:\Users\ecker\Documents
观察:2您的代码(电源外壳和蝙蝠/命令)效果很好(对于没有空格的用户名/文件夹),也可以这样写:
@echo off
for /f tokens^=* %%a in ('powershell -co [Environment]::GetFolderPath('Personal'^)
')do set "docs_folder=%%a" & if exist "%docs_folder%\*.*" echo\"%docs_folder%\*.*"
考虑使用所有(*
)标记,因为tokens^=*
可确保循环变量(%%i
)中的所有字符都被用来组成变量中的值,包括标准分隔符,例如空格(例如),并且如果用户名包含任何字符,则如果没有tokens^=*
,则实际上只会使用第一个标记(默认),并且在其输出/变量中将缺少其他字符。
答案2
我想出了一个适合我的方法:
for /f usebackq %%a in (
`powershell -command "[Environment]::GetFolderPath('Personal')"`
) do (set "docs_folder=%%a")
echo %docs_folder%
答案3
在 Windows 10 中,最好使用 PowerShell:
您可以查询注册表:
(Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders').Personal
- or -
$Key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
(gp $Key).Personal
或者查询 Shell:
(New-Object -ComObject Shell.Application).Namespace("shell:Personal").Self.Path
输出:
PS C:\> (Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders').Personal
C:\Users\keith\Documents
PS C:\>
PS C:\> (New-Object -ComObject Shell.Application).Namespace("shell:Personal").Self.Path
C:\Users\keith\Documents
PS C:\>
答案4
@蒂姆
您的浏览器会存储您的默认下载位置。例如,在 Chrome v83 中,我可以通过搜索找到我的下载文件夹...C:\Users\用户名\AppData\Local\Google\Chrome\用户数据\Default\Preferences
寻找“默认目录”(包括双引号)。
就我而言,我的默认下载位置是邮箱:\DNLDS我在我的优先文件:
“默认目录”:“E:\DNLDS”
笔记:在上面这行中,论坛软件删除了我的答案中的双反斜杠。在优先文件的磁盘名称 (E) 后包含两个反斜杠符号,如...
"default_directory":"E:\\DNLDS"
其他浏览器使用不同的位置来存储首选项或配置文件,但它们都必须存储您从网络下载的文件的目标位置。
请注意,有些人会在一台电脑上定义多个配置文件。您的批处理文件可能需要下载一个测试文件(具有唯一名称)并搜索所有默认位置以确定哪个是当前默认位置。此外,有些人会在同一台电脑上的不同浏览器中定义不同的默认下载位置。换句话说,有些用户有多个默认下载位置。