是否可以创建用户定义的PowerShell环境?

是否可以创建用户定义的PowerShell环境?,powershell,session,aliases,Powershell,Session,Aliases,我想清除大部分别名定义的PowerShell会话,但常见别名除外,如cd、sort、mkdir、… 完成会话后,我希望恢复所有以前已知的别名 无需卸载模块或注销cmdlet。我只想清除会话的别名命名空间 我可以在如下列表中指定允许的别名: $AllowedAliases = @( "cd", "mkdir", "rm", "rmdir", "cd", "mkdir", "rm", "rmdir", "where", "select", "sort" ) 如何保存别名并还原它们?

我想清除大部分别名定义的PowerShell会话,但常见别名除外,如cd、sort、mkdir、…
完成会话后,我希望恢复所有以前已知的别名

无需卸载模块或注销cmdlet。我只想清除会话的别名命名空间

我可以在如下列表中指定允许的别名:

$AllowedAliases = @(
  "cd", "mkdir", "rm", "rmdir",
  "cd", "mkdir", "rm", "rmdir",
  "where", "select",
  "sort"
)
如何保存别名并还原它们?

我如何才能开始一个干净的豪华生活并只加载基本别名?


到目前为止我所测试的内容: 下面几行来自我的示例模块
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
不幸的是,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
可以在别名设置为non时向
Get Item
附加默认路径。

别名的作用域是有限的。删除函数中的所有别名时,全局范围中的别名不受影响。下面是对我有用的代码(稍微简化了您的代码,尽管我没有涉及取消注册PoC,我认为这也可以简化):

功能寄存器PoC{
$script:alias=获取项目别名:
删除项目别名:*-强制
}
函数取消注册PoC
{foreach($script中的a:alias)

{Write Host“$($a.Name)对于您的情况,我建议使用PowerShell配置文件。这些配置文件可以按用户、每台计算机和其他情况定义。您可以在配置文件中定义函数后,通过调用该函数自动运行存储在配置文件中的函数

仅针对当前计算机上的当前用户

有关其他配置文件选项,请签出

要忽略配置文件,可以通过直接运行powershell.exe-NoProfile-NoExit来忽略配置文件,但在另一个powershell会话中执行此操作时,请注意嵌套会话

要清除除所需列表之外的所有别名,您可以导出别名,并在清除所有别名后重新导入。如果需要,可以将其添加到配置文件中。否则,将其分配给配置文件中的函数并根据需要调用。如果不使用配置文件文件夹(或您希望保留内容的任何位置),请更改路径:


注意:至少在Powershell v5.0中,原始列出的别名(mkdir)中有一个是函数,而不是别名。由于OP提到了这一点,因此还将
dir
添加到列表中。

您的解决方案不起作用。我正在PS 5.0.10240.16384(Win10)上测试代码。它在PS3.0上工作。我没有安装5.0,因此无法在那里测试。可能是一个bug(实际上,根据定义,它是一个bug或一个破坏性的功能更改)。我试图启动powershell.exe-4.0版
,但
$PSVersionTable
始终报告5.0。这不是5.0版的最终版本…明天我会将您的代码放在另一台4.0版的电脑上。顺便说一句,即使我的代码不起作用,要点是一样的。别名是有范围的。如果您不想在全局范围内使用它们,则需要在全局范围内删除它们作用域。由于
删除项
不提供作用域参数,您唯一的其他(有文档记录的)选择是使用点源。使用
-NoProfile
加载powershell.exe不会提供空的别名列表。正确。它不会加载配置文件中定义的别名,并保留默认别名不变。这是一种“撤消”的方法在配置文件中创建并以“干净”开头的任何别名slate。如果您希望完全消除默认别名,这只是部分解决方案,但却是管理用户定义的别名和变量的一种方法。我也在寻找一种解决方案来删除别名,如ipmo。@Paebbels根据所需结果更新了答案。这里有一个很好的答案:@ChrisNash不,这没有回答我的问题。我的问题不是别名。而是创建一个几乎为空的PowerShell,只允许少量命令。
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]:
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
New-Item -Path $PROFILE -ItemType File -Force
$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