使用cmd.exe将长文件名转换为短文件名(8.3)

use*_*007 30 windows command-line batch-file long-filenames short-filenames

我试图在Windows上将长文件名转换为短文件名(8.3).

带有命令行参数的批处理文件按预期工作:

short.bat:

@echo OFF
echo %~s1
Run Code Online (Sandbox Code Playgroud)

调用short.bat C:\Documents and Settings\User\NTUSER.DAT返回C:\DOCUM~1\USER\NTUSER.DAT

但是,我不喜欢为此添加额外的.bat文件.我宁愿cmd.exe用ruby脚本调用整个命令.我怎样才能做到这一点?

作为中间步骤,我尝试对批处理文件中的路径进行硬编码,但这不起作用:

short1.bat:

@echo OFF
SET filename="C:\Documents and Settings\User\NTUSER.DAT"
echo %filename%
echo %~sfilename%
Run Code Online (Sandbox Code Playgroud)

echo %filename%有效,但echo %~sfilename%出现以下错误:

The following usage of the path operator in batch-parameter
substitution is invalid: %~sfilename%

For valid formats type CALL /? or FOR /?
Run Code Online (Sandbox Code Playgroud)

如果short1.bat工作,我如何将其转换为可以调用的单行cmd.exe \c ...

还有另一个问题(如何获取DOS路径而不是Windows路径),但是那个问题是专门询问当前目录的路径.

dbe*_*ham 42

cmd /c for %A in ("C:\Documents and Settings\User\NTUSER.DAT") do @echo %~sA
Run Code Online (Sandbox Code Playgroud)

  • @AKhudairy - 这个问题专门针对使用`cmd/c`的命令行解决方案.在批处理文件中,你必须加倍所有百分比 - 所有你需要的是`for %% A in("some path here\some file.ext")do echo %% ~sA` (2认同)

Rob*_*phy 5

将filename.txt替换为要转换为8.3的文件名

dir /x filename.txt
Run Code Online (Sandbox Code Playgroud)

然后,您将不得不使用空格作为分隔符来分割结果(正则表达式中的\ s)。然后,带有〜的值就是您的短文件名。如果您的文件名开头很短,那么您将找不到包含〜的字符串。