Powershell “$env:userprofile”产生的结果与在文件资源管理器中使用“%userprofile%”产生的结果不同

Powershell “$env:userprofile”产生的结果与在文件资源管理器中使用“%userprofile%”产生的结果不同,powershell,google-chrome,winapi,Powershell,Google Chrome,Winapi,我正在尝试使用以下行在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 ch

我正在尝试使用以下行在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%/下载中键入以下内容时 我被带到了正确的路径D:\Users\Skewb\Downloads


这是有意的吗?我是否需要以另一种方式查找此目录?

您的症状很神秘,请参见下一节,但可以-可能-通过概念上更可取的解决方案绕过:

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

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

$downloadDirectory = 
  (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path
可以找到受支持的符号名称的第三方列表;不幸的是,这位官员对壳牌并不友好

从PowerShell 7.1开始,没有PowerShell本机方式来查询已知文件夹,但有待更改

虽然.NET有一个API,但它的一组特殊文件夹是不完整的,尤其是不包括下载文件夹

新对象-ComObject WScript.Shell.SpecialFolders$symbolicName对于支持的特殊文件夹集同样不完整

警告:虽然尝试从注册表中获取已知文件夹信息很有诱惑力,但官方建议不要这样做-请参阅

至于你的症状:


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

您的症状很神秘,请参见下一节,但可以-可能-通过概念上更可取的解决方案绕过:

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

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

$downloadDirectory = 
  (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path
可以找到受支持的符号名称的第三方列表;不幸的是,这位官员对壳牌并不友好

从PowerShell 7.1开始,没有PowerShell本机方式来查询已知文件夹,但有待更改

虽然.NET有一个API,但它的一组特殊文件夹是不完整的,尤其是不包括下载文件夹

新对象-ComObject WScript.Shell.SpecialFolders$symbolicName对于支持的特殊文件夹集同样不完整

警告:虽然尝试从注册表中获取已知文件夹信息很有诱惑力,但官方建议不要这样做-请参阅

至于你的症状:


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

奇怪。您是如何启动PowerShell的?它发生在我双击启动脚本和通过ISE运行脚本时。下载文件夹可能会被重定向,因此硬编码$env:USERPROFILE\downloads是错误的。尝试改用已知的文件夹API。下面是一个PowerShell cmdlet:@Theo,这很诱人,但官方建议不要使用它-请参阅@the除非您可以链接到官方文档,否则注册表不是编程接口。这是一个实现细节。虽然很多人会向你保证,微软永远不会改变周围的一切,但最近情况发生了变化,微软会允许由于更新操作系统而导致代码中断。从非官方注册表项中读取是一个坏代码。奇数。您是如何启动PowerShell的?它发生在我双击启动脚本和通过ISE运行脚本时。下载文件夹可能会被重定向,因此硬编码$env:USERPROFILE\downloads是错误的。尝试改用已知的文件夹API。下面是一个PowerShell cmdlet:@Theo,这很诱人,但官方建议不要使用它-请参阅@the除非您可以链接到官方文档,否则注册表不是编程接口。这是一个实现细节。虽然很多人会向你保证,微软永远不会改变周围的一切,但最近情况发生了变化,微软会允许由于更新操作系统而导致代码中断。从非官方的注册表项读取是一段错误的代码。太棒了,谢谢@mklement0。YouI真的认为获取符号名就像$env:USERPROFILE/Downloads一样简单,但我很高兴在您提供答案之前没有时间尝试,否则我会浪费很多时间。我将尝试查看我设置的任何手动powershell配置文件更改,然后返回给您。很高兴听到这是h
elpful,@Skewjo。请注意,$env:USERPROFILE/Downloads应该在默认配置下工作-但是由于可以重新定义已知文件夹的位置,因此使用系统API是最健壮的解决方案。太棒了,谢谢@mklement0。YouI真的认为获取符号名就像$env:USERPROFILE/Downloads一样简单,但我很高兴在您提供答案之前没有时间尝试,否则我会浪费很多时间。我将尝试查看我设置的任何手动powershell配置文件更改,然后返回给您。很高兴听到这一更改很有帮助,@Skewjo。请注意,$env:USERPROFILE/Downloads应该在默认配置下工作,但是由于可以重新定义已知文件夹的位置,因此使用系统API是最健壮的解决方案。