中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助][已解决]请教调整参数排序
作者:
标题: [求助][已解决]请教调整参数排序 上一主题 | 下一主题
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『楼 主』:  [求助][已解决]请教调整参数排序 使用 LLM 解释/回答一下

我写了一个验证用户输入是否合法的代码,它的参数比较多,
:validate _envState _envIndex _envInput /n /i /x
后面的/n /i /x 类似于选项

我想要的效果是选项可以在任意位置指定,比如
call :validate /n _envState /i _envIndex /x _envInput

问题:在:validate中能不能通过一段简单的代码,把选项调整到最后?
然后可以通过%1访问_envState,通过%2访问_envIndex,通过%3访问_envInput

:算是解决了吧,见3楼

Last edited by obsolete on 2008-7-20 at 06:41 PM ]


2008-7-20 12:17
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

实现参数重新排序的代码基本已经搞定。


@echo off & setlocal enabledelayedexpansion
call :callee /n p1 /i p2 /x p3
pause
goto :EOF

:callee _param1 _param2 _param3 /n /i /x
set index=1
set options=
:loop
call set param=%%~%index%
if defined param (
if "%param:~0,1%"=="/" (
set options=%options% %param%
shift /%index%
) else (
set /a index+=1
)
goto :loop
)
echo %1 %2 %3 %options%
goto :EOF


现在还有一个问题:我怎么把调整排序的代码“模块化”:作为一个单独的过程,存放到另一个bat文件中?

我的想法是这样:
1. 用goto:调整完成后再调用goto跳回来。但是,如果用goto,调整参数次序的代码应该不能放到另一个bat文件中吧?

@echo off & setlocal enabledelayedexpansion
call :callee /n p1 /i p2 /x p3
pause
goto :EOF

:callee _param1 _param2 _param3 /n /i /x
goto :adjust
:adjust_finished
echo %1 %2 %3 %options%
goto :EOF

:adjust
set index=1
set options=
:loop
call set param=%%~%index%
if defined param (
if "%param:~0,1%"=="/" (
set options=%options% %param%
shift /%index%
) else (
set /a index+=1
)
goto :loop
)
goto adjust_finished


2. 用call:这样就需要把参数传递给adjust,但是调整后的参数要怎样应用到callee中去呢?在adjust中再调用一次callee,确保callee这一次完全执行并忽略adjust。callee调用完成后,退回到adjust,再退回到callee,在callee中需要一些代码来阻止它再执行一遍。
这种方法好像会让代码变得很奇怪。
PS:想错了,因为在adjust内使用了标签:callee,所以它也不能存到另一个bat文件中

@REM 假设参数在9个以内

@echo off & setlocal enabledelayedexpansion
call :callee /n p1 /i p2 /x p3
pause
goto :EOF

:callee _param1 _param2 _param3 /n /i /x
if not defined calling call :adjust callee %*
if defined called (
set calling=
set called=
goto :EOF
)
echo %*
goto :EOF

:adjust _caller %*
set calling=true
set caller=%1
shift
set index=1
set params=
set options=
:loop
call set param=%%~%index%
if defined param (
if "%param:~0,1%"=="/" (
set options=%options% %param%
shift /%index%
) else (
set /a index+=1
)
goto :loop
)
set index-=1
for /l %%i in (1,1,%index%) do call set params=!params! %%%%i
call :%caller% %params%%options%
set called=true
goto :EOF


请问一下有其它的实现方法吗?或纠正一下我上面的两种想法?谢谢!

Last edited by obsolete on 2008-7-20 at 06:47 PM ]


2008-7-20 12:56
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下


@REM 结合26933062(感谢!)的代码对上贴中的第二种方法做了改进

@echo off & setlocal enabledelayedexpansion
call :callee /n "hello world" /i "hello script" 1 2 3 4 5 6 7 8 9 10
pause
goto :EOF

:callee
:: 下面的两句是调用调整参数次序的代码,不能少。
:: 看起来还是有点怪-_-||
call :adjust %0 called %*
if defined called goto :EOF
echo %*
goto :EOF

:adjust _caller _flag_called %*
if defined calling (
set calling=
goto :EOF
) else (
set calling=true
)
set args=
set options=
set index=1
for %%i in (%*) do (
set param=%%~i
if "!param:~0,1!"=="/" (
set options=!options! %%i
) else (
if !index! GTR 2 (
set args=!args! %%i
)
set /a index+=1
)
)
set ^%2=
call %1 %args%%options%
set ^%2=true
goto :EOF


Last edited by obsolete on 2008-7-20 at 06:56 PM ]


2008-7-20 13:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

说实话没看懂,你是想把 /n /i /x 放到最后吗?


  1. @echo off&setlocal enabledelayedexpansion
  2. set str=/n /i /x
  3. for %%a in (%str%) do set .%%a=%%a
  4. call :loop /n p1 /i p2 /x p3
  5. echo !num!
  6. pause
  7. :loop
  8. for %%a in (%*) do if not defined .%%a set num=!num! %%a
  9. set num=!num! !str!
  10. goto :eof
小楼一夜听春雨 2008-07-20 13:18




致精致简!
2008-7-20 13:28
查看资料  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

谢谢楼上,恩,是把/n /i /x 放到最后
但我要做成一个通用的东西,就是以斜杠开头的都放到最后。

PS:上面的代码真是简洁,我还没看懂


2008-7-20 13:46
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

哦,看懂了,是把选项过滤掉再加上

好像没有实现这个:
然后可以通过%1访问_envState,通过%2访问_envIndex,通过%3访问_envInput

因为在callee中,我还要按正常的程序来写的,调整参数次序的代码可以看做是透明的,我不关心它产生什么输出。我关心的只是callee的参数。
<img src="images/smilies/face-laugh.png" align="absmiddle" border="0">

Last edited by obsolete on 2008-7-20 at 01:49 PM ]


2008-7-20 13:47
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

好像要求比较过分,不太可能吧。谢谢大家。
我断断续续想了一个礼拜了。


2008-7-20 13:54
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

将参数中以 / 开头的,全部放到最后。


  1. @echo off
  2. call :loop /n p1 /i p2 /x p3
  3. echo %num%
  4. pause

  5. rem 低下的代码就是你说的“模块”上面的就是调用方法,
  6. rem 全局中只要不使用 num 作为变量名就不会和你的代码发生任何冲突。
  7. :loop
  8. setlocal enabledelayedexpansion
  9. set var1=&set "var2="
  10. for %%a in (%*) do (
  11. set "var=%%a"
  12. if not "!var:~0,1!"=="/" (set var1=!var1! %%a) else set "var2=!var2! %%a"
  13. )
  14. set "var=!var1! !var2!"
  15. endlocal&set "num=%var%"&goto :eof
小楼一夜听春雨 2008-07-20 13:50




致精致简!
2008-7-20 14:00
查看资料  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

Originally posted by 26933062 at 2008-7-20 14:00:
将参数中以 / 开头的,全部放到最后。


我的想法是调整了callee的参数排序后,还是使用%1~%9来访问参数。
再次感谢!<img src="images/smilies/face-laugh.png" align="absmiddle" border="0">

Last edited by obsolete on 2008-7-20 at 05:12 PM ]


2008-7-20 14:10
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

不明白你到底要干什么




致精致简!
2008-7-20 14:41
查看资料  发短消息  网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 11 楼』:   使用 LLM 解释/回答一下

Originally posted by 26933062 at 2008-7-20 14:41:
不明白你到底要干什么


表达能力不好-_-||

@echo off
call :callee /n "hello world" /i "hello script"
goto :EOF

:callee
::在这里调用调整参数次序的代码
::我希望在这里能用%1访问到"hello world",用%2访问到"hello script"。
::以/打头的是选项,选项可以通过一个环境变量提供给我。或者可以通过%1~%9访问。
goto :EOF


Last edited by obsolete on 2008-7-20 at 06:31 PM ]


2008-7-20 14:53
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

好累,严重怀疑我的理解能力。。




致精致简!
2008-7-20 15:28
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: