【发布时间】:2016-07-31 07:21:00
【问题描述】:
我在将批处理脚本中的短文件名 (SFN) 传递给仅将 8.3 短文件名作为命令行参数的旧程序时遇到问题。我在 cmd.exe 提示符下进行了一些测试,这是输出以找出导致问题的原因:
> dir /x *.vi
Volume in drive C is DSK_C
Volume Serial Number is FC79-4140
Directory of c:\Documents and Settings
08/04/2016 10:48 211 Z12TXT~1.VI z12.TXT.vi
08/04/2016 10:48 211 Z123TX~1.VI z123.TXT.vi
2 File(s) 422 bytes
0 Dir(s) 3,599,233,024 bytes free
> for /F "usebackq tokens=* delims=&" %A in (`echo "c:\Documents and Settings\z1
23.TXT.vi"`) do @echo "result=%~sfA"
"result=c:\DOCUME~1\Z123TX~1.VI"
> for /F "usebackq tokens=* delims=&" %A in (`echo "c:\Documents and Settings\z1
2.TXT.vi"`) do @echo "result=%~sfA"
"result=c:\DOCUME~1\Z12TXT~1.VIgs\z12.TXT.vi"
在最后一个命令输出中result=c:\DOCUME~1\Z12TXT~1.VIgs\z12.TXT.vi 应该是result=c:\DOCUME~1\Z12TX~1.VI。我尝试了各种组合,例如添加delims,但除了将dir 输出刮到var 之外找不到解决方案。看起来如果文件名小于或等于 7 个字符(%~nA 部分)并包含句点,则 %~sfA 或 %~snxA 的结果不正确。是这样吗?还有其他更简单的解决方案吗?
4 月 12 日编辑:
只是为了澄清路径不是问题,但在上面的示例中,%~sfA 路径已损坏,但 %~sdpA 将是 c:\DOCUME~1\Z12TXT~1.VI\
【问题讨论】:
-
.在文件名中是合法的。只有最后一个.之后的部分是扩展名。 -
我没有说这是非法的,我说这是合法的。
-
它说这是正常的。
-
@Noodles 我正在测试的程序在传递参数
z12.TXT.vi失败(即LFN)时,传递Z12TXT~1.VI有效(即SFN)。例如,如果您考虑运行不允许您创建符合 8.3 的文件名z12.TXT.vi的 MS-DOS 操作系统,您将需要删除.并创建Z12TXT~1.VI。z12.TXT.vi不是 SFN,请参阅 en.wikipedia.org/wiki/8.3_filename。 -
@Noodles 问题在于对象是生成一个适合输入到需要 8.3 格式的过程的 SFN,其中
.不是有效字符,除非作为名称和扩展名之间的分隔符.