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

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

具有命令行参数的batch file按预期工作:

short.bat

@echo OFF echo %~s1 

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

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

作为一个中间步骤,我尝试在batch file中硬编码path,但这不起作用:

short1.bat

 @echo OFF SET filename="C:\Documents and Settings\User\NTUSER.DAT" echo %filename% echo %~sfilename% 

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 /? 

如果short1.bat工作,我怎样才能将其转换成可以用cmd.exe \c ...调用的单行程

还有一个问题( 如何得到DOSpath,而不是Windowspath ),但是那个是特别要求当前目录的path。

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

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

 dir /x filename.txt 

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