如何从 Windows 批处理脚本确定当前用户的 Documents 文件夹的位置?

如何从 Windows 批处理脚本确定当前用户的 Documents 文件夹的位置?

我知道我可以使用%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: callset "_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"

其他浏览器使用不同的位置来存储首选项或配置文件,但它们都必须存储您从网络下载的文件的目标位置。

请注意,有些人会在一台电脑上定义多个配置文件。您的批处理文件可能需要下载一个测试文件(具有唯一名称)并搜索所有默认位置以确定哪个是当前默认位置。此外,有些人会在同一台电脑上的不同浏览器中定义不同的默认下载位置。换句话说,有些用户有多个默认下载位置。

相关内容