标题: [文件操作] 批处理怎样匹配文件名 开头数字? [打印本页]
作者: 娜美 时间: 2021-11-7 10:18 标题: 批处理怎样匹配文件名 开头数字?
本帖最后由 娜美 于 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:10
本帖最后由 dos大帝 于 2021-11-8 16:41 编辑
- @echo off & setLocal enableDelayedExpansion
-
- for %%i in ("D:\A" "D:\B") do (
- pushd %%i
- for /f "delims=" %%j in ('dir /b *.txt 2^>nul ^| findstr /b "[0-9]"') do if "%%~xj" == ".txt" call :number %%j
- popd
- )
-
- goto ending
-
- :number
- set name=%~n1
- for /l %%j in (0,1,256) do (
- set sub_s=!name:~%%j,1!
- echo !sub_s!|findstr "[^0-9]" >nul && (
- set prefix=!name:~0,%%j!
- if defined _!prefix! (copy "%1" "D:\C\") else set "_!prefix!=1"
- goto :eof
- )
- )
- goto :eof
-
- :ending
- pause
复制代码
对比多个文件夹下txt文件名字, 数字开头且数字一致的文件将被复制到另一个文件夹, 在一个文件夹下发现相同的也复制
作者: 娜美 时间: 2021-11-8 18:47
回复 2# dos大帝
dos大帝哥哥 你真帅哈
作者: 娜美 时间: 2021-11-8 19:34
本帖最后由 娜美 于 2021-11-8 19:51 编辑
回复 2# dos大帝
dos大帝哥 Sorry 我竟然忘了说A B 文件夹 的文件后缀是不同的, A文件夹里是后缀csv B 文件夹里后缀是.txt 测试才想起来的
如果后缀不同请问咋改呢
作者: dos大帝 时间: 2021-11-8 19:54
回复 4# 娜美
第五行改成这个- for /f "delims=" %%j in ('dir /b /a-d 2^>nul ^| findstr /b "[0-9]"') do call :number %%j
复制代码
这样会不管文件后缀, 文件名字符合的都会操作
作者: 娜美 时间: 2021-11-8 20:42
回复 5# dos大帝
嗯嗯 GoodThanks
作者: 娜美 时间: 2021-11-8 21:03
回复 娜美
第五行改成这个这样会不管文件后缀, 文件名字符合的都会操作
dos大帝 发表于 2021-11-8 19:54
测了一下 似乎需要区分后缀条件, 要不然很多文件都会被处理
作者: dos大帝 时间: 2021-11-8 21:58
回复 7# 娜美
第五行改成- for /f "delims=" %%j in ('dir /b /a-d 2^>nul ^| findstr /b "[0-9]"') do (
- if "%%~xj" == ".csv" (
- call :number %%j
- ) else if "%%~xj" == ".txt" (
- call :number %%j
- )
- )
复制代码
作者: dos大帝 时间: 2021-11-9 12:39
本帖最后由 dos大帝 于 2021-11-9 12:41 编辑
- @echo off & setLocal enableDelayedExpansion
-
- pushd "D:\dos\test\A"
- for /f "delims=" %%i in ('dir /b /a-d "*.csv" 2^>nul ^| findstr /b "[0-9]"') do if "%%~xi" == ".csv" call :number "%%i" 1
- popd
-
- pushd "D:\dos\test\B"
- for /f "delims=" %%i in ('dir /b /a-d "*.txt" 2^>nul ^| findstr /b "[0-9]"') do if "%%~xi" == ".txt" call :number "%%i" 0
- popd
-
- goto ending
-
- :number
- set name=%~n1
- for /l %%j in (0,1,256) do (
- set sub_s=!name:~%%j,1!
- echo !sub_s!|findstr "[^0-9]" >nul && (
- set prefix=!name:~0,%%j!
- if %2 equ 1 (
- set "_!prefix!=1"
- ) else (
- if defined _!prefix! copy "%1" "D:\dos\test\C"
- )
- goto :eof
- )
- )
- goto :eof
-
- :ending
- pause
复制代码
回复 9# 娜美
你之前题意说不会重复, 这我就没管, 现在代码会记录A文件夹里csv文件开头的数字, 在B文件夹中发现相同的txt文件就将B中的复制到C
至于卡的问题, 基于dos的call和两个循环中不能退出里面循环继续外面循环的机制, 暂时没有什么好的办法
作者: 娜美 时间: 2021-11-9 14:08
本帖最后由 娜美 于 2021-11-9 14:12 编辑
回复 10# dos大帝
嗯嗯 Very good thanks 虽然不能更快, 但是思路很好
作者: qixiaobin0715 时间: 2021-11-9 15:39
你没说清楚,我怎么感觉与数字没什么关系呢?就是同名文件摆。
作者: qixiaobin0715 时间: 2021-11-9 16:03
试试这个是不是你所要的结果:- @echo off
- for %%a in (A\*.*) do if exist "B\%%~na.*" copy "B\%%~na.*" "C\"
- pause
复制代码
ABC 3个文件夹及批处理文件要在同一目录下。
作者: 娜美 时间: 2021-11-9 18:38
本帖最后由 娜美 于 2021-11-9 18:42 编辑
回复 13# qixiaobin0715
11楼 dos大帝哥理解是正确的
作者: qixiaobin0715 时间: 2021-11-9 20:57
未测试:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d A\*.csv^|findstr "^[0-9]"') do (
- set "n=%%~ni"
- set /a n=n
- set #!n!=true
- )
- for /f "delims=" %%a in ('dir /b /a-d B\*.txt^|findstr "^[0-9]"') do (
- set "m=%%~na"
- set /a m=m
- if defined #!m! copy "%%a" "C\"
- )
- pause
复制代码
ABC 3个文件夹及批处理文件要在同一目录下。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |