找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31657|回复: 7

[文件操作] [已解决]请教下批处理的参数arg

[复制链接]
发表于 2017-7-29 20:00:27 | 显示全部楼层 |阅读模式
本帖最后由 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

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2017-7-29 20:31:25 | 显示全部楼层
就是一个普通的位置参数,你把它改成 bathome 也能执行。

首次执行代码的时候,位置变量 %1 为空,第二行的 if 判断不成立,于是执行第九行 else 里面的语句块。
第11行 %~f0 arg 调用批处理文件本身,并设置位置参数的值为:arg
重新执行到第二行的时候,if 判断成立,执行第三行的 for 循环。
发表于 2017-7-29 20:36:44 | 显示全部楼层
2333333333333333333333333这就是不好好看源码的后果

其实%~f0是指当前批处理的完整路径(call/?)
而"%~f0" arg就是以"arg"作为参数使用
上文中提到了if "%~1"=="arg"就是判断这个参数
 楼主| 发表于 2017-7-29 21:25:12 | 显示全部楼层
就是一个普通的位置参数,你把它改成 bathome 也能执行。

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

谢谢解惑,明白了不少,不过还有个问题,就是重新执行时,第6行的echo为何不会显示?我自己加个echo和pause,发现也不会显示,是否无法查看这里的值?
发表于 2017-7-29 21:28:52 | 显示全部楼层
回复 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. )
复制代码
 楼主| 发表于 2017-7-29 22:17:11 | 显示全部楼层
回复  zhanglei1371
Batcher 发表于 2017-7-29 21:28


试了下,好像都和"echo;!s:~0,6!/%%k/!s:~6!/%%i"这句一样,都显示不出来.....
发表于 2017-7-30 09:35:36 | 显示全部楼层
回复 6# zhanglei1371


    可能是没有符合 *:*年*.pdf 这个条件的文件吧
 楼主| 发表于 2017-7-30 15:57:12 | 显示全部楼层
回复  zhanglei1371


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


谢谢,大致已明白。这个类似于管道。单独拿出来就可以调试结果了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:35 , Processed in 0.021523 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表