Windows 当路径包含空格时,如何使用通配符从MS DOS批处理文件中删除多个文件?
假设我有一个包含以下文件的目录: 测试蝙蝠 Test_a.txt Test_b.txt Test_v1.zip Test_v2.zip Test_v3.zip 我想安静地删除所有Windows 当路径包含空格时,如何使用通配符从MS DOS批处理文件中删除多个文件?,windows,batch-file,filepath,Windows,Batch File,Filepath,假设我有一个包含以下文件的目录: 测试蝙蝠 Test_a.txt Test_b.txt Test_v1.zip Test_v2.zip Test_v3.zip 我想安静地删除所有Test\u v*.zip(屏幕上没有记录错误消息)。我可以通过以下脚本实现这一点: @ECHO OFF SET OLD_ZIPS=^ C:\Tmp\Test_v*.txt;^ C:\Tmp\Test_a.txt ECHO Deleting the following files: %OLD_ZIPS% FOR %%
Test\u v*.zip
(屏幕上没有记录错误消息)。我可以通过以下脚本实现这一点:
@ECHO OFF
SET OLD_ZIPS=^
C:\Tmp\Test_v*.txt;^
C:\Tmp\Test_a.txt
ECHO Deleting the following files: %OLD_ZIPS%
FOR %%Y IN (%OLD_ZIPS%) DO (
IF EXIST %%Y (
ECHO Deleting %%Y
DEL /Q %%Y)
)
PAUSE
这很好:
Deleting the following files: C:\Tmp\Test_v*.txt;C:\Tmp\Test_a.txt
Deleting "C:\Tmp\Test_v1.txt"
Deleting "C:\Tmp\Test_v2.txt"
Deleting "C:\Tmp\Test_a.txt"
Press any key to continue . . .
当然,除非文件路径包含空格。因此,在上面的示例中,如果我将C:\Tmp\Test\u v*.txt
更改为C:\Tmp with spaces\Test\u v*.txt
,我会得到:
Deleting the following files: C:\Tmp test\Test_v*.txt;C:\Tmp test\Test_a.txt
Press any key to continue . . .
我怎样才能阻止它在停车场停车
编辑-我已经按照Alex K的答案尝试了空格(再加上一点调试),看起来for循环并没有像我预期的那样将事情分割开来:
@ECHO OFF
SET OLD_ZIPS=^
C:\Tmp test\Test_v*.txt;^
C:\Tmp test\Test_a.txt
ECHO Deleting the following files: %OLD_ZIPS%
FOR %%Y IN (%OLD_ZIPS%) DO (
ECHO Checking existance of "%%Y"
IF EXIST "%%Y" (
ECHO Deleting "%%Y"
DEL /Q "%%Y")
)
PAUSE
…给了我:
Deleting the following files: C:\Tmp test\Test_v*.txt;C:\Tmp test\Test_a.txt
Checking existance of "C:\Tmp"
Checking existance of "C:\Tmp"
Checking existance of "test\Test_a.txt"
奇怪的是,这似乎奏效了。我已将我的版本编辑为与您的版本相似,因此请尝试修改任何语法错误;-)
该函数需要分别在每一行上循环,因此需要在FOR循环中引用变量,在分号上标记它,冲洗并重复
@ECHO OFF
SET OLD_ZIPS=^
C:\tmp with spaces\Test_v*.txt;^
C:\tmp\Test_a.txt
ECHO Deleting the following files: %OLD_ZIPS%
:deleteFiles
for /f "tokens=1* delims=;" %%A in ("%OLD_ZIPS%") do (
ECHO Checking existance of "%%A"
IF EXIST "%%A" (
ECHO Deleting "%%A"
DEL /Q "%%A"
)
set OLD_ZIPS=%%B
)
if not "%OLD_ZIPS%" == "" goto :deleteFiles
PAUSE
看来你想把事情复杂化
for %a in ("C:\Tmp with spaces\Test_v*.txt" "C:\Tmp\Test_a.txt") do del /q "%a"
执行您想要的操作,并且可以从命令行键入。如果要在批处理文件中执行,请将%a更改为%%a干得好;那真是太棒了!我尝试了tokens/delims位,但我使用的是
tokens=*
,没有得到正确的答案。它确实有效。我错贴了你的路径,没有空间。我测试时机器上的路径有空格。是路径上的引号对空格产生了影响。但是,它似乎不能直接在ZIPS=之后使用^。我现在已经更新了路径。我得到:删除以下文件:“C:\Tmp test\test\u v*.txt”;“C:\Tmp test\test_a.txt”;删除C:\Tmp test\test\u v1.txt系统找不到指定的文件。删除C:\Tmp test\test\u v2.txt系统找不到指定的文件。删除“C:\Tmp test\test_a.txt”
和test_v1.txt
和test_v2.txt
都不会被删除。我在Windows7上运行,如果这有什么不同?
for %a in ("C:\Tmp with spaces\Test_v*.txt" "C:\Tmp\Test_a.txt") do del /q "%a"