Есть ли способ переопределить местоположение `~` (тильда) в powershell

Эта проблема

Я пытаюсь изменить расширенный путь символа ~ в 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'.


2
37
1

Ответ:

Решено

Использование функции (через псевдоним) для переопределения ~ в аргументах не может работать (за исключением случаев, когда вызов функции заключен в (...)) по причинам, объясненным в комментарии 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 ~