【问题标题】:Not able to get first 4 characters of the file name using forfiles in batch command无法在批处理命令中使用 forfiles 获取文件名的前 4 个字符
【发布时间】:2015-07-17 21:32:00
【问题描述】:

我正在尝试从 H:\temp 文件夹中查找以 C2319* 开头的特定文件,并删除其余超过 7 天的文件

forfiles /P "H:\Temp\" /M *d6a0f2b4728a /D -7 /C "md /C for %I in (@path) do @if [%~nI]:~0,4==[c2319] del @file /F /A:S"

执行上述命令时出现错误

4==[c2319] was unexpected at this time.

如果我遗漏了什么,请告诉我。

【问题讨论】:

    标签: windows batch-file for-loop cmd substring


    【解决方案1】:
    1. 你的命令行有错字:md 应该是cmd
    2. "H:\Temp\" 中引号前的反斜杠转义引号,应将其删除
    3. 字符串提取:~0,4(应该是5,实际上)只适用于普通变量,因为它需要打开和关闭%或!,但是因为你必须将循环变量分配给一个具有延迟扩展的变量(仅适用于批处理文件)在forfiles /c 命令中不起作用。

    这是在列表模式下使用robocopy 的更快解决方案:

    @echo off
    setlocal enableDelayedExpansion
    set folder=H:\Temp
    
    :: recursively list all *d6a0f2b4728a older than 7 days
    for /f "delims=" %%a in ('robocopy /s /njh /njs /ns /nc /ndl /is /l /fp /minage:7 "%folder%" "%folder%" *d6a0f2b4728a') do (
    
        :: trim spaces
        set file=%%a&set file=!file:%folder%=*!
        for /f "delims=* tokens=2" %%b in ("!file!") do (set file=%folder%%%b&set filename=%%~nb)
    
        :: delete if not c2319*
        if /i not "!filename:~0,5!"=="c2319" del /F /A:S "!file!"
    )
    pause
    

    【讨论】:

    • 先生,请看上面的评论@wOxxOm
    • 您好,先生,我将上述命令尝试为 forfiles /P "H:\Temp" /M *d6a0f2b4728a /D -7 /C "cmd /C setlocal enableDelayedExpansion & for %I in (@path ) 做 (set filename=%~nI & if [!filename:~0,4!]==[c2319] del @file /F /A:S)" 我仍然得到相同的错误:4! ]此时是出乎意料的。 ——
    • 谢谢先生,工作得很好。抱歉继续添加,但有没有办法保留以名称 c2319 开头的文件并删除文件夹中的其余文件。 @wOxxOm
    • 啊,目标和我想象的不一样。查看更新的代码。
    • 谢谢您,先生,我刚刚尝试了代码,它仍在尝试删除名称以 c2319* 开头的文件,文件名称为 c2319c42033a5ca7f44e731bfd3fa2b5_eb56bdb9-93c5-418a-92ce-d6a0f2b4728a 时我执行了删除该文件以及超过 7 天的其他文件的代码。 :(@wOxxOm
    猜你喜欢
    • 2019-07-13
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多