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

[文件操作] 批处理怎样匹配文件名 开头数字?

本帖最后由 娜美 于 2021-11-9 18:41 编辑

E.G   
B文件夹内名称   开头数字确认没有重复哦

666.海.txt
45654-北京.txt
6666广.txt
002天真666.txt

如果A文件夹内存在   
666.海.csv
666京.csv
16888.csv

如果A B文件夹内的文件名开头数字都匹配 (仅对比开头数字,不是中间或后面数子)  就将B文件夹内的文件复制到C文件夹内

执行后  应在C文件夹内得到  

666.海.txt

本帖最后由 dos大帝 于 2021-11-8 16:41 编辑
  1. @echo off & setLocal enableDelayedExpansion
  2. for %%i in ("D:\A" "D:\B") do (
  3.     pushd %%i
  4.     for /f "delims=" %%j in ('dir /b *.txt 2^>nul ^| findstr /b "[0-9]"') do if "%%~xj" == ".txt" call :number %%j
  5.     popd
  6. )
  7. goto ending
  8. :number
  9. set name=%~n1
  10. for /l %%j in (0,1,256) do (
  11.     set sub_s=!name:~%%j,1!
  12.     echo !sub_s!|findstr "[^0-9]" >nul && (
  13.         set prefix=!name:~0,%%j!
  14.         if defined _!prefix! (copy "%1" "D:\C\") else set "_!prefix!=1"
  15.         goto :eof
  16.     )
  17. )
  18. goto :eof
  19. :ending
  20. pause
复制代码
对比多个文件夹下txt文件名字, 数字开头且数字一致的文件将被复制到另一个文件夹, 在一个文件夹下发现相同的也复制

TOP

回复 2# dos大帝


   dos大帝哥哥  你真帅哈

TOP

本帖最后由 娜美 于 2021-11-8 19:51 编辑

回复 2# dos大帝


  dos大帝哥 Sorry 我竟然忘了说A B 文件夹 的文件后缀是不同的,  A文件夹里是后缀csv     B 文件夹里后缀是.txt    测试才想起来的

如果后缀不同请问咋改呢

TOP

回复 4# 娜美

第五行改成这个
  1. for /f "delims=" %%j in ('dir /b /a-d 2^>nul ^| findstr /b "[0-9]"') do call :number %%j
复制代码
这样会不管文件后缀, 文件名字符合的都会操作

TOP

回复 5# dos大帝


   嗯嗯 GoodThanks

TOP

回复  娜美

第五行改成这个这样会不管文件后缀, 文件名字符合的都会操作
dos大帝 发表于 2021-11-8 19:54



   测了一下  似乎需要区分后缀条件, 要不然很多文件都会被处理

TOP

回复 7# 娜美

第五行改成
  1. for /f "delims=" %%j in ('dir /b /a-d 2^>nul ^| findstr /b "[0-9]"') do (
  2. if "%%~xj" == ".csv" (
  3. call :number %%j
  4. ) else if "%%~xj" == ".txt" (
  5. call :number %%j
  6. )
  7. )
复制代码

TOP

本帖最后由 dos大帝 于 2021-11-9 12:41 编辑
  1. @echo off & setLocal enableDelayedExpansion
  2. pushd "D:\dos\test\A"
  3. for /f "delims=" %%i in ('dir /b /a-d "*.csv" 2^>nul ^| findstr /b "[0-9]"') do if "%%~xi" == ".csv" call :number "%%i" 1
  4. popd
  5. pushd "D:\dos\test\B"
  6. for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul ^| findstr /b "[0-9]"') do if "%%~xi" == ".txt" call :number "%%i" 0
  7. popd
  8. goto ending
  9. :number
  10. set name=%~n1
  11. for /l %%j in (0,1,256) do (
  12.     set sub_s=!name:~%%j,1!
  13.     echo !sub_s!|findstr "[^0-9]" >nul && (
  14.     set prefix=!name:~0,%%j!
  15.     if %2 equ 1 (
  16.     set "_!prefix!=1"
  17. ) else (
  18. if defined _!prefix! copy "%1" "D:\dos\test\C"
  19. )
  20.         goto :eof
  21.     )
  22. )
  23. goto :eof
  24. :ending
  25. pause
复制代码
回复 9# 娜美


你之前题意说不会重复, 这我就没管, 现在代码会记录A文件夹里csv文件开头的数字, 在B文件夹中发现相同的txt文件就将B中的复制到C
至于卡的问题, 基于dos的call和两个循环中不能退出里面循环继续外面循环的机制, 暂时没有什么好的办法

TOP

本帖最后由 娜美 于 2021-11-9 14:12 编辑

回复 10# dos大帝


  嗯嗯    Very good thanks    虽然不能更快,  但是思路很好

TOP

你没说清楚,我怎么感觉与数字没什么关系呢?就是同名文件摆。

TOP

试试这个是不是你所要的结果:
  1. @echo off
  2. for %%a in (A\*.*) do if exist "B\%%~na.*" copy "B\%%~na.*" "C\"
  3. pause
复制代码
ABC 3个文件夹及批处理文件要在同一目录下。

TOP

本帖最后由 娜美 于 2021-11-9 18:42 编辑

回复 13# qixiaobin0715


   11楼 dos大帝哥理解是正确的

TOP

未测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d A\*.csv^|findstr "^[0-9]"') do (
  4. set "n=%%~ni"
  5. set /a n=n
  6. set #!n!=true
  7. )
  8. for /f "delims=" %%a in ('dir /b /a-d B\*.txt^|findstr "^[0-9]"') do (
  9. set "m=%%~na"
  10. set /a m=m
  11. if defined #!m! copy "%%a" "C\"
  12. )
  13. pause
复制代码
ABC 3个文件夹及批处理文件要在同一目录下。

TOP

返回列表