Board logo

标题: [已解决]批处理的参数,第n个参数之后的所有参数,如何获取? [打印本页]

作者: noe    时间: 2012-5-8 19:20     标题: [已解决]批处理的参数,第n个参数之后的所有参数,如何获取?

本帖最后由 noe 于 2012-5-9 15:48 编辑

如题,比如example.bat 1 2 3 4 5 6 7,现在希望得到%3之后的所有参数,即4 5 6 7,并赋值给一个变量。
有些类似于for中的tokens 3*的意思。
想过这样:for /f "tokens=3*" %%a in ("%*") do (set args=%%b),但不理想,%1到%3中包含空格时就不能得到预想的结果。
(参数总数可能很多)

向各位求助,谢谢。

=============
已解决,感谢3楼neorobin的帮助。
作者: canyuexiaolang    时间: 2012-5-8 20:02

本帖最后由 canyuexiaolang 于 2012-5-8 20:03 编辑

for /l %%i in (1 1 9) do call echo %%%%i
作者: neorobin    时间: 2012-5-8 22:07

回复 1# noe
  1. @echo off & setlocal enabledelayedexpansion
  2. set /p "n=要跳过多少个参数: "
  3. for %%a in (%*) do (
  4. set /a c+=1
  5. if !c! gtr !n! set "args=!args! %%~a"
  6. )
  7. set args
复制代码

作者: gawk    时间: 2012-5-8 22:14

能否说说什么时候%1到%3中包含空格?
作者: noe    时间: 2012-5-9 15:42

回复 2# canyuexiaolang
谢谢回复,或许是我表达不够明确,我的意图似乎完全没有传达到您那里。并且我说参数总数可能很多 = 不止9个。

回复 4# gawk
谢谢关注。比如文件路径,可能有数量无法预计的空格。




回复 3# neorobin
非常感谢。测试有效。
作者: Taurus    时间: 2012-5-9 18:06

本帖最后由 Taurus 于 2012-5-9 18:10 编辑
能否说说什么时候%1到%3中包含空格?
gawk 发表于 2012-5-8 22:14

假設strings是有空格的path而且用引號:
  1. @echo off & setlocal enabledelayedexpansion
  2. set /p n=要跳过多少个参数:
  3. set str=str^=
  4. call :a "1" 2 3 "C:\a\b   c\hello" 6 7 ""D:\Mother fuck\wet pussy"" a b c e f g h i j
  5. :a
  6. shift
  7. set/a x+=1&set ENV=%1
  8. if !x! GEQ !n! set "str=!str! %0"
  9. if not defined ENV  (goto :ent) else (goto :a)
  10. :ent
  11. set/p=!str!
复制代码

作者: tiandyoin    时间: 2024-9-7 09:46

本帖最后由 tiandyoin 于 2024-9-7 09:49 编辑
  1. @echo off
  2. set /p n=要跳过多少个参数:
  3. echo 初始="1" 2 3 "C:\% a % \%%b%%   !c!\h!!e!!llo" 6 7 ""D:\Mother **\wet pussy"" a b c e f g h i j
  4. call :get_tails list %n% "1" 2 3 "C:\% a % \%%b%%   !c!\h!!e!!llo" 6 7 ""D:\Mother **\wet pussy"" a b c e f g h i j
  5. set list
  6. @goto :EOF
  7. :get_tails
  8.   @echo off
  9.   set %~1=
  10.   set "count=%~2"
  11.   :LOOP
  12.   set/a count-=1
  13.   set t=%3
  14.   if not defined t goto :LOOP_OUT
  15.   if %count% LSS 0 call set %~1=%%%~1%% %3
  16.   shift /3
  17.   goto :LOOP
  18.   :LOOP_OUT
  19.   set %~1
  20.   call echo list2=%%%~1%%
  21. @goto :EOF
复制代码
使用 call set 的缺点是无法阻止 %% 求值

使用延迟变量的缺点是
无法阻止 !! 求值,
要全局忍受感叹号恐惧的支配,
即使使用 Endlocal & set ... 拿出来,还是摆脱不了 %% 变量求值的坑
作者: tiandyoin    时间: 2024-9-7 15:17

  1. @echo off
  2. set /p n=要跳过多少个参数:
  3. echo 初始="1" 2 3 "C:\% a % \%%b%%   !c!\h!!e!!llo" 6 7 ""D:\Mother **\wet pussy"" a b c e f g h i j
  4. call :get_tails list %n% "1" 2 3 "C:\% a % \%%b%%   !c!\h!!e!!llo" 6 7 ""D:\Mother **\wet pussy"" a b c e f g h i j
  5. set list
  6. @goto :EOF
  7. :get_tails
  8.   @echo off
  9.   set %~1=
  10.   set "cc=%~2"
  11.   set /a cc+=2
  12.   for %%b in (%*) do (
  13. set /a cc-=1
  14. set d=&for /f "delims=0123456789c=" %%A in ('set cc') do set d=%%A
  15. if defined d call set %~1=%%%~1%% %%b
  16.   )
  17. @goto :EOF
复制代码
再来一个for 的形式,全程靠 SET




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