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/file/3.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 批处理脚本在IF-DO循环中检查文件中的字符串_Windows_Batch File_For Loop_Findstr - Fatal编程技术网

Windows 批处理脚本在IF-DO循环中检查文件中的字符串

Windows 批处理脚本在IF-DO循环中检查文件中的字符串,windows,batch-file,for-loop,findstr,Windows,Batch File,For Loop,Findstr,我是新来的,希望这是一个简单的问题。我几乎没有编程和脚本方面的背景,但到目前为止,我已经掌握了基本的知识,我被卡住了 我正试图用我需要帮助的标记部分完成的逻辑 扫描我的IP cam文件夹以查找最大的文件 需要帮助对照已处理文件列表检查该文件 将该文件移动到具有良好CPU和SSD的PC上的临时工作目录 在其上运行手制动器以压缩它 将完成的文件移回其原始位置 从临时工作目录中删除原始文件 将其文件名写入Processed.txt 需要帮助无休止地循环整个过程 现在,它可以完美地扫描并找到最大的文件,

我是新来的,希望这是一个简单的问题。我几乎没有编程和脚本方面的背景,但到目前为止,我已经掌握了基本的知识,我被卡住了

我正试图用我需要帮助的标记部分完成的逻辑

  • 扫描我的IP cam文件夹以查找最大的文件
  • 需要帮助对照已处理文件列表检查该文件
  • 将该文件移动到具有良好CPU和SSD的PC上的临时工作目录
  • 在其上运行手制动器以压缩它
  • 将完成的文件移回其原始位置
  • 从临时工作目录中删除原始文件
  • 将其文件名写入Processed.txt
  • 需要帮助无休止地循环整个过程
  • 现在,它可以完美地扫描并找到最大的文件,然后将其发送以进行处理并将其移回。我想添加的是在大小扫描期间检查已处理的.txt文件,因为通常最大的文件在压缩后仍然是最大的(因此它会被卡在同一个文件上)。基本上,我希望能够无休止地扫描最大的未处理文件并逐个压缩它们。(我有数千个,因此典型的批处理无法真正工作)

    我试图找出如何将findstr放入for\do循环,但我完全不知道该怎么做。我的想法是使用当前的%name%变量,在处理过的.txt文件上通过findstr运行它,如果它匹配,则继续,如果不匹配,则使其成为当前最大的文件

    以下是我迄今为止所做的工作,我已设法从其他帖子中拼凑出来

    SETLOCAL EnableDelayedExpansion
    set tes=0
    set name=
    set path=
    
    for /r D:\Cameras %%h in (*.*) do (
    IF !tes! LSS %%~zh (
    SET tes=%%~zh
    SET name=%%~nh
    SET path=%%~ph
    SET ext=%%~xh
    )
    )
    
    move "d:%path%%name%%ext%" "d:\Working\"
    
    HandBrakeCLI -i "d:\Working\%name%%ext%" -o "c:\Completed\%name%.mp4" -O -e x264 -q 23 -B 128 -w 720 -l 480 --auto-anamorphic
    
    move "c:\Completed\%name%.mp4" "d:%path%%name%.mp4"
    del "d:\Working\%name%%ext%"
    echo !name! >> Processed.txt
    
    提前谢谢,非常感谢您的帮助

    *****编辑更新***** 所以我不能让下面的工作,但它给了我一个新的方向。现在,下面的代码似乎非常接近工作状态,但是第二个FOR DO IF代码似乎在主循环之外处理。也许有人能帮我解决这个问题,因为这是我认为对我有用的逻辑

    我快速删除了我知道正在工作的东西,只是为了测试itll是否扫描,输入文件名,然后下次跳过它进行测试

    rem :start
    SETLOCAL EnableDelayedExpansion
    set tes=0
    set name=
    set path=
    set found=false
    
    for /r d:\Cameras %%h in (*.*) do ( 
    rem CALL :checkprocessed %%h
    for /f %%x in (d:\Processed.txt) do (
    IF "%%~nh" NEQ "%%~x" IF !tes! LSS %%~zh (
    echo !tes! %%~zh %found% >> ifcheck.txt 
    SET tes=%%~zh
    SET name=%%~nh
    SET path=%%~ph
    SET ext=%%~xh
    )
    )
    )
    
    rem move "d:%path%%name%%ext%" "d:\Working\"
    rem HandBrakeCLI -i "d:\Working\%name%%ext%" -o "c:\Completed\%name%.mp4" -O -e x264 -q 23 -B 128 -w 720 -l 480 --auto-anamorphic
    rem move "c:\Completed\%name%.mp4" "d:%path%%name%.mp4"
    rem del "d:\Working\%name%%ext%"
    echo !name! >> Processed.txt
    rem goto :start
    
    
    rem :checkprocessed
    rem SET found=false
    rem for /f %%x in (d:\Processed.txt) do IF "%%~nh" EQU "%%~x" (SET found=true & echo !found! >> found.txt & exit /b 0)
    rem exit /b 0
    

    首先,我要感谢@jwdonahue在这方面所给予的帮助和花费的时间。反复思考各种想法,我能够让脚本完美地工作!如果有人需要,下面是工作脚本。我也从另一个用户的评论中修复了路径。谢谢大家的帮助

    :start
    SETLOCAL EnableDelayedExpansion
    set tes=0
    set name=
    set _path=
    set ext=
    set _found=false
    
    for /r d:\Cameras %%h in (*.*) do (
    for /f %%x in (d:\Processed.txt) do ( IF "%%~nh" EQU "%%~x" ( set _found=true) )
    IF !_found! EQU false IF !tes! LSS %%~zh (
    SET tes=%%~zh
    SET name=%%~nh
    SET _path=%%~ph
    SET ext=%%~xh
    )
    set _found=false
    )
    
    
    move "d:%_path%%name%%ext%" "d:\Working\"
    HandBrakeCLI -i "d:\Working\%name%%ext%" -o "c:\Completed\%name%.mp4" -O -e x264 -q 23 -B 128 -w 720 -l 480 --auto-anamorphic
    move "c:\Completed\%name%.mp4" "d:%_path%%name%.mp4"
    echo !name! >> Processed.txt
    echo !_path!,!name!!ext!,!tes! >> OrgSize.log
    del "d:\Working\%name%%ext%"
    goto :start
    

    您的
    For
    循环递归地扫描每个文件,但变量在循环外部使用,这意味着它们只对循环中最后一个文件输出起作用。您需要将命令移动到循环中并使用
    ,而不是变量名的
    %
    。或者只从循环体调用一个子例程,并使用传入的参数执行子例程中的所有工作。您正在覆盖系统变量路径。我强烈建议您不要这样做。为什么您要将文件从c:\completed移回原始目录?大家好,谢谢您的回复。现在,这是循环通过所有的文件,并给我的信息非常大的一个。这就是我想要的,我想让它找到最大的文件,运行它通过手动中断,然后把它放回压缩的地方,因为我有其他的应用程序,排序,等等,从那里读取它。然后我想让它抓取下一个最大的文件,然后一个接一个地做。基本上,我正在尝试尽可能不破坏现有的视频,同时将它们移动到功能更强大的计算机上运行手刹。