字母范围的批处理文件递归,避免奇怪的短名称选择

Batch file recursion for a letter range, avoiding weird shortname selections

我的代码

for %f in (c:\mPodcasts\ipod\s*.lnk c:\mPodcasts\ipod\ta*.lnk c:\mPodcasts\ipod\te*.lnk c:\mPodcasts\ipod\tha*.lnk) do echo %f

意外地获取了一些短名称文件(例如,john batchelor show - xyz 是 THA1ED~1.lnk)。

此处讨论: Strange Windows DIR command behavior

我宁愿不全面禁用短名称。 我尝试预先为目录列表构建一个 .txt 文件,但是 dir * | findstr /r ^tha 似乎忽略了插入符,并找到任何包含 tha 的文件名。

我愿意接受其他只会根据长文件名给出结果的解决方案。

你的想法?

感谢

我建议在批处理文件中使用:

@echo off
pushd "C:\mPodcasts\ipod"
for /F "eol=| delims=" %%I in ('dir s*.lnk ta*.lnk te*.lnk tha*.lnk /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /L "s ta te tha"') do echo %%I
popd

DIR 输出长文件名或短文件名与通配符模式之一匹配的那些文件的长文件名。

FINDSTR 运行 不区分大小写的文字 搜索,只输出那些行(长文件名) beginningstatetha。 space 字符被 FINDSTR 解释为 OR 运算符,除了 /C: 被放在搜索字符串的左侧(并且多个 /C: 用于查找指定搜索字符串之一匹配的行)。

要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • popd /?
  • pushd /?

在无法测试的情况下,我相信使用 where 命令,(Windows Vista 起),应该忽略那些 8.3 文件名:

@For /F "EOL=| Delims=" %%G In ('%__AppDir__%where.exe^
     C:\mPodcasts\ipod:s*.lnk^
     C:\mPodcasts\ipod:ta*.lnk^
     C:\mPodcasts\ipod:te*.lnk^
     C:\mPodcasts\ipod:tha*.lnk^
     2^>NUL') Do @Echo %%G
@Pause

就您提供的信息而言,以上内容无需修改即可使用。但是,如果您的目录或文件模式包含空格、有问题的字符,您也可以根据需要将它们加双引号:

@For /F "EOL=| Delims=" %%G In ('%__AppDir__%where.exe^
     "C:\mPodcasts\ipod":"s*.lnk"^
     "C:\mPodcasts\ipod":"ta*.lnk"^
     "C:\mPodcasts\ipod":"te*.lnk"^
     "C:\mPodcasts\ipod":"tha*.lnk"^
     2^>NUL') Do @Echo %%G
@Pause

希望对您有所帮助。

顺便说一句,此解决方案还解决了上面 post 中 the question you linked 中提到的其他问题。 where 命令不输出扩展名 'beginning with',它正确匹配它。以链接的'discussion'问题为基础,*.htm只匹配.htm扩展,(不包括.html,以及*.man 不匹配 .manifest 个扩展名。

如果您想直接在 cmd.exe window 中测试输出,那么这里是单行版本:

For /F "EOL=| Delims=" %G In ('%__AppDir__%where.exe C:\mPodcasts\ipod:s*.lnk C:\mPodcasts\ipod:ta*.lnk C:\mPodcasts\ipod:te*.lnk C:\mPodcasts\ipod:tha*.lnk 2^>NUL') Do @Echo %G