Я пытаюсь изменить расширенный путь символа ~
в PowerShell, не меняя переменную $Env:USERPROFILE
.
Мой первоначальный подход состоял в том, чтобы создать псевдоним для функции, которая ссылается на другую переменную среды, но, похоже, это не работает.
Мой код:
function Get-HomeDirectory {
# This is a custom function, it works as I have tested it
# It should be self-explanatory
Get-EnvironmentVariable -Key $HOME_DIR_KEY -User
}
Set-Alias -Name ~ -Value Get-HomeDirectory
Если я использую Get-Help, он работает так, как ожидалось:
PS> Get-Help ~
NAME
Get-HomeDirectory
SYNOPSIS
Returns the home directory of the current user.
SYNTAX
Get-HomeDirectory [<CommonParameters>]
DESCRIPTION
Retrieves the value set for the `$Env:USER_HOME_DIR` environment variable.
RELATED LINKS
Set-HomeDirectory
REMARKS
To see the examples, type: "Get-Help Get-HomeDirectory -Examples"
For more information, type: "Get-Help Get-HomeDirectory -Detailed"
For technical information, type: "Get-Help Get-HomeDirectory -Full"
For online help, type: "Get-Help Get-HomeDirectory -Online"
Но если я попытаюсь использовать его, я получаю:
PS> cd ~
PS> pwd
C:\Users\myuser
Тем не менее, я могу заставить его работать, если я передам его с помощью пайпа (как и должно быть), но это не очень удобный способ его использования:
PS> ~ | cd
PS> pwd
Path
----
B:\
🤔 А знаете ли вы, что...
PowerShell был создан компанией Microsoft в 2006 году и первоначально назывался 'Monad'.
Использование функции (через псевдоним) для переопределения ~
в аргументах не может работать (за исключением случаев, когда вызов функции заключен в (...)
) по причинам, объясненным в комментарии Jeroen Mostert к вашему вопросу.
Существует является решение, хотя обратите внимание, что оно переопределяет значение начального ~
— заполнителя для домашнего местоположения провайдер, которое интерпретируется как таковое только командлетами провайдера — в путях провайдера файловой системы на глобальном уровне сеанса.
# Make the file-system provider use the value of
# env. var. USER_HOME_DIR as its home location.
(Get-PSProvider FileSystem).Home = $Env:USER_HOME_DIR
Примечание:
Изменение вступает в силу только для текущего сеанса; чтобы сделать его постоянным, вам нужно добавить его в свой файл $PROFILE
, но обратите внимание, что загрузку профилей можно обойти с помощью параметра CLI -NoProfile
.
У каждого провайдера есть собственное — потенциально неопределенное — домашнее местоположение. Таким образом, в нетипичном случае, когда поставщиком, лежащим в основе текущего местоположения, является нет поставщик файловой системы, ~
относится к домашнему расположению поставщика тот; надуманный пример:
# !! Fails, because the function provider has no home location defined.
Set-Location Function:; Get-Item ~