删除脚本中的别名

时间:2014-06-22 03:00:53

标签: powershell

我可以删除这样的别名:

Remove-Item Alias:wget

然后尝试别名会得到预期的结果:

PS > wget
wget : The term 'wget' is not recognized as the name of a cmdlet, function,
script file, or operable program.

但是,如果我将其放入脚本中,

PS > cat wget.ps1
Remove-Item Alias:wget
wget

它会产生意想不到的结果

cmdlet Invoke-WebRequest at command pipeline position 1
Supply values for the following parameters:
Uri:

4 个答案:

答案 0 :(得分:14)

以下似乎有效

If (Test-Path Alias:wget) {Remove-Item Alias:wget}
If (Test-Path Alias:wget) {Remove-Item Alias:wget}
wget

第一行删除Script级别名,第二行删除Global级别名。请注意,两者都需要进行测试,因为如果Global不存在,则Script尚未创建。

这也是错误的,因为它修改了父母而不是点源。

或者你可以点源你的原件,那将起作用

. .\wget.ps1

答案 1 :(得分:7)

背后的原因是范围 ...

有四个范围:本地,脚本,私有和全局

变量,函数和别名的规则说如果它们没有在当前作用域中定义,那么PowerShell将搜索父作用域。

别名的默认设置设置为allscope,这使得它可以从任何子范围中看到,并且它们也会被继承到任何新的子范围(我认为这将是一个公平的定义)。

Get-Alias -Name wget | select Name,options

Name  Options

wget  AllScope

删除作为脚本范围的别名(范围0)后,它将从全局/父范围(范围1)中找到别名。

当您点源它时,您只是说首先在调用/全局范围内运行脚本,因此默认情况下您将删除全局别名。

试试这些......

E.g#1。


1.1)从全局范围中删除别名。

    Remove-Item -Path Alias:\wget

1.2)创建一个新的(全局范围)并将其设为私有。

    New-Alias -Name wget -Value dir -Scope private

1.3)现在,嵌套作用域中看不到别名。 所以尝试运行脚本,它将无法找到。

E.g#2。


2.1)从全局范围中删除别名。         Remove-Item -Path Alias:\ wget

2.2)创建一个新的并使其成为AllScope

    New-Alias -Name wget -Value dir -Option AllScope

2.3)现在运行您的脚本,它将正常工作(使用父作用域中的新别名dir)

您也可以尝试使用相同的变量。它们应该更容易演示(并且可以使用),因为当您使用New / Get / Set / Remove -scope 1或scope 0或使用范围修饰符时,您可以更轻松地使用scope参数,例如,$ global:一个。

Get-Command -Noun variable -ParameterName scope

答案 2 :(得分:2)

显然,其他一些答案正在进行中,并且已经确定了别名存在于多个范围内的事实。

但是如果您尝试在某些脚本中尝试调用wget.exe而不是Invoke-WebRequest(或wget.ps1),那么最简单的答案可能是放置" .exe"调用命令名时的扩展名。这样你就不必弄乱别名了。

答案 3 :(得分:0)

当您从PowerShell控制台运行脚本时,它会从该会话继承别名驱动器。所以,如果wget在那里它是有效的,如果不是它就失败了。相反,如果您在新进程中运行该脚本,它将被正常删除。

这是我用于演示的代码:

Remove-Item -Path Alias:\wget -Force
wget
Start-Sleep -Seconds 100

启动 - 睡眠将使控制台不立即关闭。尝试在新进程中运行该脚本。我通过输入`powershell.exe -file pathtoscript '

来使用运行提示和PowerShell本身