Подтвердить что ты не робот

Удалите псевдоним в 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:
4b9b3361

Ответ 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 на имя команды, когда вы вызовите его. Таким образом, вам не нужно возиться с псевдонимами.