DOS批处理文件For循环运行两次

时间:2018-11-26 19:16:25

标签: for-loop command-line

我有一个批处理文件,该文件以递归方式将视频编码到子文件夹“ encode”,然后删除原始文件并将新文件移动到原始目录。我遇到的问题是,在对每个视频进行编码之后,for循环会拾取新编码的视频并再次运行。之后,它将继续播放下一个视频。我不确定为什么它运行两次而不是一次或无限次。我有什么误会?我是一个新手,所以很抱歉,这是一个简单的错误。

add_action( 'admin_footer', 'display_hide_status_option' );
function display_hide_status_option() {
    global $post;
    $complete = '';
    $label    = '';
    if ( $post->post_type === 'post' ) {
        if ( $post->post_status === 'custom-hide-product' ) {
            $selected = 'selected';
        }
        echo '<script>
                jQuery(document).ready(function($){
                    $("select#post_status").append("<option value=\"custom-hide-product\" ' . $complete . '>Produkt versteckt</option>");
                    $(".misc-pub-section label").append("' . $label . '");
                });
              </script>
        ';
    }
}

2 个答案:

答案 0 :(得分:1)

它处理两次的原因是因为文件转换创建了另一个视频剪辑,该视频剪辑与FOR循环中的条件匹配。

为避免处理文件夹结构和同步,解决此问题的一种简单方法是将进程分为两个循环,首先执行*.mp4文件:

@echo off
set /A count = 0
pushd %~dp0
for /R %%f in (*.mp4) do (
   mkdir %%~dpf\encode
   C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
   del "%%f"
   move "%%~dpf\encode\%%~nf.mp4" %%~dpf
   rmdir %%~dpf\encode
   set /A count+=1
   )
for /R %%f in (*.mp2, *.mpg, *.vob, *.avi, *.wmv, *.mov, *.m4v, *.mpeg) do (
   mkdir %%~dpf\encode
   C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
   del "%%f"
   move "%%~dpf\encode\%%~nf.mp4" %%~dpf
   rmdir %%~dpf\encode
   set /A count+=1
   )
popd
echo Count is: %count%
pause

别忘了从第二个循环的文件列表中删除*.mp4


编辑:这是一种更优雅的解决方案。

@echo off
set /A count = 0
pushd %~dp0
for %%e in (mp4 mp2 mpg vob avi wmv mov m4v mpeg) do (
   for /R %%f in (*.%%e) do (
      mkdir %%~dpf\encode
      C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
      del "%%f"
      move "%%~dpf\encode\%%~nf.mp4" %%~dpf
      rmdir %%~dpf\encode
      set /A count+=1
   )
)
popd
echo Count is: %count%
pause

确保mp4首先列出,这样一旦处理了其他文件类型就不会重新转换它。

答案 1 :(得分:0)

我已经对其进行了测试,以查看为什么它的行为如此奇怪,好吧,我唯一能想到的答案就是它的行为很奇怪。我的猜测是,这取决于操作顺序。

这是我的看法: 在代码的某些实现中,for / r避免了无限循环。它的作用是在不是.mp4的文件上首先运行。然后,可能是因为它已被重命名,因此无法将其识别为同一文件。 可能是,它第二次在.mp4上运行之后,它的文件inode(最后一次打开和编辑的时间除外)应该至少在系统不再将其识别为同一文件的时候有所不同。 我测试了确实产生无限循环的代码的不同版本:

set /A count = 0
pushd %~dp0
for /R %%f in (*.mp2, *.mpg, *.vob, *.avi, *.wmv, *.mov, *.mp4, *.m4v, *.mpeg) do (
mkdir %%~dpf\encode

move %%f %%~dpf\encode
rename %%~dpf\encode\%%f %%~dpf\encode\%%~nf.mp4

move %%~dpf\encode\%%~nf.mp4 %%~dpf
rmdir %%~dpf\encode
set /A count+=1
)
popd
echo Count is: %count%
pause 

而且奇怪的是,它不仅运行了无限循环,而且还创建了无数个名为“ \ encode \ encode \ encode ...”的子文件夹,但是其原因并不重要。 此版本代码的不同之处在于,我总是重命名文件。 这可能就是为什么它会产生无限循环的原因。

for / r命令可重复使用已重命名的文件,而不必重复编辑的文件。 解决方案似乎确实是首先在所有.mp4文件上运行代码,然后在其他文件上运行代码。