Board logo

标题: [文件操作] [已解决]请教下批处理的参数arg [打印本页]

作者: zhanglei1371    时间: 2017-7-29 20:00     标题: [已解决]请教下批处理的参数arg

本帖最后由 zhanglei1371 于 2017-7-30 15:56 编辑

看到论坛有高人的代码:
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "arg" (
  3.     for /r %%i in (*:*年*.pdf) do (
  4.         for /f "tokens=1,2 delims=:年" %%j in ("%%~ni") do (
  5.             set "s=%%j"
  6.             echo;!s:~0,6!/%%k/!s:~6!/%%i
  7.         )
  8.     )
  9. ) else (
  10.     set "s="
  11.     for /f "tokens=1,3* delims=/" %%i in ('"%~f0" arg ^| sort /r ') do (
  12.        if not "%%i" == "!s!" set "fd=%%i%%j"
  13.        set "s=%%i"
  14.        md "!fd!"
  15.        move "%%k" "!fd!\"
  16. ) 2>nul
  17.     for /d %%i in (*) do rd "%%i" 2>nul
  18.     pause
  19. )
复制代码
想了解下,arg参数的用法在哪里能学习到?尝试加了几个echo,发现什么也没有显示:
  1. for /f "tokens=* " %%i in ('"%~f0" arg ^| sort /r ') do (
  2. echo %%i
  3. )
  4. pause
复制代码
不知该如何查看里面的变量?
原贴:
http://www.bathome.net/thread-43880-1-1.html
作者: Batcher    时间: 2017-7-29 20:31

就是一个普通的位置参数,你把它改成 bathome 也能执行。

首次执行代码的时候,位置变量 %1 为空,第二行的 if 判断不成立,于是执行第九行 else 里面的语句块。
第11行 %~f0 arg 调用批处理文件本身,并设置位置参数的值为:arg
重新执行到第二行的时候,if 判断成立,执行第三行的 for 循环。
作者: 0000    时间: 2017-7-29 20:36

2333333333333333333333333这就是不好好看源码的后果

其实%~f0是指当前批处理的完整路径(call/?)
而"%~f0" arg就是以"arg"作为参数使用
上文中提到了if "%~1"=="arg"就是判断这个参数
作者: zhanglei1371    时间: 2017-7-29 21:25

就是一个普通的位置参数,你把它改成 bathome 也能执行。

首次执行代码的时候,位置变量 %1 为空,第二行 ...
Batcher 发表于 2017-7-29 20:31

谢谢解惑,明白了不少,不过还有个问题,就是重新执行时,第6行的echo为何不会显示?我自己加个echo和pause,发现也不会显示,是否无法查看这里的值?
作者: Batcher    时间: 2017-7-29 21:28

回复 4# zhanglei1371
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "arg" (
  3.     for /r %%i in (*:*年*.pdf) do (
  4.         echo %%i REM 先查看这里有没有取到文件名
  5.         for /f "tokens=1,2 delims=:年" %%j in ("%%~ni") do (
  6.             set "s=%%j"
  7.             echo !s! REM 再看看这里有没有取到文件名
  8.             echo;!s:~0,6!/%%k/!s:~6!/%%i
  9.         )
  10.     )
  11. )
复制代码

作者: zhanglei1371    时间: 2017-7-29 22:17

回复  zhanglei1371
Batcher 发表于 2017-7-29 21:28


试了下,好像都和"echo;!s:~0,6!/%%k/!s:~6!/%%i"这句一样,都显示不出来.....
作者: Batcher    时间: 2017-7-30 09:35

回复 6# zhanglei1371


    可能是没有符合 *:*年*.pdf 这个条件的文件吧
作者: zhanglei1371    时间: 2017-7-30 15:57

回复  zhanglei1371


    可能是没有符合 *:*年*.pdf 这个条件的文件吧
Batcher 发表于 2017-7-30 09:35


谢谢,大致已明白。这个类似于管道。单独拿出来就可以调试结果了。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2