有没有办法覆盖 powershell 中的`~`(波浪号)位置

Is there a way to override `~` (tilde) location in 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:\

使用函数(通过别名)在参数中重新定义 ~ 无效(除非函数调用包含在 (...) 中),原因在 Jeroen Mostert 对您的评论中解释问题。

一个解决方案,但请注意它重新定义了初始 ~ 的含义 - provider 的家庭位置的占位符仅由提供者 cmdlet 解释 - 在 file-system 提供者路径 session-globally.

# 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 参数绕过配置文件的加载。

  • 每个提供商都有自己的(可能未定义的)家庭位置。因此,在 - 非典型 - 当前位置的提供者是 而不是 file-system 提供者的情况下,~ 指的是 提供者的家庭位置;一个人为的例子:

    # !! Fails, because the function provider has no home location defined. 
    Set-Location Function:; Get-Item ~