我有一个非常简单的脚本,需要一个拖放文件夹并递归写入所有文件名并打开文件:
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 适用于
因此,行为似乎主要与()和空格有关。是否有一些优雅的方式,所以这种行为不会出现?
我首先考虑检查拖动的根文件夹字符串中的空格(看起来像我看起来像子字符串检查一样令人讨厌),并在循环之前添加“”,但因为它也发生在带有子文件夹的循环内,它不会真的有帮助。
答案 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"
)
)