【问题标题】:get short file name when LFN name has two extensions当 LFN 名称有两个扩展名时获取短文件名
【发布时间】: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.VIz12.TXT.vi 不是 SFN,请参阅 en.wikipedia.org/wiki/8.3_filename
  • @Noodles 问题在于对象是生成一个适合输入到需要 8.3 格式的过程的 SFN,其中 . 不是有效字符,除非作为名称和扩展名之间的分隔符.

标签: batch-file windows-xp-sp3


【解决方案1】:
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "parent=%sourcedir%\"
CALL :resolvedir
for /F "tokens=4delims= " %%A in ('
dir /x /a-d "%sourcedir%\*.vi"^|FINDstr /e /i /L ".vi"
') do echo "result=%parent%%resultd%%%A"


GOTO :EOF

:resolvedir
SET "resultd="
:rdloop
FOR %%J IN ("%parent:~0,-1%") DO (
 FOR /f "tokens=1*delims=\" %%G IN ("%parent%") DO IF "%%H"=="" (
  GOTO :eof
 ) ELSE (
  FOR /F "tokens=1*delims=>" %%A IN ('dir /ad /x "%parent%\.."') DO (
   IF "%%B" neq "" FOR /f "tokens=1*delims= " %%D IN ("%%B") DO (
    IF /i "%%D"=="%%~nxJ" SET "resultd=%%D\%resultd%"&SET "parent=%%~dpJ"
    IF /i "%%E"=="%%~nxJ" SET "resultd=%%D\%resultd%"&SET "parent=%%~dpJ"
   )
  )
 )
)

GOTO rdloop

您需要更改sourcedir 的设置以适应您的情况。

我假设源目录是包含驱动器号的完整路径名。毫无疑问,这将显示出对某些字符(如通常的嫌疑人)的敏感性,但将名称保留为长纯字母和空格以及漂亮字符,一切都应该很好。


如果不需要将目录名解析为short,那么上面的简化为

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
for /F "tokens=4delims= " %%A in ('
dir /x /a-d "%sourcedir%\*.vi"^|FINDstr /e /i /L ".vi"
') do echo "result=%%A"

sourcedir 的设置和使用仅用于测试目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2023-04-08
    相关资源
    最近更新 更多