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

[文本处理] 【已解决】BAT:提取倒数第一个文本的代码出错,为何?

本帖最后由 思想之翼 于 2014-9-15 18:46 编辑

问题1:
  1. @echo off
  2. for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\001\lishi\*.txt"') do (
  3.     copy "%%i" "d:\文本\提取1\001.txt"
  4.     goto :eof
  5. )
复制代码
上述代码为提取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个类似的代码,合而为一,下述代码出错。为何?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%x in (1001,1,1210) do (
  3.     set y=%%x
  4.     for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\!y:~1!\lishi\*.txt"') do (
  5.         copy "%%i" "d:\文本\提取1\!y:~1!.txt"
  6.         goto :eof
  7.     )
  8. )
  9. exit
复制代码
1

评分人数

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

本帖最后由 apang 于 2014-9-15 19:06 编辑

回复 3# 思想之翼


    这样试下:
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" NEQ "OK" (
  3.     pushd "d:\文本\文本1\001\lishi\"
  4.     for /f "tokens=1*" %%a in ('"%~0" OK ^| sort /r') do (
  5.         copy "%%b" "d:\文本\提取1\001.txt"
  6.         pause & exit/b
  7.     )
  8. ) else (
  9.     set "re=\\ans89\-[0-9][0-9]*\-[0-9][0-9]*\-[0-9][0-9]*克\.txt"
  10.     for /f "delims=" %%a in ('dir /b /s^|findstr /ie !re!') do (
  11.         for /f "tokens=2-4 delims=-克" %%b in ("%%~na") do (
  12.             set /a b=1000+%%b,c=1000+%%c,d=1000+%%d
  13.             echo,!b!!c!!d! %%a
  14.         )
  15.     )
  16. )
复制代码
上面整复杂了,貌似这样就可以:
  1. @echo off & setlocal enabledelayedexpansion
  2. pushd "d:\文本\文本1\001\lishi\"
  3. set "re=\\ans89\-[0-9][0-9]*\-[0-9][0-9]*\-[0-9][0-9]*克\.txt"
  4. for /f "delims=" %%a in ('dir /b /s^|findstr /ie %re%') do (
  5.     for /f "tokens=2-4 delims=-克" %%b in ("%%~na") do (
  6.         set /a b=1000+%%b,c=1000+%%c,d=1000+%%d
  7.         if "!b!!c!!d!" gtr "!Max!" set "Max=!b!!c!!d!" & set "f=%%a"
  8.     )
  9. )
  10. copy "!f!" "d:\文本\提取1\001.txt"
  11. pause
复制代码
1

评分人数

TOP

回复 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)的数据?

TOP

本帖最后由 CrLf 于 2014-9-15 01:57 编辑

for 的 skip 不允许为 0(除非你不用它)
去掉 skip=x 应该就行了
-----------------------------------
发现你在 for 里用 goto,这是会跳出每一层的 for 的,要用这个思路来实现的话,应该这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%x in (1001,1,1210) do call :test %%x
  3. exit
  4. :test
  5. set "y=%~1"
  6. for /f "delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\!y:~1!\lishi\*.txt"') do (
  7.     copy "%%i" "d:\文本\提取1\!y:~1!.txt"
  8.     exit /b
  9. )
  10. exit /b
复制代码
要么换一种思路:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%x in (1001,1,1210) do (
  3.     set y=%%x
  4.     for /f "skip=1 delims=" %%i in ('dir /b /a-d /o-n /s "d:\文本\文本1\!y:~1!\lishi\*.txt"') do (
  5.         if not exist "d:\文本\提取1\!y:~1!.txt" copy "%%i" "d:\文本\提取1\!y:~1!.txt"
  6.     )
  7. )
  8. exit
复制代码
1

评分人数

TOP

返回列表