【问题标题】:PowerShell Prompt - Show User and System Path separatelyPowerShell 提示 - 分别显示用户和系统路径
【发布时间】:2021-10-20 09:02:16
【问题描述】:

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

"(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 成为多用户操作系统,就需要为用户提供自己的 PATH 设置以及系统范围的设置。因此,将用户变量与系统变量分开的唯一方法是使用注册表项,这太复杂了。

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

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

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

【问题讨论】:

  • 为什么一定要短?做你需要的不是更好吗? ;-) 我建议使用两个单独的文件或其他文件类型,如 CSV、XML 或 PSD1 ...
  • 它必须简短,因为它做了一件微不足道的事情。 “短”是指 PS 代码而不是输出。确实,与 Microsoft 相比,Linux 做这些事情的风格非常简洁。
  • PowerShell 代码在设计上更加冗长且易于阅读,即使对于经验不足的编码人员也是如此。你真正想做的是什么?你如何处理文件env.txt
  • @Olaf File 只是一种简单方便的环境检查方式。
  • 目标/目的是什么? Path 变量的管理?

标签: powershell path environment-variables


【解决方案1】:

最后,我找到了适用于任何版本的 PoSH、任何 Windows 操作系统(自 Win 7 起)且无需下载第三方程序的解决方案。这足够紧凑和通用:

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

然后,您将拥有一个包含 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

也可以在前面的sn-p中加入下面一行来获取所有的环境变量:

ls env: >> env.txt

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    文档(上面的链接)还解释了如何使用 EditPath.exe 来更改系统和/或用户路径。

    【讨论】:

      【解决方案3】:

      根据我的经验,当您使用对象和管道时,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 在开发时可以省略,所以你只是 在控制台上进行迭代(没有什么比“向上箭头”反馈循环更好的了!)
      • 不必处理文件语义——不管文件是否存在都可以工作,不需要特定的操作顺序等

      我不喜欢的:

      • 非常冗长

      【讨论】:

      • 实际上这对于整个 PS-Script 来说看起来不错。不仅仅是您可以简单地粘贴到 命令提示符 中的内容。此外,据我所知,这不适用于旧的 PowerShell v1.0
      • 为什么需要 PowerShell v1 支持?
      • “不仅仅是你可以简单地粘贴到命令提示符中的东西”——这就是它的美妙之处,你可以! PowerShell 可以通过脚本在 IDE 中运行,或者只是粘贴到终端中。
      • powershell 1 的要求是自原始帖子以来的新要求。这严重限制了可能的解决方案
      • @Bill_Stewart “为什么需要对 PowerShell v1 的支持” 也许是因为它在 Win7 中开箱即用?因此,如果您有 v1 的解决方案,-您有 Win 7-10-11 的通用解决方案吗?而且你不需要为每个琐碎的任务下载任何东西。
      【解决方案4】:

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

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

      【讨论】:

      • 这看起来像是一个合适的变体。不幸的是,它不适用于旧版本的 PowerShell v1.0。此外,如果每行可以容纳 68 个字符,那就太好了。但这已经是终极梦想了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2016-12-12
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2018-03-14
      • 2019-12-23
      相关资源
      最近更新 更多