是否可以创建用户定义的 PowerShell 环境?
Is it possible to create a user defined PowerShell environment?
我想清除几乎所有别名定义的 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
。
别名是有范围的。当您删除函数内的所有别名时,全局范围内的别名不受影响。这是对我有用的代码(虽然我没有触及 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 上的点运算符。您将需要点源 quit
以将别名恢复到全局范围。
顺便说一句,您可以使用 copy-item
.
而不是 Unregister-PoC 中的 foreach
循环
对于您的情况,我建议使用 PowerShell 配置文件。这些可以针对每个用户、每台机器和其他情况进行定义。您可以自动 运行 功能存储在配置文件中,只需在配置文件中定义函数后调用它即可。
对于当前计算机上的当前用户,see Example 3 here。
New-Item -Path $PROFILE -ItemType File -Force
有关其他配置文件选项,请查看 Understanding the Six PowerShell Profiles。
要忽略配置文件,您可以直接 运行ning powershell.exe -NoProfile -NoExit
来做到这一点,但在另一个 PowerShell 会话中这样做时要小心嵌套会话。
要擦除所需列表以外的所有别名,您可以导出别名,并在擦除所有别名后 re-import 它们。如果需要,可以将其添加到配置文件中。否则将其分配给配置文件中的函数并根据需要调用。如果不使用配置文件文件夹(或任何您想保留东西的地方),请更改路径:
$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 提到了这一点。
我想清除几乎所有别名定义的 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
。
别名是有范围的。当您删除函数内的所有别名时,全局范围内的别名不受影响。这是对我有用的代码(虽然我没有触及 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 上的点运算符。您将需要点源 quit
以将别名恢复到全局范围。
顺便说一句,您可以使用 copy-item
.
foreach
循环
对于您的情况,我建议使用 PowerShell 配置文件。这些可以针对每个用户、每台机器和其他情况进行定义。您可以自动 运行 功能存储在配置文件中,只需在配置文件中定义函数后调用它即可。
对于当前计算机上的当前用户,see Example 3 here。
New-Item -Path $PROFILE -ItemType File -Force
有关其他配置文件选项,请查看 Understanding the Six PowerShell Profiles。
要忽略配置文件,您可以直接 运行ning powershell.exe -NoProfile -NoExit
来做到这一点,但在另一个 PowerShell 会话中这样做时要小心嵌套会话。
要擦除所需列表以外的所有别名,您可以导出别名,并在擦除所有别名后 re-import 它们。如果需要,可以将其添加到配置文件中。否则将其分配给配置文件中的函数并根据需要调用。如果不使用配置文件文件夹(或任何您想保留东西的地方),请更改路径:
$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 提到了这一点。