是否可以创建用户定义的 PowerShell 环境?
Posted
技术标签:
【中文标题】是否可以创建用户定义的 PowerShell 环境?【英文标题】:Is it possible to create a user defined PowerShell environment? 【发布时间】:2016-04-25 17:53:04 【问题描述】:我想清除几乎所有别名定义的 PowerShell 会话,但常见别名(如 cd、sort、mkdir、... 完成会话后,我想恢复所有以前已知的别名。
无需卸载模块或注销 CmdLets。我只想为我的会话清除别名命名空间。
我可以在这样的列表中指定允许的别名:
$AllowedAliases = @(
"cd", "mkdir", "rm", "rmdir",
"cd", "mkdir", "rm", "rmdir",
"where", "select",
"sort"
)
如何保存别名并恢复它们? 或如何启动干净的 PoSh 并仅加载基本别名?
到目前为止我测试过的内容:
以下几行来自我的示例模块poc.psm1
。
$Aliases = @()
function Register-PoC
foreach ($a in (Get-Item Alias:))
$script:Aliases += $a
Write-Host "$($a.Name) => $($a.ReferencedCommand) ($($a.Visibility))"
Remove-Item "Alias:$($a.Name)" -Force
function Unregister-PoC
foreach ($a in $script:Aliases)
Write-Host "$($a.Name) <= $($a.ReferencedCommand)"
if (Test-Path "Alias:$($a.Name)")
Write-Host "$($a.Name) exists."
else
Set-Alias -Name $a.Name -Value $a.ReferencedCommand -Scope $a.Visibility
if (Test-Path Alias:quit) Remove-Item Alias:quit
Remove-Module PoC
Export-ModuleMember -Function 'Register-PoC'
Export-ModuleMember -Function 'Unregister-PoC'
Register-PoC
Set-Alias -Name quit -Value Unregister-PoC -Description "Unload this module." -Scope Global
使用示例:
Import-Module .\poc.psm1
dir Alias:
quit
dir Alias:
不幸的是,dir Alias: 在调用我的脚本后不为空...
另一件事是,我应该保留这些别名的一些设置,因为手动测试表明,dir
的行为不像以前的 dir:
Remove-Item dir
Set-Alias dir Get-Item
dir
Cmdlet Get-Item an der Befehlspipelineposition 1
Geben Sie Werte für die folgenden Parameter an:
Path[0]:
所以dir
接缝将默认路径附加到Get-Item
如果 non 设置为别名。
【问题讨论】:
这里有一个很好的答案:***.com/questions/24914589/… @ChrisNash 不,这不能回答我的问题。我的问题与别名无关。这是关于创建一个几乎是空的 PowerShell 并且只允许少数命令。 【参考方案1】:对于您的情况,我建议使用 PowerShell 配置文件。这些可以按用户、按机器和其他情况进行定义。您只需在配置文件中定义函数后调用该函数即可自动运行存储在配置文件中的函数。
仅针对当前计算机上的当前用户,see Example 3 here。
New-Item -Path $PROFILE -ItemType File -Force
有关其他配置文件选项,请查看Understanding the Six PowerShell Profiles。
要忽略配置文件,您可以通过直接运行 powershell.exe -NoProfile -NoExit
来做到这一点,但在另一个 PowerShell 会话中执行此操作时请注意嵌套会话。
要擦除除所需列表之外的所有别名,您可以导出别名并在擦除所有别名后重新导入它们。如果需要,可以将其添加到配置文件中。否则将其分配给配置文件中的函数并根据需要调用。如果不使用配置文件文件夹(或您喜欢保存的任何地方),请更改路径:
$allowedaliases = "cd","dir","rm","rmdir","where","select","sort"
Export-Alias -Path "$((Get-ChildItem $PROFILE).DirectoryName)\aliases.csv" -Name $allowedaliases
Remove-Item Alias:* -Force
Import-Alias -Path "$((Get-ChildItem $PROFILE).DirectoryName)\aliases.csv" -Force
注意:最初列出的别名(mkdir)之一是一个函数,而不是别名,至少在 Powershell v5.0 中是这样。还添加了 dir
到列表中,因为 OP 提到了这一点。
【讨论】:
使用-NoProfile
加载 powershell.exe 不会提供空的别名列表。
正确。它不加载配置文件中定义的别名,并保持默认别名不变。这是一种“撤消”在配置文件中创建的任何别名并从“干净”列表开始的方法。如果您希望完全清除默认别名,这只是部分解决方案,但它是管理用户定义的别名和变量的一种方法。
我也在寻找一种解决方案来删除像 ipmo 这样的别名。
@Paebbels 根据所需结果更新答案。【参考方案2】:
别名是有范围的。当您删除函数中的所有别名时,全局范围内的别名不受影响。这是对我有用的代码(稍微简化了您的代码,虽然我没有触及 unregister-PoC,我认为这也可以简化):
function Register-PoC
$script:aliases = get-item alias:
remove-item alias:* -force
function Unregister-PoC
foreach ($a in $script:Aliases)
Write-Host "$($a.Name) <= $($a.ReferencedCommand)"
if (Test-Path "Alias:$($a.Name)")
Write-Host "$($a.Name) exists."
else
Set-Alias -Name $a.Name -Value $a.ReferencedCommand -Scope $a.Visibility
if (Test-Path Alias:quit) Remove-Item Alias:quit
Remove-Module PoC
. Register-PoC
Set-Alias -Name quit -Value Unregister-PoC -Description "Unload this module." -Scope Global
注意 Register-PoC 上的点运算符。您需要点 source quit
将别名恢复到全局范围。
顺便说一句,您可以使用 copy-item
,而不是 Unregister-PoC 中的 foreach
循环。
【讨论】:
您的解决方案不起作用。我正在 PS 5.0.10240.16384 (Win10) 上测试代码。 它适用于 PS 3.0。我没有安装 5.0,所以无法在那里进行测试。可能是错误(实际上根据定义,它是错误或破坏性功能更改)。 我尝试启动powershell.exe -Version 4.0
但 $PSVersionTable
总是报告 5.0。这不是 5.0 的最终版本……明天我会把你的代码放在另一台 4.0 的 PC 上。
顺便说一句,即使我的代码不起作用,重点是一样的。别名是有范围的。如果您不希望它们在全局范围内,则需要在全局范围内删除它们。由于remove-item
没有提供范围参数,因此您唯一的其他(记录在案的)选择是使用点源。以上是关于是否可以创建用户定义的 PowerShell 环境?的主要内容,如果未能解决你的问题,请参考以下文章
如何在配置文件中定义的 PowerShell 脚本中设置环境变量?