2

我想清除几乎所有别名定义的 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

4

2 回答 2

1

别名是有范围的。当您删除函数中的所有别名时,全局范围内的别名不受影响。这是对我有用的代码(稍微简化了您的代码,尽管我没有触及 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 上的点运算符。您将需要 dot sourcequit将别名恢复到全局范围。

顺便说一句,而不是foreachUnregister-PoC 中的循环,您可以使用copy-item.

于 2016-01-20T15:01:01.627 回答
1

对于您的情况,我建议使用 PowerShell 配置文件。这些可以按用户、按机器和其他情况进行定义。您只需在配置文件中定义函数后调用该函数即可自动运行存储在配置文件中的函数。

对于当前机器上的当前用户,请参见此处的示例 3

New-Item -Path $PROFILE -ItemType File -Force

有关其他配置文件选项,请查看了解六个 PowerShell 配置文件

要忽略配置文件,您可以通过直接运行来做到这一点,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 提到了这一点,因此也添加到了列表中。

于 2016-01-20T16:26:29.237 回答