批量解析所有拖拽文件删除带有和没有空格的目录

时间:2014-01-21 20:10:47

标签: batch-file

我有一个非常简单的脚本,需要一个拖放文件夹并递归写入所有文件名并打开文件:

set File=aTextfile.txt

  for /f "tokens=* delims=" %%a in ('dir %1  /s /b') do (
    echo %%a >> "%File%"    
  )

aTextfile.txt

现在我注意到一些奇怪的行为。 如果我从一个文件夹中拖动,该文件夹以某种方式在其filesname中有()或者是一个带有()的子文件夹,就像 我:(ABC) 我:(ABC)\高清 作为丢弃的文件夹,它将停止工作。 将%1替换为“%1”可以使它再次工作。但奇怪的是,它不适用于其他一些文件名。

让我们用%1 A.bat和“%1”B.bat调用代码。

一些快速测试用例让我了解了这些行为:

I:(ABC)

I:(ABC)\ DEF

I:(ABC)(ABC)

I:[ABC](ABC)

I:[ABC] \ DEF

不适用于A,但适用于B

我:\ abc def

我:(abc)\ abc def

我:[abc] \ abc def

适用于A,但不适用于B

I:\ ABCDEF

I:[ABC] \ DEF 适用于

因此,行为似乎主要与()和空格有关。是否有一些优雅的方式,所以这种行为不会出现?

我首先考虑检查拖动的根文件夹字符串中的空格(看起来像我看起来像子字符串检查一样令人讨厌),并在循环之前添加“”,但因为它也发生在带有子文件夹的循环内,它不会真的有帮助。

1 个答案:

答案 0 :(得分:1)

我尝试使用下面的代码,它适用于名为aa(){} []的文件.txt(在Windows7上) 结果文件包含

> "C:\Temp\ (s)s{s}d[r]\ r[t]y{u}d(e)\ d(){}[].txt"

我用双引号目录名参数和echo文本括起来。

set File=aTextfile.txt
for /f "delims=" %%a in ('dir "%~1" /a-d /s /b') do (
    if "%%~xa" NEQ ".txt"  if "%%~xa" NEQ ".dox"  if "%%~xa" NEQ ".bat" (
       >> "%File%" echo "%%a"
    )
)