2013-03-30 32 views
2

我正在创建一个MS DOS批处理脚本,它需要列出当前目录中的每个.bat文件,但不会显示autoexec.bat或其他应用程序或系统.bat文件,这些文件不应该由用户运行。如何从MS DOS目录列表中排除特定文件名?

我现在有DIR "*.bat" /B /P

这适当列出所有.bat文件,但它显示的autoexec.bat。我将如何从列表中排除该内容?同样稍微重要的是,我怎样才能切断文件扩展名并显示超过7个字符的DOS限制文件?

限制:我无法使用WinME以上的DOS版本。这是我使用的版本。

感谢您的任何帮助。

编辑: 有大量的有关执行此操作在互联网上的信息,但它是所有在Windows命令处理器, MS DOS。请理解,DOS和命令提示符不是一回事。

回答

7

编辑几点说明添加

批处理文件的处理速度很慢,所以你应该使用的技术,它允许一个批处理文件来运行得更快。例如:

  • 尝试使用最小行数/命令来达到某个结果。尽量避免使用外部命令(* .exe文件),如find,findstr,fc等,特别是如果它们处理少量数据;改用if命令。使用for %%a in (*.bat)...代替for /F %%a in ('dir /B *.bat')...。第二种方法需要在for命令可以处理其行之前执行cmd.exe并将其输出存储在文件中。
  • 避免使用管道并改用重定向。管道需要执行两个cmd.exe副本来处理管道每一侧的命令。
  • 一个简单的方法来检查变量是否包含给定的字符串试图从变量中删除字符串:如果结果是不同那么该字符串存在于变量:if "!variable:%string%=!" neq "%variable%" echo The string is in the variable
  • 以前的方法也可用于检查变量是否有任何值的列表:set list=one two three,if "!list:%variable%=!" neq "%list%" echo The variable have one value from the list。如果列表的值可能有空格,则必须用另一个分隔符分隔。

编辑新版本中添加的答案新的评论

最简单的方法,在一次暂停一个页面是使用more过滤器是这样的:

theBatchFile | more 

然而,程序必须对输出进行重新排序以便以列显示。下面的新版本实现了这两件事,所以它不需要more过滤器;你只需要设置每页所需的列数和行数。

@echo off 
setlocal EnableDelayedExpansion 
rem Add more names separated with slashes here: 
set exclude=/autoexec/ 
rem Set the first two next variables as desired: 
set /A columns=5, rows=41, wide=(80-columns)/columns, col=0, row=0 
rem Create filling spaces to align columns 
set spaces= 
for /L %%a in (1,1,%wide%) do set spaces= !spaces! 
set line= 
for %%a in (*.bat) do (
    if "!exclude:/%%~Na/=!" equ "%exclude%" (
     rem If this column is less than the limit... 
     set /A col+=1 
     if !col! lss %columns% (
     rem ... add it to current line 
     set name=%%~Na%spaces% 
     set "line=!line!!name:~0,%wide%! " 
    ) else (
     rem ... show current line and reset it 
     set name=%%~Na 
     echo !line!!name:~0,%wide%! 
     set line= 
     set /a col=0, row+=1 
     rem If this row is equal to the limit... 
     if !row! equ %rows% (
      rem ...do a pause and reset row 
      pause 
      set row=0 
     ) 
    ) 
    ) 
) 
rem Show last line, if any 
if defined line echo %line% 

安东尼

这里
+0

请添加一些信息和解释,这将有利于OP和其他有类似问题的人。截至目前,这个答案只是一个代码块,可能会解决本地化问题的解决方案,但不适用于未来类似的问题。 – jeremy

+0

+1,非常好&有用! – Endoro

+0

我现在无法测试你的代码,但它看起来很有希望!我会尽快批准您的答案,以便我确认它可行。谢谢! –

1
DIR "*.bat" /B /P | find /v "autoexec" | for %i in (*.bat) do @echo %~ni 
+0

小问题,我无法找到我的ME DOS安装了 “FIND.EXE” 实用工具。然而,我发现了很多不正确的版本。 –

+0

除非你严重损坏你的操作系统,FIND.EXE是一个MS-DOS系统命令http://en.wikipedia.org/wiki/List_of_MS-DOS_commands,它应该在Windows System32目录中,例如:C:\ Windows \ System32如果你找不到它,可能是你应该修复你的操作系统安装 –

+1

MS DOS没有内置Find.exe。它是一个外部程序,并且是完全可选的。看起来,使用find.exe变得不再需要了,因为其他代码可以完全做到这一点。无论如何,它不再包含在DOS ME启动盘中,即使是那些包含所有实用程序的盘。在更现代的dos安装中,那些旧程序的负载无处可寻。 –

2
attrib +h autoexec.bat 

应该隐藏AUTOEXEC.BAT并因此不应出现在列表中

+0

这没有奏效。如果我没有添加代码,我仍然可以得到完全相同的结果。这在使用Windows控制台进行测试时也是可见的。 –

+0

它适合我。只需要一种方法来轻松地从处理中排除1个文件。就像这种排除文件的方式一样,完美的文件很少。 – erm3nda

0

使用for来处理每个单独的文件名:

setlocal enabledelayedexpansion 
for /f %%i in ('dir "*.bat" /b') do (
    set system=0 
    if "%%i"=="autoexec.bat" set system=1 
    if "%%i"=="somesystem.bat" set system=1 
    if !system!==0 echo %%i 
) 

另一种方法不变量:

for /f %%i in ('dir "*.bat" /b') do call :test %%i 
goto continue 
    :test 
    if "%1"=="autoexec.bat" goto :eof 
    if "%1"=="somesystem.bat" goto :eof 
    echo %1 
    goto :eof 
:continue 

对于这两者,您可以添加新的文件名以从列表中排除。

+0

这将打印出文件夹中每个文件的所有批处理文本以及第一个文件名。绝对不行。 –

相关问题