PowerShell 提示 - 分别显示用户和系统路径

PowerShell Prompt - Show User and System Path separately

我是 PowerShell 的新手,所以我需要帮助来优化我的代码。 我试图让它尽可能短。 如果将其粘贴到 PS 提示:

"(USR PATH):" > env.txt;
[Environment]::GetEnvironmentVariable('Path','User').Split(';') >> env.txt;
[Environment]::NewLine >> env.txt;
"(SYS PATH):" >> env.txt;
[Environment]::GetEnvironmentVariable('Path','Machine').Split(';') >> env.txt;
[Environment]::NewLine >> env.txt

它会分开写'User'和'System'路径(环境变量) 到当前目录中的文本文件。 有什么可以缩短它的想法

实际上,我喜欢单行变体,但不幸的是它会 将“User”和“System”路径变量连接在一起。

$env:path -split ';'

注意:我已经尝试用cmd.exe解决这个问题。

path > env.txt

简单而简短的命令,但它输出单个 Path 字符串,没有任何拆分 (;),并且不区分 User PathSystem Path。为什么?因为 cmd.exe 是非常古老的工具。实际上 PATH 最初是一个单一的变量,可以追溯到 DOS 天。但是,一旦 Windows 成为多用户 OS,就需要为用户提供他们自己的 PATH 设置以及系统范围的设置。因此,将用户变量与系统变量分开的唯一方法是使用注册表项,这过于复杂。

现在我正尝试使用 PowerShell v1.0 解决这个问题。看起来这是一个非常古老的版本。所以 backtick(重音)和 pipeline 运算符对我不起作用。我什至跟不上 每行 68 个字符。例如,由于某些原因,此换行符代码不起作用:

[Environment]::GetEnvironmentVariable('Path','User').Split(';') `
>> env.txt;
[Environment]::NewLine >> env.txt;

还有很多重复的片段,比如>> env.txt,如果你先把输出保存在某个地方,可以优化。但是我的知识还不足以做到这一点。

我不认为这是个好主意,它会更难阅读,但我认为它更短。

@(1,'USR'),@(2,'SYS')|%{("("+$_[1]+" PATH):");[Environment]::GetEnvironmentVariable('PATH',$_[0]).Split(';');""} > env.txt

根据我的经验,当您主要使用对象和管道将字符串格式化推迟到绝对必要时,PowerShell 的效果最好

通常,这会导致 更长的 代码,但随着时间的推移更易于阅读、调试和维护。

@('Machine', 'User', 'Process') |
  ForEach-Object {
    [pscustomobject]@{
      Scope=$_
      Paths=[Environment]::GetEnvironmentVariable('PATH', $_) -split ';'
    }
  } |
  ForEach-Object {
    Write-Output "$($_.Scope): $($_.Paths -join "`n")"
  } | Set-Content -Path 'env.txt'

为什么我喜欢这段代码:

  • 易于自定义要包含的范围(注意我包含 Process 是为了完整性,但如果不需要,很容易删除)
  • 迭代开发:我没有从完整的东西开始,只是数组和第一个循环。一旦它产生正确的形状,我添加了第二个循环以将复杂对象转换为简单输出
  • Set-Content 在开发时可以省略,所以你只是 在控制台上迭代(没有什么比“向上箭头”反馈循环更好的了!)
  • 不必处理文件语义 -- 无论文件是否存在都有效,不需要特定的操作顺序等

我不喜欢的:

  • 非常冗长

一种可能的替代方法是从我的 GitHub 页面获取 EditPath.exe:

https://github.com/Bill-Stewart/PathMgr/blob/master/EditPath.md

将 EditPath.exe 复制到路径中的目录,然后在 PowerShell 提示符下输入以下命令:

PS C:\> editpath -sl;"";editpath -ul

这将输出系统路径中的目录,一个空行,然后是用户路径中的目录。如果希望程序扩展字符串中的%环境变量%引用,在参数中加入x;例如:

PS C:\> editpath -slx;"";editpath -ulx

文档(link 上面)还解释了如何使用 EditPath.exe 更改系统 and/or 用户路径。

我终于找到了可以在任何 Windows OS(自 Win 7)上使用任何版本的 PoSH 且无需下载第三方程序的解决方案。这个够简洁通用了:

  • Shift + Right click 在桌面上
  • 通过弹出菜单打开命令提示符
  • 键入 powershell 命令
  • 将代码片段粘贴到控制台。

然后您将拥有一个包含您的 PATH 环境的文件。

$n = "`r`n"; $u = "(USR-PATH): $n$n"; $s = "(SYS-PATH): $n$n";
$usr = [Environment]::GetEnvironmentVariable('Path','User');
$sys = [Environment]::GetEnvironmentVariable('Path','Machine');
$u + $usr + $n + $n + $s + $sys + $n -split ';' > env.txt

您还可以将以下行添加到前面的代码片段以获取所有环境变量:

ls env: >> env.txt