【发布时间】:2014-01-03 14:49:23
【问题描述】:
是否有 PowerShell 命令可让您检查别名是否存在?
(我一直在网上四处寻找,看起来不像。)
【问题讨论】:
-
正如@Rhumborl 的回答中指出的那样,您可以将“-force”附加到 New-Alias 命令以防止打印错误消息。
是否有 PowerShell 命令可让您检查别名是否存在?
(我一直在网上四处寻找,看起来不像。)
【问题讨论】:
您可以为此使用Test-Path:
PS C:\> test-path alias:l*
True
PS C:\> test-path alias:list*
False
只需使用:
if (Test-Path alias:list*) { ... }
或
if(!(Test-Path alias:list*)) { ... }
如果你想在别名不存在时做某事。
正如其他人所写,Get-Alias 也可以,但Test-Path 将避免构建别名列表,因此如果您关心这一点,可能会稍微快一点。
进一步说明:
Powershell 使用路径名来访问的不仅仅是文件,因此 C: 前缀允许您访问驱动器 C 上的文件,alias: 允许您访问别名,其他限定符允许您访问函数、命令、注册表项、安全证书等。所以在这里,alias:l* 是一个通配符路径名,它将匹配所有以字母 l 开头的别名,就像C:l* 匹配驱动器 C 根目录中所有以 l 开头的文件一样。
Test-Path 是一个命令行开关,仅当至少一个现有对象与该路径匹配时,它才会测试路径是否引用具有 True 结果的现有对象。所以通常你会用它来测试一个文件是否存在,但同样你可以测试任何可以用合适的限定符寻址的东西的存在。
【讨论】:
Test-Path”,这是一个明确的答案,但我很乐意扩展任何不清楚的内容。
Get-PSDrive 下,并且有一些选项显示在 Get-ChildItem alias:l* 下,可以简单地通过它进行测试。 Test-Path alias:l*。了解Get-ChildItem alias: 可以理解一切。谢谢。
我认为 Get-Alias 是您正在寻找的。p>
MS 文档: http://technet.microsoft.com/en-gb/library/ee176839.aspx
IF 示例:
$ar = get-alias -name f*
if($ar.count -lt 1){ do stuff }
【讨论】:
Measure 的命令看起来有点过头了。 if(!(get-alias -name list*)) { write-output "No alias" }
Set-StrictMode -Version 2.0(technet.microsoft.com/en-us/library/hh849692(v=wps.620).aspx),此方法会引发错误。邓肯的回答是测试别名/别名是否存在的更安全的方法。
是的,使用Get-Alias 命令。
例子:
Get-Alias -Name spps;
# If statement example
if (Get-Alias -Name spps) {
# Do something here
}
要获取处理别名的所有命令的列表,请使用Get-Command
Get-Command -Name *alias;
【讨论】:
if 语句默认是存在的,所以你所要做的就是说:if (<statement>) { ... }。我更新了我的示例代码:)
有一个专门用于 Aliases 的提供程序和一个 Alias: location,因此您也可以使用 Get-Childitem。
Get-Childitem alias:
【讨论】:
alias | ? { $_.resolvedcommand.name -match "get.*alias" }o.O
如果您只是想在别名不存在的情况下设置别名,另一种选择是使用Set-Alias 中的-Force 参数,这样您就不会收到提示别名已存在的错误:
Set-Alias "foo" MyFooFunction -Force
如果别名不存在,则会出现if(!(Get-Alias -Name foo)) 之类的错误。
【讨论】:
(在版本 5 中测试)
这是我如何使用上述内容(非常感谢所有人!):
If ((Test-Path alias:foo) -eq $false) {New-Alias -name foo -value Get-Foo}
这位于每个已成为或将成为模块的脚本的底部。如果别名已经存在,它会在用户的系统上放置一个别名,而不会引发错误或覆盖现有别名。
【讨论】:
只是想添加另一种方法来实现这一点..
$ErrorActionPreference = 'Stop'
$ee = @() # Exception catcher
$Newalias = 'wv'
try{
New-Alias -Name $Newalias -Value Write-Verbose | Out-Null
}
catch{$ee += $_}
if (($ee -ne $null) -and ($ee.CategoryInfo.Category.ToString() -match 'ResourceExists')){Write-Warning "Alias $Newalias already exists";break}
else{Write-Verbose 'Continue on'}
捕获异常并检查 that 是否符合布尔逻辑存在的条件。我发现这很有效,除非异常与您的预期不同。
【讨论】:
受 Duncan 和 Dana 提供的答案的启发,我创建了以下函数。我建议将其添加到 PowerShell 的 $PROFILE 变量指向的文件中。
function New-AliasSafe {
param(
[Parameter(Mandatory=$true)]
[string]
$Name,
[Parameter(Mandatory=$true)]
[string]
$Value
)
if (!(Test-Path alias:$Name)) {
New-Alias -Name $Name -Value $Value -Scope Global
Write-Verbose "Alias $Name created successfully!"
} else {
Write-Verbose "Another alias with $Name already exists!"
}
}
现在您可以在想要导入别名时调用此函数。
New-AliasSafe -Name wo -Value Write-Output
如果想知道别名是否创建成功,可以这样调用这个函数。
New-AliasSafe -Name wo -Value Write-Output -Verbose
【讨论】: