Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Batch file Delete.txt文件不能以命令提示符中的任何字符开头_Batch File_Cmd_Dos_Command Prompt - Fatal编程技术网

Batch file Delete.txt文件不能以命令提示符中的任何字符开头

Batch file Delete.txt文件不能以命令提示符中的任何字符开头,batch-file,cmd,dos,command-prompt,Batch File,Cmd,Dos,Command Prompt,我正在使用下面的代码删除未启动“S”的.txt文件: 但它不起作用 如何做到这一点?这并不漂亮,但你可以: 构造for循环 告诉for对…的输出进行迭代 用/V“S”(不包括S)通过管道查找的文件的裸(/B)目录列表 告诉for对其处理的每个项目调用del。使用/f以避免需要del确认 下面是一个例子: for /f %F in ('dir /B ^| find /v "S"') do del %F /f 更新:为了回应否决票,下面是一个经过更正和简化的示例: for /f %F in ('d

我正在使用下面的代码删除未启动
“S”
.txt
文件:

但它不起作用


如何做到这一点?

这并不漂亮,但你可以:

  • 构造for循环
  • 告诉for对…的输出进行迭代
  • 用/V“S”(不包括S)通过管道查找的文件的裸(/B)目录列表
  • 告诉for对其处理的每个项目调用del。使用/f以避免需要del确认
  • 下面是一个例子:

    for /f %F in ('dir /B ^| find /v "S"') do del %F /f
    
    更新:为了回应否决票,下面是一个经过更正和简化的示例:

    for /f %F in ('dir S*.txt /B') do del %F /f
    
    这不涉及递归搜索或任何比所述问题更高级的问题

    更新:我应该说“如果可以,请使用Powershell”。命令提示符是一个可怕的shell:

    gci -Filter S*.txt -recurse | rm
    

    对于windows Vista或更高版本的操作系统,请尝试以下操作

    @echo off
    
        setlocal enableextensions disabledelayedexpansion
    
        set "targetFolder=%cd%"
    
        set "tempFolder=%temp%\%~nx0.%random%.tmp"
        md "%tempFolder%" >nul 2>nul
        robocopy "%tempFolder%" "%targetFolder%" /nocopy /purge /xf s* /l
        rd "%tempFolder%" >nul 2>nul
    
    这将创建一个空文件夹,用作清除目标文件夹的源,即删除源中不存在且目标中存在的文件。由于源为空,所有文件都将被删除,但
    /xf s*
    robocopy
    指示应排除以
    s
    开头的文件。包括结束
    /l
    开关,仅列出将被删除的文件。如果输出正确,请将其拆下

    对于没有
    robocopy
    的windows版本,可以使用此选项

    @echo off    
        setlocal enableextensions disabledelayedexpansion
    
        set "targetFolder=%cd%"
    
        for /f "delims=" %%a in ('
            dir /b /a-d "%targetFolder%" ^| findstr /i /v /b /c:"s"
        ') do echo del "%%~fa" 
    
    由于将对每个要删除的文件执行
    del
    命令,因此效率较低。其思想是使用
    dir
    命令检索所有文件的列表,并使用
    findstr
    to,忽略大小写(
    /i
    )过滤器仅检索不包括(
    /v
    )行开头(
    /b
    )字符串
    S
    /c:“S”
    )的元素列表


    del
    命令仅回显到控制台。如果输出正确,请删除
    echo
    命令

    为什么不将
    S*.txt
    移到其他文件夹,全部删除,然后移回

    move S*.txt somefolder\
    del *.txt
    move somefolder\S*.txt .\
    

    重复?dos不是unix。正则表达式在这里不起作用。我不知道如何指出这一点,但问题可能是服务器故障而不是堆栈溢出。您的代码将过滤掉文件名或扩展名中任何包含S的文件,并且不排除文件夹。对于带有空格的名称,它也会失败。请更新以更正@foxidrive引起的一些问题。这仍然不能处理带有空格的文件。欢迎使用堆栈溢出。您可以使用
    “delims=“
    处理空格,并将最后一个
    %F
    括在双引号中,还可以在
    dir
    命令中添加
    /a-d
    ,以排除文件夹。
    move S*.txt somefolder\
    del *.txt
    move somefolder\S*.txt .\