[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]请问如何批处理如何将子文件夹中图片随机采样并还原?感谢

本帖最后由 呐阳光 于 2023-1-12 21:08 编辑

批处理1:父文件夹中包含多个子文件夹,从每一个子文件夹中随机采样5~10张的图片样本,存入到新的文件夹中,新文件夹名与采样的子文件夹名相同
采样后的图片我处理过后需要还原到原文件夹里。
批处理2:采样的图片还原到对应原文件夹里
我看到一个帖子里的解答,链接如下,但是我测试只创立了新的文件夹,并没采样复制图片到新文件夹里,求助大佬们帮帮我,感谢!
http://www.bathome.net/viewthrea ... hlight=%CB%E6%BB%FA
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# 呐阳光


      或者每个子文件夹随机复制10个也行,具体几个,可修改或者可输入,感谢大佬

TOP

@REM 脚本与主文件夹同目录
bat小白,请多指教!谢谢!

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set n=5
  3. set "folder_a=%cd%"
  4. pushd "..\"
  5. set "folder_b=%cd%"
  6. popd
  7. for /d %%d in ("!folder_b!\*") do (
  8.      if "!folder_a!" neq "%%d" (
  9.          echo 正在处理 %%d ...
  10.          set "new_folder=%folder_a%\%%~nxd"
  11.          rem del /q "!new_folder!\*.*"
  12.          rem rd /q "!new_folder!"
  13.          md "!new_folder!" 2>nul
  14.          setlocal
  15.          for /f "delims=" %%a in ('dir /b /a-d "%%d"') do set ":!random!!random!!random!=%%a"
  16.          for /f "tokens=1* delims==" %%i in ('set :^|sort') do (
  17.               set /anum+=1
  18.               set "%%i="
  19.               if !num! leq %n% (
  20.                   copy "%%d\%%j" "%%~nxd" >nul
  21.                   rem 处理图片文件代码
  22.                   rem copy "!new_folder!\%%j" "%%d\"  处理后再COPY回原目录
  23.               )
  24.          )
  25.          endlocal
  26.      )
  27. )
  28. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2023-1-11 16:45 编辑

1.以下代码未经测试,运行前请备份好源文件;
2.将下面代码均放在主文件夹中,保存为ANSI编码;
3.假设图片文件为jpg格式,其它格式可修改批处理1第8行。
批处理1
  1. @echo off
  2. md NewFolder
  3. for /d %%a in (*) do (
  4.     setlocal enabledelayedexpansion
  5.     set /a min=5,max=10,n=0
  6.     set /a "num=!random!%%(max-min+1)+min"
  7.     pushd "%%a"
  8.     for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  9.         set /a n+=1
  10.         set _!random!-!n!=%%i
  11.     )
  12.     set /a x=n-num
  13.     md "%~dp0NewFolder\%%a"
  14.     for /f "tokens=2 delims==" %%i in ('set _^|more +!n!') do (
  15.         copy "%%j" "%~dp0NewFolder\%%a\"
  16.     )
  17.     popd
  18.     endlocal
  19. )
  20. pause
复制代码
批处理2
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /s /ad NewFolder') do (
  3.     move /y "%%i\*.*" "%~dp0%%~nxi\"
  4.     rd "%%i"
  5. )
  6. rd NewFolder
  7. pause
复制代码

TOP

本帖最后由 呐阳光 于 2023-1-12 00:52 编辑
1.以下代码未经测试,运行前请备份好源文件;
2.将下面代码均放在主文件夹中,保存为ANSI编码;
3.假设图 ...
qixiaobin0715 发表于 2023-1-11 15:44



    您好,经过测试批处理1,发现有1个问题,新建的文件夹里图片没有复制过来?麻烦大佬再次出手,非常感谢!
PS:
下面这个链接是您以前帮助过别人的,10楼那个随机取7个图片我测试可以复制成功
http://www.bathome.net/viewthrea ... hlight=%CB%E6%BB%FA

TOP

本帖最后由 qixiaobin0715 于 2023-1-12 17:02 编辑

修改批处理1
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /ad') do (
  3.     md NewFolder 2>nul
  4.     setlocal enabledelayedexpansion
  5.     set /a min=5,max=10,n=0
  6.     set /a "num=!random!%%(max-min+1)+min"
  7.     pushd "%%a"
  8.     for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  9.         set /a n+=1
  10.         set _!random!-!n!=%%i
  11.     )
  12.     set /a x=n-num
  13.     if !x! leq 0 set x=0
  14.     md "%~dp0NewFolder\%%a"
  15.     for /f "tokens=2 delims==" %%i in ('set _^|more +!x!') do (
  16.         copy "%%i" "%~dp0NewFolder\%%a\">nul
  17.     )
  18.     popd
  19.     endlocal
  20. )
  21. pause
复制代码
请注意自定义变量的数量不能超过上限,所以单个子文件夹中的图片文件也不能超过此数量,否则会出错。

TOP

本帖最后由 qixiaobin0715 于 2023-1-12 15:37 编辑

回复 6# 呐阳光
按照这个思路也行,可以自己试试。
可不受自定义变量数量上限的限制。

TOP

回复 7# qixiaobin0715


    非常感谢,测试成功,子文件图片数量一般几十到几百个,暂时没有遇到问题,感谢大佬

TOP

回复 4# terse


    感谢大佬的热情帮忙,这个测试随机采样有点问题,我已经找到答案了,再次感谢!

TOP

按照6楼链接中的思路,可以这样:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /ad') do (
  3.     md NewFolder 2>nul
  4.     setlocal enabledelayedexpansion
  5.     set /a min=5,max=10,m=1
  6.     set /a "num=!random!%%(max-min+1)+min"
  7.     pushd "%%a"
  8.     for /f "delims=" %%i in ('dir /b /a-d *.jpg^|find /c "."') do (
  9.         set x=%%i
  10.     )
  11.     set /a y=x+100
  12.     for /l %%i in (1,1,!y!) do (
  13.         set /a z=!random!%%!x!+1
  14.         if not defined _!z! (
  15.             if !m! leq !num! (
  16.                 set _!z!=true
  17.                 set /a m+=1
  18.             )
  19.         )
  20.     )
  21.     md "%~dp0NewFolder\%%a"
  22.     for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  23.         set /a n+=1
  24.         if defined _!n! (
  25.             copy "%%i" "%~dp0NewFolder\%%a\">nul
  26.         )
  27.     )
  28.     popd
  29.     endlocal
  30. )
  31. pause
复制代码
未经测试
1

评分人数

TOP

回复 11# qixiaobin0715


    感谢大佬,测试成功的!

TOP

本帖最后由 呐阳光 于 2023-1-31 19:45 编辑

回复 5# qixiaobin0715


    大佬,您好,还可以帮忙写个升级版吗?我的每个图片文件夹里的图片文件名前缀是相同的,后缀是0000,0001,0002....递增的。
比如  ***0000.jpg
        ***0001.jpg
         ***0002.jpg
在此基础上,随机提取图片的过程中不取前面5个图片。(默认图片数量是大于5个的)
再次感谢!祝您新年快乐!

TOP

回复 13# 呐阳光 7楼代码第8行,引号中修改为"skip=5 delims="试试。

TOP

返回列表