在Windows命令提示符中,替代用户主目录(~)的方法是什么?

359

我正在尝试使用命令提示符移动一些文件, 我习惯于使用Linux终端,我使用~指定我的主目录 我已经到处找了,但似乎在Windows命令提示符中找不到它(Documents and Settings\[user]


2
这是一个Windows环境变量列表:https://learn.microsoft.com/en-us/windows/deployment/usmt/usmt-recognized-environment-variables - djvg
13个回答

537
你会失望的: %userprofile%。而你可以使用其他终端,比如PowerShell,我相信你可以在XP及更高版本上获得它(并且Win7预装了它),它允许你使用~代表主目录。

4
你可以在这里找到完整的环境变量列表。 - Parampreet Rai
Powershell允许您使用~,但具有讽刺意味的是不允许使用%userprofile%:Set-Location: Cannot find path 'C:\%userprofile%' because it does not exist. - mcalex
5
在PS中,通常这样引用环境变量:$env:userprofilecd $env:userprofile可以正常工作。此外,C:\%userprofile%将始终是无效路径,因为环境变量已经包括了驱动器号。 - binford
我认为PS尝试访问的是C:\%userprofile%,而不是@mcalex键入的内容,此时的工作目录为C:\。 - craig65535
%USERPROFILE% 相当于 %HOMEDRIVE%%HOMEPATH% 看起来是等价的。我测试过了,发现确实如此。 - undefined

63
您可以使用 %HOMEDRIVE%%HOMEPATH% 来表示驱动器,后面加上 \docs settings\username\users\username 表示文档设置或用户目录。

6
这个答案适用于以本地系统帐户运行的服务。在这种情况下,%userprofile% 不起作用。 - DonBecker
值得注意的是,在具有网络文件系统的机器上(例如企业机器),这可能会产生意外的结果。在我的机器上,%userprofile%C:\Users\me,但 %homedrive%%homepath% 指向映射的 U:\ 驱动器的根目录。 - Aaron Christiansen

40

您可以使用%homedrive%%homepath%环境变量来实现此操作。

将这两个命令变量连接在一起,即可得到所需用户的主目录路径,如下所示:

  1. 在命令提示符上运行echo %homedrive%,将会显示:

    C:
    
  2. 在命令提示符下运行echo %homepath%,将显示:

    \Users\<CurrentUserName>
    

%homedrive%%homepath%组合在一起使用,它将产生:

C:\Users\<CurrentUserName>

2
@EdwardFalk 我已经修复了我的回答。我错过了提到%homedrive%的等价物%systemdrive%环境变量。如果您发现任何不正确的地方,请给我反馈。 - RBT
12
在Windows中,您可以将整个用户文件夹移动到另一个驱动器(例如D:\ MyUser)。在这种情况下,“%systemdrive%%homepath%”会失败。应该使用“%HOMEDRIVE%%HOMEPATH%”。 - Daniel Santos
是的。虽然更改这些标准环境变量是可能的,但人们通常不这样做。在通常的企业环境中,这些环境变量由IT部门通过AD组策略进行管理,如此处所述和此处所述。 - RBT
4
通常情况下,它们会给出相同的答案。在不常见的情况下,只有“%HOMEDRIVE%%HOMEPATH%”才是正确的答案。因此,在所有情况下,“%HOMEDRIVE%%HOMEPATH%”都是正确的答案,我建议您相应地更改您的答案。 - Ken Williams
2
我不认为这个答案比Alex的更有价值。 - O'Rooney
显示剩余2条评论

13

更新 - 更好的版本 2019年7月18日。

最终总结,即使我已经转向使用PowerShell进行大多数Windows控制台工作,但我决定解决这个旧的cmd问题,因为今天我必须进入cmd控制台,缺少这个功能真的让我感到困扰。这个新版本也能够使用~作为其他主目录子文件夹的前缀,并将正斜杠替换为反斜杠。所以这就是它:

步骤1.创建这些doskey宏,在每次cmd启动时都会被捕获。

DOSKEY cd=cdtilde.bat $* 
DOSKEY cd~=chdir /D "%USERPROFILE%"
DOSKEY cd..=chdir ..

步骤2. 创建 cdtilde.bat 文件,并将其放置在您的 PATH 中的某个位置。
@echo off

set dirname=""
set dirname=%*
set orig_dirname=%*

:: remove quotes - will re-attach later.
set dirname=%dirname:\"=%
set dirname=%dirname:/"=%
set dirname=%dirname:"=%

:: restore dirnames that contained only "/"
if "%dirname%"=="" set dirname=%orig_dirname:"=%

:: strip trailing slash, if longer than 3
if defined dirname if NOT "%dirname:~3%"==""  (
    if "%dirname:~-1%"=="\" set dirname="%dirname:~0,-1%"
    if "%dirname:~-1%"=="/" set dirname="%dirname:~0,-1%"
)

set dirname=%dirname:"=%

:: if starts with ~, then replace ~ with userprofile path
if %dirname:~0,1%==~ (
    set dirname="%USERPROFILE%%dirname:~1%"
)
set dirname=%dirname:"=%

:: replace forward-slashes with back-slashes
set dirname="%dirname:/=\%"
set dirname=%dirname:"=%

chdir /D "%dirname%"

测试结果良好;

cd ~ (traditional habit)
cd~  (shorthand version)
cd.. (shorthand for going up..)
cd / (eg, root of C:)
cd ~/.config (eg, the .config folder under my home folder)
cd /Program Files (eg, "C:\Program Files")
cd C:/Program Files (eg, "C:\Program Files")
cd \Program Files (eg, "C:\Program Files")
cd C:\Program Files (eg, "C:\Program Files")
cd "C:\Program Files (eg, "C:\Program Files")
cd "C:\Program Files" (eg, "C:\Program Files")

另外,它允许懒惰引用,我发现这很有用,即使文件夹路径名中有空格,因为它将所有参数包装成一个长字符串。这意味着只需一个初始引号也可以工作,或者完全没有引号也可以工作。

现在可以忽略下面的所有其他内容,这是出于历史原因留下的 - 所以我不会再犯同样的错误


旧更新 2018年10月19日。
如果有人尝试了我的方法,我的原始答案无法处理空格,例如以下内容失败。

> cd "c:\Program Files"
Files""]==["~"] was unexpected at this time.

我认为一定有解决方法。如果我能改进我的答案,我会再次发布。(请参见上文,我终于让它按照我想要的方式全部工作了。)


我的原始答案,仍需改进... 2018年10月7日。
我刚刚尝试做这件事,我认为我做到了,这是我认为很好的方法;

首先,使用一些doskey宏;

DOSKEY cd=cdtilde.bat $* 
DOSKEY cd~=chdir /D "%USERPROFILE%"
DOSKEY cd..=chdir ..

然后将一个批处理文件放在我的路径中;

cdtilde.bat

@echo off
if ["%1"]==["~"] ( 
    chdir /D "%USERPROFILE%"
) else ( 
    chdir /D %* 
)

所有这些似乎都运作正常;
cd ~ (traditional habit)
cd~  (shorthand version)
cd.. (shorthand for going up..)

这个答案提供了一种使用类似于.bashrc文件的方式启动CMD的方法: https://superuser.com/questions/144347/is-there-windows-equivalent-to-the-bashrc-file-in-linux。将该答案中的第1步放入`bashrc.bat`文件中,就可以在启动时设置它。 - Brydenr
1
只是为了澄清一下;虽然bash也遵循类似的模式,因此它是“类似于bash”,但没有要求必须使用bash才能实现这一点。我只是使用一个非常古老的DOS技巧,使用Windows注册表。我使用Windows注册表位置“HKCU \ Software \ Microsoft \ Command Processor”,找到字符串键/值“Autorun”,并输入您选择的cmd文件的文件名。例如,我有这个:“C:\ Users \ username \ .autorun.cmd”,您可以将此文件放在任何对您的配置有意义的位置。每次打开dos命令提示符时,Windows都会运行此文件。 - Christopher Plewright
@Brydenr,你提供了一个好的链接,是的,那就是我实现它的方式,没有使用bash,但类似于bash。 - Christopher Plewright

4

我刚刚尝试了 set ~=%userprofile% ,如果你想继续保持相同的习惯,这也是可行的。

然后你可以使用 %~% ,代替原来的命令。


2
你如何准确地将~的值设置为%userprofile%?我在命令提示符中运行了您帖子中提到的确切命令,但它会抛出错误 -“'~'不被识别为内部或外部命令,可执行程序或批处理文件。”。您能否详细说明一下您的答案? - RBT
3
如果你使用 set ~=%userprofile%,那么你就可以使用 %~% 来代表这个变量。 - forresthopkinsa
如果您正在使用PowerShell,请尝试${env:~}="$env:homedrive$env:homepath" - Ken Williams

3
# cmd
# use:  %USERPROFILE%

# example:
kubectl config --kubeconfig=%USERPROFILE%\.kube\config.xyz view

# powershell
# use:  $env:USERPROFILE

# example
kubectl config --kubeconfig=$env:USERPROFILE\.kube\config.xyz view

2
如果您想要一个更简短的版本,可以尝试使用Jay的。
    set usr=%userprofile%
    cd %usr%

如果你愿意的话,甚至可以使用%u%。这样能够省去一些按键的操作。


2
您几乎可以自己完成相同的操作。打开环境变量并在“用户变量”中单击“新建”按钮。
变量名称: ~
变量值: 点击“浏览目录...”按钮,选择您想要的目录。

之后,在cmd中输入以下内容:
cd %~%
它会生效。


2

简单地说

首先定义路径

doskey ~=cd %homepath%

然后访问。
~

1
使用%systemdrive%%homepath%%systemdrive% 给出驱动器字符(大多数情况下是C:),而 %homepath% 给出用户主目录(\Users\<USERNAME>)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接