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



我的代码

for %f in (c:mPodcastsipods*.lnk c:mPodcastsipodta*.lnk c:mPodcastsipodte*.lnk c:mPodcastsipodtha*.lnk) do echo %f

意外地获取了许多短名称文件(例如,john batchelor show-xyz,它是THAAED~1.lnk(。

此处对此进行了讨论:奇怪的Windows DIR命令行为

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

我对其他只会根据长文件名给出结果的解决方案持开放态度。

你的想法?

Thx

由于无法进行测试,我认为使用where命令(Windows Vista以后的版本(应该忽略这些8.3文件名:

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

就您提供的信息而言,上述内容应在不作修改的情况下有效。但是,如果您的目录或文件模式包含空格、有问题的字符,您也可以根据需要对它们进行双引号:

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

我希望这能有所帮助。

顺便说一句,这个解决方案还解决了你在上面的帖子中链接的问题中提到的其他问题。where命令不输出扩展名"以"开头,它正确匹配它。以链接的"讨论"问题为基础,*.htm只匹配.htm扩展名,(不包括.html(*.man不匹配.manifest扩展名。

如果您希望直接在cmd.exe窗口中测试输出,那么下面是单行版本:

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

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

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

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

FINDSTR运行不区分大小写的文本搜索,该搜索仅输出以statetha开头的行(长文件名(。FINDSTR将空格字符解释为OR运算符,但/C:放在搜索字符串的左侧(多个/C:用于查找指定搜索字符串之一匹配的行(除外。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并完整仔细地阅读每个命令显示的帮助页。

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

最新更新