Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何将默认位置设置为从profile.ps1开始?_Powershell_Powershell 5.0 - Fatal编程技术网

Powershell 如何将默认位置设置为从profile.ps1开始?

Powershell 如何将默认位置设置为从profile.ps1开始?,powershell,powershell-5.0,Powershell,Powershell 5.0,我的D:\Documents\WindowsPowerShell\profile.ps1profile文件中有以下行: Set-Location $env:HOMEDRIVE 值得注意的是,$env:HOMEDRIVE等于C:。预期的行为是,每当我打开PS shell时,我都会被放入C:,但这不是我得到的,而是我被放入$env:HOMEPATH,它等于C:\Users\ 为什么会出现这种行为以及如何“修复” 有关我的PS版本的信息: PS C:\Users\...> $PSVersio

我的
D:\Documents\WindowsPowerShell\profile.ps1
profile文件中有以下行:

Set-Location $env:HOMEDRIVE
值得注意的是,
$env:HOMEDRIVE
等于
C:
。预期的行为是,每当我打开PS shell时,我都会被放入
C:
,但这不是我得到的,而是我被放入
$env:HOMEPATH
,它等于
C:\Users\

为什么会出现这种行为以及如何“修复”


有关我的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 '\')

测试。我把它放在我的
档案中。ps1

Set-Location $env:HOMEDRIVE
Write-Host $env:HOMEDRIVE
输出

C:
PS C:\Users\<my username>>
C:
PS C:\>
输出

C:
PS C:\Users\<my username>>
C:
PS C:\>
要补充背景信息,请执行以下操作:

Set-Location $env:HOMEDRIVE\ # or, with variable name disambiguated: ${env:HOMEDRIVE}\
动力地狱

Set-Location $env:HOMEDRIVE
相当于
cmd.exe

cd /d %HOMEDRIVE%
  • 也就是说,对环境变量
    HOMEDRIVE
    的引用被替换为其值(扩展)-通常是
    C:
    -并且该驱动器被更改为。请注意,PowerShell不需要模拟
    /d
    开关即可使驱动器更改生效

  • 但是,在这两个shell中,更改为驱动器规范。仅在没有路径组件的情况下,更改为shell认为该驱动器上当前目录的任何内容,该目录可能是根目录,也可能不是根目录

    • 若要更改到特定目录(如根目录),也必须指定其路径
虽然
设置位置(连接路径$env:HOMEDRIVE'\')
是构造和将路径传递到驱动器规范的根目录的一种健壮而通用的方法。存储在环境变量
HOMEDRIVE
中,PowerShell提供了一种更简洁的替代方法

Set-Location $env:HOMEDRIVE\ # or, with variable name disambiguated: ${env:HOMEDRIVE}\
上述方法之所以有效,是因为简单地说,PowerShell隐式地解析字符串参数,就像它们是可扩展字符串一样(带有嵌入变量引用的双引号字符串,甚至命令)

也就是说,上述内容等同于以下所有内容:

Set-Location "$env:HOMEDRIVE\"      # expandable string
Set-Location "${env:HOMEDRIVE}\"    # ditto, variable name disambiguated
Set-Location "$(${env:HOMEDRIVE})\" # $(...) embeds full commands (not necessary here)

除了
连接路径
是连接路径组件的一种更为稳健的方式外,还有与无引号参数方法相关的缺陷,例如无引号参数和双引号参数之间的细微差异(内部空白需要双引号,就像某些shell元字符一样);如果有疑问,请将参数传递给
写入输出
,查看它扩展到什么;有关详细信息,请参阅我的。

我无法在PS 5.1.15063.909上复制它为什么不使用
cd c:\
?@gms0ulman,因为(1)我想要一些可伸缩的东西,
C:
不是我所有系统中的
HOMEDRIVE
,这个
配置文件。ps1
用于家庭和工作中的许多系统,即使它们都是
C:
我在任何代码中都不会使用静态路径,这只是一种糟糕的做法;和(2)我想使用PS语法,
cd
不过是
设置位置的别名
。。。