【问题标题】:Expand and shorten file path of current cmd [closed]扩展和缩短当前cmd的文件路径[关闭]
【发布时间】:2016-03-26 22:39:02
【问题描述】:

我在网上找不到任何关于此的信息。例如,当我在 C:\PROGRA~1> 时,我想将其扩展为 C:\Program Files>。我也想换个方式,当我在C:\Program Files> 时,将其缩短为C:\PROGRA~1>。请注意,我说的是 cmd,当我在 cmd 中浏览文件和文件夹时,而不是在批处理文件中。

【问题讨论】:

  • 这听起来有点像XY problem。此外,当您说“我说的是 cmd... 不在批处理文件中”时,表示这个问题可能更适合 SuperUser。
  • 如果您不想要批处理文件解决方案,请不要将批处理文件添加为标签。鉴于这个限制,rojo 是正确的,这个问题属于超级用户。
  • 第一次进入目录时是cd'ing到“C:\PROGRA~1”还是“C:\Program Files”?
  • 我猜放批处理标签是错误的。我不想更改目录或列出其中的文件。我只想改变当前路径的显示方式。将C:\PROGRA~1> 更改为C:\Program Files> 并返回,仅此而已。

标签: cmd windows-xp


【解决方案1】:

我能想到的最接近的事情是

cd "\Program Files"
for %I in (.) do @echo %~sI

以短名称格式显示当前目录。我认为没有本地 cmd-interpreter 方式来扩展短路径名,但您可以从 cmd 控制台滥用 PowerShell。

cd \PROGRA~1
powershell "(pwd).path"

要获取包含短目录名称的目录列表,请使用dir /X

【讨论】:

  • powershell 的绝妙技巧。纯批处理很难获得完整/长路径,但有可能。检查 dbenham 的回答 here
【解决方案2】:

没有任何具有指定行为的本机命令。

提示根据到达当前活动目录的方式显示当前路径。更改为短表示是一项简单的任务(您只需要一个for 命令来检索短名称),但更改为长表示需要一个完整路径,其中路径中的每个文件夹都以其长形式存在。

您可以在路径中的某处包含一个批处理文件(以便于调用)来处理任务。类似的东西(调用时更改short <-> long

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem check if short and long references to current directory do not match
    for /d %%x in (".") do if /i not "%%~sx"=="%%~fx" (
        endlocal 
        echo Changing to short path 
        cd "%%~sx"
        goto :eof
    ) else (
        rem Retrieve current active directory information for later use
        set "fullPath=%%~dx"
        set "folders=%%~fx"
    )

    rem Prepare to enumerate folders from top to bottom.
    rem For each of the levels, we will use a wildcard on the short name.
    rem The wildcard expansion will retrieve the long name of this level.
    rem The rest is just folder names concatenation and delayed expansion
    rem enable/disable to avoid problems with folders containing 
    rem "!" in their names.

    set "folders=%folders:*\=%"
    setlocal enabledelayedexpansion
    for %%a in ("!folders:\=" "!") do for %%f in ("!fullPath!") do (
        endlocal
        rem Use a wildcard to search a folder matching the current level
        for /d %%c in ("%%~f\%%~a?") do if /i "%%~snxc"=="%%~a" (
            rem Matching folder found. Save its long name
            setlocal enabledelayedexpansion
            for %%d in ("!fullPath!") do (
                endlocal
                set "fullPath=%%~d\%%~nxc"
            )
        )
        setlocal enabledelayedexpansion
    )
    endlocal

    rem Search done. Check if a directory change is needed
    for /d %%a in (".") do for /d %%b in ("%fullPath%") do if not "%%~fa"=="%%~fb" (
        endlocal
        echo Changing to long path 
        cd "%fullPath%"
    )

【讨论】:

    【解决方案3】:

    我不完全理解你的问题。如果您想控制路径出现在cmd 中的方式,其中一个选项是使用prompt。例如,如果您想隐藏整个路径,而只希望出现 >,您可以执行以下操作

    prompt $g

    结果是

    C:\Users\XXXXXX\Desktop\XXXXX>prompt $g
    >
    

    要显示当前文件夹的路径,请使用prompt $n。对于所有选项,您可以将列表打印为prompt /?

    【讨论】:

      猜你喜欢
      • 2016-12-06
      • 2020-06-07
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多