我可以删除这样的别名:
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:
答案 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本身