Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 当路径包含空格时,如何使用通配符从MS DOS批处理文件中删除多个文件?_Windows_Batch File_Filepath - Fatal编程技术网

Windows 当路径包含空格时,如何使用通配符从MS DOS批处理文件中删除多个文件?

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_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 %%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"