在 Windows CMD.EXE 中,我将提示字符串设置为$P$G
,因此,如果我当前的工作目录是
C:\Some\long\folder\inner
我的提示是这样的:
C:\Some\long\folder\inner>
我希望它只显示最后一个(最低级别)文件夹名称,如下所示:
inner>
其中“inner”只是最内层文件夹的名称,它应该自动更改为我当前所在目录的最内层文件夹——相当于在 在 bash 提示符下仅显示当前目录名称(不是完整路径)。 我怎样才能做到这一点?
答案1
如果您愿意稍微改变一下自己的习惯,这里有一个解决方法。
首先,在 PATH 中选择一个可以写入的目录。假设您在自己的机器上,并且拥有管理员权限,则可以使用\Windows
或。但最好使用 之类的东西。(如果您还没有将其添加到 PATH 中,请将其添加到 PATH 中。)\Program Files\something
\Users\username\bin
然后在那里创建一个名为的文件CH.BAT
,或类似的文件,其内容如下:
@echo off
REM Pass the argument(s) to the real "cd". If it fails, don't do anything else.
cd %* || exit /b
REM Get our current directory name.
set "dirname=%CD%"
:loop
REM Strip off one directory level -- remove everything through the first \.
set "remove_one=%dirname:*\=%"
REM If there's nothing left, that means dirname ENDS with a \.
REM The only (?) way this can happen is if it is the root directory
REM of a filesystem (partition), e.g., C:\.
REM In this case, set the prompt to the normal thing, C:\>.
if "%remove_one%" == "" goto exit_loop
REM If "%remove_one%" == "%dirname%", that means we are down to
REM the last directory name (i.e., there are no backslashes left).
if "%remove_one%" == "%dirname%" goto exit_loop
set "dirname=%remove_one%"
REM Keep on removing levels until we get to the bottom.
goto loop
:exit_loop
REM To handle the case where a directory name contains dollar sign(s)
REM (e.g., $P$G), replace each $ with $$ to remove its special meaning
REM in the prompt, and just display a $.
set "dirname=%dirname:$=$$%"
prompt %dirname%$G
然后养成输入ch
而不是 的习惯cd
(或者chdir
,如果你年龄足够大,能够记住它的原始名称(仍然受支持))。我相信评论解释得相当好,但概括一下:
- 调用
cd
命令行参数。如果失败,则退出脚本。 - 使用变量替换 ( ) 来去除目录级别。循环直到没有剩余操作。如果当前目录是根目录(例如 ),则提示将是 (因为您没有指定如何处理这种情况)。如果是类似 的内容,您将获得,如所要求的。
%varname:old=new%
C:\
C:\>
C:\top\outer\middle\inner
inner>
- 我们知道,美元符号在提示符中很特殊。但它们在目录名称中是合法的。您可以通过将美元符号加倍来转义提示符中的美元符号;也就是说,如果您
$$
在提示符中输入美元符号,它将显示为$
。因此,我们将目录名称中的所有美元符号替换为,以$$
使它们正确显示。 - 脚本将当前目录名称硬编码到提示字符串中,因此,如果您随后意外输入
cd
而不是ch
,您的提示不会改变。如果发生这种情况,只需输入ch
(或 )即可根据新的当前目录设置提示。ch .
- 如果您想查看当前目录的完整路径名,请键入
cd
(或echo %CD%
)。 - 我已经用包含空格(和美元符号)的目录名测试过,但我还没有测试过所有合法字符。如果您发现问题,请告诉我。
CD.BAT
当然,将脚本命名为或是没有用的CHDIR.BAT
,因为 CMD.EXE 总是将cd
和 解释chdir
为“更改目录”内置命令。您可以通过键入其路径名来运行此类脚本,但显然(从工作流角度来看)将其作为 的覆盖/替换是不可行的 cd
。