首页 > 解决方案 > Where is the "downloads" folder located

问题描述

I'm making a script in Powershell ISE and to prevent piracy a part of the script needs to locates the file name and if it exists on the computer the script won't work. This will work cause downloading a file twice will give it a little (1).

I've google all kind of questions but I just really want to figure out the file path to a file located in downloads.

标签: windowspowershellfilepath

解决方案


tl;博士

  • 天真[1]答案通常并非总是有效:
"$HOME\Downloads"
  • 强有力的答案:
(New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path

"$HOME\Downloads"假设两件事,这不一定是真的:

  • $HOME等效于环境变量USERPROFILE( ) 的用户文档$env:USERPROFILE的根目录并不总是正确的,即不具有漫游配置文件- 仅可靠地反映文档文件夹。"${env:HOMEDRIVE}${env:HOMEPATH}"

  • 更重要的是,下载文件夹可能已被明确配置为位于任意位置,与文档位置无关

确定下载文件夹位置的唯一可靠方法是向系统询问它:

从 PowerShell Core 7.0.0-preview.3 开始,PowerShell 没有向系统询问已知文件夹位置的PowerShell 原生方式。

虽然 PowerShell 几乎可以无限制地访问 .NET 框架,因此可以使用该System.Environment类型的.GetFolderPath()方法来请求特殊的已知文件夹,但令人惊讶的是,指定的下载文件夹并不在其中。

只有 WinAPI 的Known Folders API允许以稳健的方式检索指定的下载文件夹,而不依赖于与其他已知文件夹的固定关系:

在 PowerShell 中,您可以通过Shell.ApplicationCOM 服务器访问它:

(New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path

有关所有受支持的 ( shell:-prefixed) 文件夹标识符的列表,请参阅本文


[1]天真的我的意思是:一种可以理解的尝试使用的解决方案,但它并不适用于所有情况。


推荐阅读