当前位置: 首页 > 知识库问答 >
问题:

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

韩靖琪
2023-03-14

我想清除大部分别名定义的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]:

因此dirseams可以在别名设置为non时向Get Item附加默认路径。

共有2个答案

嵇丰
2023-03-14

对于您的情况,我建议使用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提到了这一点。

宿嘉
2023-03-14

别名的作用域是有限的。删除函数中的所有别名时,全局范围中的别名不受影响。下面是对我有用的代码(稍微简化了您的代码,尽管我没有涉及取消注册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

注意寄存器-PoC上的点操作符。您将需要点的源代码退出将别名恢复到全局范围。

顺便说一句,您可以使用copy item,而不是Unregister PoC中的foreach循环。

 类似资料:
  • 我希望用户能够编辑管理后端面板上自己的电子邮件内容,用户可以使用一些指令,如: 因此,例如,用户可以在 : 我如何在Laravel中创建一些自定义指令,任何我可以用来简化开发的库?当然,用户不允许使用PHP代码。 我知道有Laravel刀片,但我不确定这是安全的,用于公众用户编辑内容和只允许客户指令。

  • 我的目标: 我正在应用程序中处理一组endpoint,我有一个包含所有endpoint的swagger 2.0文件。他们正在我们的测试环境中工作,但我们还不会在prod中提供他们。 我的问题是: 如果我升级到OpenApi 3,是否可以通过服务器对象隐藏我不希望在prod中可见的路径? 我不认为这是因为阅读了文档,但我很想在这里出错,因为我更希望只有一个api。yml,而不是每个环境一个。 非常感

  • 问题内容: 在数学课上,我们学习了如何定义新的运算符。例如: 这定义了法律。对于x和y的任何实数,x y是x + 2y。 范例:。 可以在JavaScript中定义这样的运算符吗?我知道函数可以胜任: 但我想使用以下语法: 代替这个: 哪个是最接近这个问题的解决方案? 问题答案: 最简洁的答案是不。ECMAScript(标准JS所基于的)不支持运算符重载。 可以使用sweet.js之类的第三方工具

  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 问题内容: 我正在尝试执行一个当前在phpMyAdmin中可用的查询,但是使用MySqlAdapter在.NET中执行该查询时不起作用。这是Sql语句。 它使用@rownum对从我的内部标量查询返回的每个不同的行进行编号。但是,如果我在.NET中使用它,则假定@rownum是一个参数并抛出异常,因为我没有定义它。 关于如何解决这个问题的任何想法?还是我获取行号的可能方法? 问题答案: 我发现此博客

  • 问题内容: 我正在启动一个使用Java实现的Restful架构的项目(使用新的JAX-RS标准) 我们计划使用Flex应用程序开发GUI。我已经发现使用HTTPService组件实现此问题(响应错误代码,标头访问…)。 你们中的任何一个在类似项目中都有一些经验。可行吗 问题答案: 这里的问题是,围绕此问题的许多网络讨论都已经有一年或更久的历史了。我现在正在做同样的研究,这就是我今天所学到的。 Jo