标题: [文本处理] 【已解决】BAT:提取倒数第一个文本的代码出错,为何? [打印本页]
作者: 思想之翼 时间: 2014-9-15 01:31 标题: 【已解决】BAT:提取倒数第一个文本的代码出错,为何?
本帖最后由 思想之翼 于 2014-9-15 18:46 编辑
问题1:- @echo off
- for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\001\lishi\*.txt"') do (
- copy "%%i" "d:\文本\提取1\001.txt"
- goto :eof
- )
复制代码
上述代码为提取d:\文本\文本1\001\lishi\内倒数第二个文本的数据。欲提取倒数第一个文本的数据,将skip=1改为skip=0,出错。为何?
问题2:
@echo off
for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\001\lishi\*.txt"') do (
copy "%%i" "d:\文本\提取1\001.txt"
goto :eof
)
@echo off
for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\002\lishi\*.txt"') do (
copy "%%i" "d:\文本\提取1\002.txt"
goto :eof
)
......
@echo off
for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\210\lishi\*.txt"') do (
copy "%%i" "d:\文本\提取1\210.txt"
goto :eof
)
欲将上述210个类似的代码,合而为一,下述代码出错。为何?- @echo off&setlocal enabledelayedexpansion
- for /l %%x in (1001,1,1210) do (
- set y=%%x
- for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\!y:~1!\lishi\*.txt"') do (
- copy "%%i" "d:\文本\提取1\!y:~1!.txt"
- goto :eof
- )
- )
- exit
复制代码
作者: CrLf 时间: 2014-9-15 01:40
本帖最后由 CrLf 于 2014-9-15 01:57 编辑
for 的 skip 不允许为 0(除非你不用它)
去掉 skip=x 应该就行了
-----------------------------------
发现你在 for 里用 goto,这是会跳出每一层的 for 的,要用这个思路来实现的话,应该这样:- @echo off&setlocal enabledelayedexpansion
- for /l %%x in (1001,1,1210) do call :test %%x
- exit
-
- :test
- set "y=%~1"
- for /f "delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\!y:~1!\lishi\*.txt"') do (
- copy "%%i" "d:\文本\提取1\!y:~1!.txt"
- exit /b
- )
- exit /b
复制代码
要么换一种思路:- @echo off&setlocal enabledelayedexpansion
- for /l %%x in (1001,1,1210) do (
- set y=%%x
- for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\!y:~1!\lishi\*.txt"') do (
- if not exist "d:\文本\提取1\!y:~1!.txt" copy "%%i" "d:\文本\提取1\!y:~1!.txt"
- )
- )
- exit
复制代码
作者: 思想之翼 时间: 2014-9-15 10:39
回复 2# CrLf
感谢帮助!您的代码解决了上述问题。
但是在实践中出现了新情况,需要解决。
以下是lishi文件夹内txt文本的顺序:
ans89-1-1-62克.txt
ans89-1-2-43克.txt
ans89-1-3-42克.txt
ans89-1-4-32克.txt
ans89-1-5-22克.txt
ans89-1-6-20克.txt
ans89-1-7-19克.txt
ans89-1-8-18克.txt
ans89-1-9-9克.txt
ans89-1-10-8克.txt
ans89-1-11-5克.txt
需要提取最后一个txt文本,即ans89-1-11-5克.txt
但是上述代码是按照1、10、11、2...排序,故提取的最后一个txt是ans89-1-9-9克.txt
如何修改代码,才能按照1、2、3、4...10、11...排序,并提取最后一个txt文本(ans89-1-11-5克.txt)的数据?
作者: apang 时间: 2014-9-15 11:42
本帖最后由 apang 于 2014-9-15 19:06 编辑
回复 3# 思想之翼
这样试下:- @echo off & setlocal enabledelayedexpansion
- if "%~1" NEQ "OK" (
- pushd "d:\文本\文本1\001\lishi\"
- for /f "tokens=1*" %%a in ('"%~0" OK ^| sort /r') do (
- copy "%%b" "d:\文本\提取1\001.txt"
- pause & exit/b
- )
- ) else (
- set "re=\\ans89\-[0-9][0-9]*\-[0-9][0-9]*\-[0-9][0-9]*克\.txt"
- for /f "delims=" %%a in ('dir /b /s^|findstr /ie !re!') do (
- for /f "tokens=2-4 delims=-克" %%b in ("%%~na") do (
- set /a b=1000+%%b,c=1000+%%c,d=1000+%%d
- echo,!b!!c!!d! %%a
- )
- )
- )
复制代码
上面整复杂了,貌似这样就可以:- @echo off & setlocal enabledelayedexpansion
- pushd "d:\文本\文本1\001\lishi\"
- set "re=\\ans89\-[0-9][0-9]*\-[0-9][0-9]*\-[0-9][0-9]*克\.txt"
- for /f "delims=" %%a in ('dir /b /s^|findstr /ie %re%') do (
- for /f "tokens=2-4 delims=-克" %%b in ("%%~na") do (
- set /a b=1000+%%b,c=1000+%%c,d=1000+%%d
- if "!b!!c!!d!" gtr "!Max!" set "Max=!b!!c!!d!" & set "f=%%a"
- )
- )
-
- copy "!f!" "d:\文本\提取1\001.txt"
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |