我正在开发一个向 PATH 环境变量添加值的 Windows 程序。 PATH 变量以分号 (
;
) 分隔,并且可以包含任何有效的文件夹路径。但是,;
在文件夹路径中有效,因此包含分号的路径在添加到路径时必须用双引号引起来:
C:\Program Files (x86);"C:\;My Folder";C:\Program Files
为了避免分号出现此问题,我的程序将所有路径用双引号引起来。然而,最近有人告诉我,Powershell 不能使用 PATH 变量中的带引号的值,因为它将引号视为普通字符:
我研究了 PowerShell 如何处理 Path 变量(基于以下代码:PowerShell/PowerShell@16176ef/src/System.Management.Automation/engine/CommandDiscovery.cs#L1187-L1240)。据我所知,PowerShell 不会删除双引号 - 它只是在看到分号的地方分割路径。
因此,PATH值
C:\Program Files (x86);"C:\;My Folder";C:\Program Files
被错误地解释为这样(如果我正确理解发生了什么):
C:\Program Files (x86)
"C:\
My Folder"
C:\Program Files
我的程序处理这个问题的最佳方法是什么?而且,更紧迫的是,为什么 Powershell 不能使用带引号的 PATH 值(尽管 CMD 可以)? 使用手动方式编辑路径值以包含分号 -
Edit the system environment variables -> Path -> Edit
- 会导致 Windows 自动将所需路径用引号引起来,从而破坏 Powershell。所以这不是我的程序或情况的问题 - 这是 Powershell 如何处理 PATH 的固有问题。
Powershell 中的这种行为是故意的吗?是否有解决方法,或者我是否必须通过 A. 允许发生这种错误行为,其中包含分号并用引号引起来的路径处理不当或 B. 不允许在 PATH 中使用分号?
“Powershell 不适用于 PATH 变量中的带引号的值,因为它将引号视为普通字符:”
Afaik,PowerShell 根本没有任何本机命令(或自动变量)可以为您返回环境路径中的路径列表。这意味着,您必须自己编写脚本。
$env:Path -split ';'
那样分割环境路径,您确实可能会遇到包含半列的文字路径的问题。这意味着您必须想出一种聪明的方法来分割路径或使用现有的转换器/解析器。ConvertFrom-Csv
cmdlet 与您想要执行的操作非常接近,您可能会考虑使用它:
($Env:Path | ConvertFrom-Csv -Delimiter ';' -Header (0..99)).PSObject.Properties.Value
C:\Program Files (x86)
C:\;My Folder
C:\Program Files
$Env:Path
包含一个字符串,其中所有环境路径都用半列 (;
)ConvertFrom-Csv -Delimiter ';'
使用半列作为分隔符来分割环境路径,并且还处理分隔符周围的引号值和空格。
-Header (0..99)
为每个值定义一个数字标题(从 0
到 99
)ConvertFrom-Csv
返回一个PSCustomObject
,要检索它的所有属性,您使用隐藏的PSObject
属性:.PSObject.Properties
.Value
属性将简单地返回所有不是 $Null
的值。