Удалите псевдоним в script
Я могу удалить псевдоним, например:
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.
Однако, если я поместил то же самое в script,
PS > cat wget.ps1
Remove-Item Alias:wget
wget
дает неожиданный результат
cmdlet Invoke-WebRequest at command pipeline position 1
Supply values for the following parameters:
Uri:
Ответы
Ответ 1
Кажется, что работает
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
Ответ 2
Причиной этого является область действия...
Существует четыре области: локальный, script, закрытый и глобальный
Правила для переменных, функций и псевдонимов говорят, что если они не определены в текущей области, то PowerShell будет искать родительские области.
Значение по умолчанию для псевдонима устанавливается на allscope, что делает его видимым из любых дочерних областей, а также они наследуются в любую новую область содержимого (я думаю, что это было бы справедливое определение).
Get-Alias -Name wget | select Name,options
Name Options
wget AllScope
Как только вы удалите псевдоним, который является областью script (область 0), он затем найдет псевдоним из глобальной/родительской области (область 1).
Когда вы укажете источник источника, вы просто говорите, что запускаете script в области вызова/глобальной области, в первую очередь, поэтому вы удаляете глобальный псевдоним по умолчанию.
Попробуйте эти...
Например, # 1.
1.1) Удалите псевдоним из глобальной области.
Remove-Item -Path Alias:\wget
1.2) Создайте новую (глобальную область) и сделайте ее закрытой.
New-Alias -Name wget -Value dir -Scope private
1.3) Теперь псевдоним не отображается из вложенной области.
Поэтому попробуйте запустить script, и он не будет найден.
Например, # 2.
2.1) Удалите псевдоним из глобальной области. Remove-Item -Path Alias:\wget
2.2) Создайте новый и сделайте его AllScope
New-Alias -Name wget -Value dir -Option AllScope
2.3) Теперь запустите ваш script, и он будет работать нормально (используя новый псевдоним из родительской области)
Вы можете попробовать то же самое с переменными. Они должны быть более легкими для демонстрации (и игры с ними), поскольку вы можете более легко играть с параметром области, когда используете New/Get/Set/Remove -scope 1 или область 0 или используйте модификаторы области видимости, например $global: а.
Get-Command -Noun variable -ParameterName scope
Ответ 3
Похоже, что при запуске script из консоли PowerShell он наследует диск псевдонима из этого сеанса. Поэтому, если wget работает, и если это не так. Если вместо этого вы запускаете script в новом процессе, его обычно удаляют.
Вот код, который я использовал для своей демонстрации:
Remove-Item -Path Alias:\wget -Force
wget
Start-Sleep -Seconds 100
Запуск сна будет немедленно закрывать консоль. Попробуйте запустить этот script в новом процессе. Я использовал приглашение запуска и сам PowerShell, набрав `powershell.exe -file pathtoscript '
Ответ 4
Очевидно, что некоторые из других ответов находятся на пути и идентифицируют тот факт, что псевдоним присутствует в нескольких областях.
Но если вы пытаетесь вызвать wget.exe, а не Invoke-WebRequest (или wget.ps1) в некотором script, самым простым ответом может быть установка расширения .exe на имя команды, когда вы вызовите его. Таким образом, вам не нужно возиться с псевдонимами.