powershell - "$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
这是故意的吗?我需要用另一种方式找到这个目录吗?
解决方案
你的症状是神秘的(见底部),但可以 - 可能 - 被一个在概念上更可取的解决方案绕过:
正如zett42 所指出的那样,所谓的已知或特殊文件夹(系统已知具有特定用途的文件夹)可能会被重定向到默认位置以外的位置,因此可靠的解决方案是向系统询问该位置,通过一个符号名。
不幸的是,这并不像人们希望的那样简单:
$downloadDirectory =
(New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path
从 PowerShell 7.1 开始,没有 PowerShell 原生方式来查询已知文件夹,但有待处理的GitHub 提案 #6966来改变它。
虽然 .NET 确实有一个 API,
[System.Environment]::GetFolderPath($symbolicName)
但它的特殊文件夹集是不完整的,尤其是不包括 Downloads 文件夹。(New-Object -ComObject WScript.Shell).SpecialFolders($symbolicName)
就支持的特殊文件夹集而言,同样不完整。
警告:虽然尝试从注册表获取已知文件夹信息很诱人,但官方建议不要这样做 - 请参阅Raymond Chen 的这篇博客文章。
至于你的症状:
我的猜测是,您的 PowerShell 配置文件中的某些内容意外地重新定义了USERPROFILE
环境,这虽然在技术上是可行的,但显然是不明智的。
推荐阅读
- c# - SqlKata - 请求中的方括号
- google-chrome - 有没有一种简单的方法可以找到客户端渲染数据的 URL?
- html - 在弹性框中强制中断并将项目显示到下一列
- github - Github GraphQL API:如何通过 GrahpQL api 获取代表的一个源文件?
- microservices - Nest JS 微服务 TCP E2E 测试
- spring-boot - JwtAccessTokenConverterConfigurer 替代?
- c++ - 元组的运行时索引
- c# - QueryString 中的 DateTime 格式错误
- visual-studio - 如何在单个 WiX 安装程序中为多个 msi 包提供可选安装?
- python - snakemake 临时目录