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 Path
和 System 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
我是 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 Path
和 System 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