有没有办法覆盖 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 ~
问题
我试图在 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 ~