如何将默认位置设置为在配置文件中启动。ps1?
How to set default location to start in profile.ps1?
我的 D:\Documents\WindowsPowerShell\profile.ps1
配置文件中有以下行:
Set-Location $env:HOMEDRIVE
值得注意的是 $env:HOMEDRIVE
等于 C:
。预期的行为是,每当我打开 PS shell 时,我都会被放入 C:
,但这不是我得到的,而是我被放入 $env:HOMEPATH
,等于 C:\Users\<my username here>
.
为什么会出现这种行为以及如何 "fix"?
关于我的 PS 版本的信息:
PS C:\Users\...> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.14393.2068
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14393.2068
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
将位置设置为没有路径的驱动器盘符(即 C:
)只是切换到该驱动器的位置堆栈,它实际上并没有改变路径。将其更改为:
Set-Location (Join-Path $env:HOMEDRIVE '\')
进行测试。我把这个放在我的 profile.ps1
:
Set-Location $env:HOMEDRIVE
Write-Host $env:HOMEDRIVE
输出
C:
PS C:\Users\<my username>>
分辨率
Set-Location "$($env:HOMEDRIVE)\"
Write-Host $env:HOMEDRIVE
输出
C:
PS C:\>
用背景信息补充 :
PowerShell 的
Set-Location $env:HOMEDRIVE
相当于cmd.exe
的:
cd /d %HOMEDRIVE%
也就是说,对环境变量 HOMEDRIVE
的引用被替换为它的值(扩展)- 通常是 C:
- 而 drive 已 更改为 。请注意 PowerShell 如何 而不是 需要模拟 /d
开关才能使驱动器更改生效。
但是,在两个 shell 中,更改为 驱动器规格。只有 - 没有路径组件 - 更改为 无论 shell 认为当前目录 在该驱动器 上,这可能是也可能不是根目录。
- 为了切换到特定目录 - 例如根目录 - 它的路径也必须指定.
虽然 Set-Location (Join-Path $env:HOMEDRIVE '\')
是构建和 将路径传递到驱动器规格的根目录 的一种健壮且通用的方法。存储在环境变量 HOMEDRIVE
中,PowerShell 提供了一个 更简洁的替代方法 :
Set-Location $env:HOMEDRIVE\ # or, with variable name disambiguated: ${env:HOMEDRIVE}\
上面的方法有效,因为简单地说,PowerShell 隐式解析字符串参数,就好像它们是 可扩展字符串(double-quoted 带有嵌入式变量引用甚至命令的字符串) .
也就是说,以上等价于以下所有内容:
Set-Location "$env:HOMEDRIVE\" # expandable string
Set-Location "${env:HOMEDRIVE}\" # ditto, variable name disambiguated
Set-Location "$(${env:HOMEDRIVE})\" # $(...) embeds full commands (not necessary here)
除了 Join-Path
是一种更可靠的连接路径组件的方法之外,还有 陷阱 与 与 unquoted-argument 方法相关联,例如未引号和 double-quoted 参数之间的细微差别(内部空格 需要 double-quoting,某些 shell 字符也是如此元字符);如有疑问,将参数传递给 Write-Output
以查看它扩展到什么;有关详细信息,请参阅我的 。
我的 D:\Documents\WindowsPowerShell\profile.ps1
配置文件中有以下行:
Set-Location $env:HOMEDRIVE
值得注意的是 $env:HOMEDRIVE
等于 C:
。预期的行为是,每当我打开 PS shell 时,我都会被放入 C:
,但这不是我得到的,而是我被放入 $env:HOMEPATH
,等于 C:\Users\<my username here>
.
为什么会出现这种行为以及如何 "fix"?
关于我的 PS 版本的信息:
PS C:\Users\...> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.14393.2068
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14393.2068
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
将位置设置为没有路径的驱动器盘符(即 C:
)只是切换到该驱动器的位置堆栈,它实际上并没有改变路径。将其更改为:
Set-Location (Join-Path $env:HOMEDRIVE '\')
进行测试。我把这个放在我的 profile.ps1
:
Set-Location $env:HOMEDRIVE
Write-Host $env:HOMEDRIVE
输出
C:
PS C:\Users\<my username>>
分辨率
Set-Location "$($env:HOMEDRIVE)\"
Write-Host $env:HOMEDRIVE
输出
C:
PS C:\>
用背景信息补充
PowerShell 的
Set-Location $env:HOMEDRIVE
相当于cmd.exe
的:
cd /d %HOMEDRIVE%
也就是说,对环境变量
HOMEDRIVE
的引用被替换为它的值(扩展)- 通常是C:
- 而 drive 已 更改为 。请注意 PowerShell 如何 而不是 需要模拟/d
开关才能使驱动器更改生效。但是,在两个 shell 中,更改为 驱动器规格。只有 - 没有路径组件 - 更改为 无论 shell 认为当前目录 在该驱动器 上,这可能是也可能不是根目录。
- 为了切换到特定目录 - 例如根目录 - 它的路径也必须指定.
虽然 Set-Location (Join-Path $env:HOMEDRIVE '\')
是构建和 将路径传递到驱动器规格的根目录 的一种健壮且通用的方法。存储在环境变量 HOMEDRIVE
中,PowerShell 提供了一个 更简洁的替代方法 :
Set-Location $env:HOMEDRIVE\ # or, with variable name disambiguated: ${env:HOMEDRIVE}\
上面的方法有效,因为简单地说,PowerShell 隐式解析字符串参数,就好像它们是 可扩展字符串(double-quoted 带有嵌入式变量引用甚至命令的字符串) .
也就是说,以上等价于以下所有内容:
Set-Location "$env:HOMEDRIVE\" # expandable string
Set-Location "${env:HOMEDRIVE}\" # ditto, variable name disambiguated
Set-Location "$(${env:HOMEDRIVE})\" # $(...) embeds full commands (not necessary here)
除了 Join-Path
是一种更可靠的连接路径组件的方法之外,还有 陷阱 与 与 unquoted-argument 方法相关联,例如未引号和 double-quoted 参数之间的细微差别(内部空格 需要 double-quoting,某些 shell 字符也是如此元字符);如有疑问,将参数传递给 Write-Output
以查看它扩展到什么;有关详细信息,请参阅我的