首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以创建用户定义的PowerShell环境?

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

Stack Overflow用户
提问于 2016-01-20 02:44:32
回答 2查看 155关注 0票数 2

我想清除一个PowerShell会话的大部分别名定义,除了像cd,排序,mkdir,.

在我完成我的会话后,我想恢复所有以前已知的别名。

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

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

代码语言:javascript
复制
$AllowedAliases = @(
  "cd", "mkdir", "rm", "rmdir",
  "cd", "mkdir", "rm", "rmdir",
  "where", "select",
  "sort"
)

如何保存别名并恢复它们?

如何启动一个干净的PoSh并且只加载基本别名?

到目前为止,我所测试的是:

下面的行来自我的示例模块poc.psm1

代码语言:javascript
复制
$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

用法示例:

代码语言:javascript
复制
Import-Module .\poc.psm1
dir Alias:
quit
dir Alias:

不幸的是,dir Alias:在调用我的脚本后并不是空的.

另一件事是,我应该保留这些别名的一些设置,因为手动测试显示,dir的行为不像以前的dir:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 15:01:01

别名被限定范围。当您移除函数中的所有别名时,全局范围中的别名不会受到影响。下面是为我工作的代码(虽然我没有接触unregister,但可以简化您的代码,但我认为它也可以简化):

代码语言:javascript
复制
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上的点运算符。您需要点源quit来将别名还原到全局范围。

顺便说一句,您可以使用copy-item,而不是取消寄存器-PoC中的copy-item循环。

票数 1
EN

Stack Overflow用户

发布于 2016-01-20 16:26:29

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

对于当前机器上的当前用户,参见这里的示例3

代码语言:javascript
复制
New-Item -Path $PROFILE -ItemType File -Force

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

要忽略概要文件,可以直接运行powershell.exe -NoProfile -NoExit,但在另一个PowerShell会话中要小心嵌套会话。

要清除除所需列表之外的所有别名,可以导出别名,并在删除所有别名后重新导入它们。如果需要,可以将其添加到配置文件中。否则,将其分配给配置文件中的函数,并根据需要进行调用。如果不使用配置文件文件夹(或您喜欢保存的任何地方),请更改路径:

代码语言:javascript
复制
$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提到了这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34890662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档