首页 > 解决方案 > "$env:userprofile" 不会产生与在文件资源管理器中使用 "%userprofile%" 相同的结果

问题描述

我正在尝试使用以下行在 powershell 中查找用户下载目录: $downloadDirectory = "$env:USERPROFILE\Downloads"

但我收到以下错误:

Get-ChildItem : Cannot find path 'C:\Users\skewb\Downloads' because it does not exist.
At D:\Users\Skewb\Documents\repos\DotaMatchFinder\unzip_move_run.ps1:16 char:5
+     Get-ChildItem -Path $downloadDirectory
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\skewb\Downloads:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

当我在文件资源管理器中输入以下内容时,%USERPROFILE%/Downloads 我被带到了正确的路径D:\Users\Skewb\Downloads

这是故意的吗?我需要用另一种方式找到这个目录吗?

标签: powershellgoogle-chromewinapi

解决方案


你的症状是神秘的(见底部),但可以 - 可能 - 被一个在概念上更可取的解决方案绕过:

正如zett42 所指出的那样,所谓的已知或特殊文件夹(系统已知具有特定用途的文件夹)可能会被重定向到默认位置以外的位置,因此可靠的解决方案是向系统询问该位置,通过一个符号名

不幸的是,这并不像人们希望的那样简单:

$downloadDirectory = 
  (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path
  • 可在此处找到支持的符号名称的第三方列表;不幸的是,关于已知文件夹的官方概念帮助主题对shell 不友好。

  • 从 PowerShell 7.1 开始,没有 PowerShell 原生方式来查询已知文件夹,但有待处理的GitHub 提案 #6966来改变它。

  • 虽然 .NET 确实有一个 API,[System.Environment]::GetFolderPath($symbolicName)但它的特殊文件夹集是不完整的,尤其是不包括 Downloads 文件夹。

  • (New-Object -ComObject WScript.Shell).SpecialFolders($symbolicName)就支持的特殊文件夹集而言,同样不完整。

警告:虽然尝试从注册表获取已知文件夹信息很诱人,但官方建议不要这样做 - 请参阅Raymond Chen 的这篇博客文章


至于你的症状

我的猜测是,您的 PowerShell 配置文件中的某些内容意外地重新定义了USERPROFILE环境,这虽然在技术上是可行的,但显然是不明智的。


推荐阅读