无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 7114|回复: 25
打印 上一主题 下一主题

[求助] 批处理“call”了几下变量值没了,请问怎么保存

[复制链接]
跳转到指定楼层
1#
发表于 2020-10-7 12:22:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 江南一根葱 于 2020-10-7 12:24 编辑

主要是为了生成一个快捷方式,目标参数是个ip地址,也就是%ip%
我这样写

  1. if defined p2pclient (
  2. echo 准备 houctools.....
  3. call :checkip
  4. timeout 2 /nobreak
  5. start "" X:\windows\system32\pecmd.exe LINK %Desktop%\连接服务端硬盘,X:\windows\netmountc.exe,%ip%,X:\windows\netmountc.exe
  6. call :runclientcmd
  7. exit
  8. ) else set p2pclient=

  9. :checkip
  10. <a href="home.php?mod=space&uid=336905" target="_blank">@echo</a> 检测系统目录下是否存在ip.txt
  11. if exist X:\windows\system32\ip.txt @echo 文件存在.准备提取...&&call :txtip
  12. if not exist X:\windows\system32\ip.txt @echo 文件不存在.dhcp作为服务器地址...&&call :dhcpip
  13. exit /b

  14. :txtip
  15. cd /d X:\windows\system32
  16. for /f %%a in (ip.txt) do set ip=%%a
  17. echo %ip%
  18. exit /b

  19. :::从dhcp中提取服务器地址
  20. :dhcpip
  21. for /f "tokens=1,2 delims=:" %%a in ('Ipconfig /all^|find /i "DHCP 服务器 . . . . . . . . . . . :"') do (
  22. for /f "tokens=1,2 delims= " %%i in ('echo %%b')  do set ip=%%i
  23. )
  24. exit /b


复制代码
call :checkip时,ip显示是正常的,但
start "" X:\windows\system32\pecmd.exe LINK %Desktop%\连接服务端硬盘,X:\windows\netmountc.exe,%ip%,X:\windows\netmountc.exe
这里的ip地址是空的,请问要怎么写才能保存变量值,我把这句写到checkip那里当然是可以,但这样不清真,会得到错误的地址,难道要在pe里加入setx
25#
发表于 2020-10-12 16:01:38 | 只看该作者
call 会把变量转成实际值, 我没怎么细看你的程序, 建议你改成goto 吧
回复

使用道具 举报

24#
发表于 2020-10-9 22:34:45 | 只看该作者
批处理不足的,
我通常会写小程序补足.

最好选 Natvie Code : ASM 类/C 类/Pascal 类/Basic 类/...
不含 Script 类/P-Code 类
回复

使用道具 举报

23#
发表于 2020-10-9 09:10:14 | 只看该作者
本帖最后由 junyee 于 2020-10-9 09:18 编辑
nttwqz 发表于 2020-10-9 08:49
我说的肯定是相对而言,要是每一种语言都强大,各种事情都擅长,你应该也没必要学这么多种了,世界上也不 ...


你这个回复偏激了啊.
语言多达数百种不奇怪,我们当然不需要学太多.
我只是觉得好玩就学, 觉得自己学的不够自己用了又学一样, 或许和 创造各种语言的大神和组织一样的想法.

驱动程序就不说了,因为要与硬件底层打交道,而且极注重效率.

至于爬虫我还真用 au3 ,批处理 和 powershell 也写过爬虫.
除了批处理太弱 , au3 和powershell 还真挺方便的,不过不支持多线程,还是 aardio 方便.

python 我不是很熟练, 加之以前学的时候是2.X的版本,忘得差不多了.


---另: 友情讨论,保持氛转哈~

大千世界中,我仍也只是个菜鸟.





回复

使用道具 举报

22#
发表于 2020-10-9 08:49:04 来自手机 | 只看该作者
junyee 发表于 2020-10-9 08:14
物联网的CPU性能弱,

物联网设备 除了硬件厂家,还有可能有中间的用户层二次开发.

我说的肯定是相对而言,要是每一种语言都强大,各种事情都擅长,你应该也没必要学这么多种了,世界上也不会诞生这么多种语言了。你看有多少驱动程序是批处理写的,有几个爬虫是用AU3实现的,在这方面,它们就若了吧?我是这么理解的

点评

你这个回复偏激了啊. 驱动程序就不说了,因为要与硬件底层打交道,而且极注重效率. 至于爬虫我还真用 au3 ,批处理也写过, powershell 也写过. 除了批处理太弱 , au3 和powershell 还真挺方便的,不过不支持多  详情 回复 发表于 2020-10-9 09:10
回复

使用道具 举报

21#
发表于 2020-10-9 08:14:00 | 只看该作者
nttwqz 发表于 2020-10-8 23:04
批处理之家我是知道的,那里有版主写出了纯批处理的大数计算方法,+-*/都有,真想用的可以直接拿来用,研 ...

物联网的CPU性能弱,

物联网设备 除了硬件厂家,还有可能有中间的用户层二次开发.
如果使用 python,lua,js  这类脚本语言能大大提升开发效率.
其中 lua 是执行效率最高的.

没有任何一个语言是小儿科,包括批处理,很多年前,很多病毒就是通过批处理传播的.
如果你还年轻,也喜欢计算机的话,最好找一门语言学好.

我04年才算是真正意义接触互联网的.
脑子笨,你所说的我都学过. 学过的计算机语言/脚本等有十几门了吧.
全都精通那是不可能,反正是业余,觉得对自己有帮助的学.
平时主要玩的 C, au3, aardio , html(前后端数据库都玩) , 安卓逆向. 还有就是各种脚本.

你说AU3 弱,发一个N年前我写的在线听歌工具截图:
没有任何一个语言是弱的,
无非是 各种逻辑段,字符和变量的处理, API的使用 .
只是实现起来有的语言方便,有的不那么方便.



点评

我说的肯定是相对而言,要是每一种语言都强大,各种事情都擅长,你应该也没必要学这么多种了,世界上也不会诞生这么多种语言了。你看有多少驱动程序是批处理写的,有几个爬虫是用AU3实现的,在这方面,它们就若了吧  详情 回复 发表于 2020-10-9 08:49
回复

使用道具 举报

20#
发表于 2020-10-8 23:04:16 | 只看该作者
junyee 发表于 2020-10-8 21:17
这个可以借用外部命令。
1TB转换为字节数太大了,超过了32位。
隔壁有个批处理之家,可以下载到大量的 ...

批处理之家我是知道的,那里有版主写出了纯批处理的大数计算方法,+-*/都有,真想用的可以直接拿来用,研究就算了,意义不大,时间长了还会怎么写的(对,自己写的时间长了也会忘,哈哈)。。。调用VBS也能实现,曾经用过,忘了。这个不需要第三方工具,但是PE可能没有VBS。

powershell功能确实强大,好多方面比批处理强大太多了,特别是管道,学过一段,放弃了,就像你说的,太强大了,虽然微软积极推广,连Win10右键都取消了CMD,但我还是更愿意CMD,不是因为我会,就是感觉powershell太复杂,没有学习的兴趣,启动速度也远没有CMD快。曾经研究过PS代替VBS提权,成功了,但是太慢。

lua和物联网能扯上关系?不知道这个脚本语言。以前学过一段AU3,但是感觉功能弱,放弃了,感觉应该学一门真正的编程语言,研究了一段,发现Python挺火,语法简单,功能强大,用途广泛。不过发现,仅学习什么字符串、列表、元组、字典什么的,时间成了就学不下去了,虽然语法简单,但Python和批处理相比,批处理那学起来真是小儿科了。代码这种东西,时间成了就会生疏,可能需要翻手册重新熟悉一遍。

点评

物联网的CPU性能弱, 物联网设备 除了硬件厂家,还有可能有中间的用户层二次开发. 如果使用 python,lua,js 这类脚本语言能大大提升开发效率. 其中 lua 是执行效率最高的. 没有任何一个语言是小儿科,包括批处  详情 回复 发表于 2020-10-9 08:14
回复

使用道具 举报

19#
发表于 2020-10-8 21:17:45 | 只看该作者
nttwqz 发表于 2020-10-8 20:07
是啊,简单的数学运算都有限制,比如1TB和1TB的字节数值互相换算就不能通过简单的乘除来实现

这个可以借用外部命令。
1TB转换为字节数太大了,超过了32位。
隔壁有个批处理之家,可以下载到大量的第三方工具。

批处理 和 linux shell (哪怕是ash)比都显得太弱了。
linux 本身就附带了大量的实用工具,反观 windows 大家常用的就 for/findstr 几个。

windows 的坑本来就多, 路径是反斜杠,换行是\r\n
powershell 倒是强大,可惜太强大了,学习成本太高,我至今都提不起兴趣深入学习,对于会C#的可能还好。

楼主上面说的 lua 很强大,执行效率也很高。
现在物联设网设备火起来,学这类高效的脚本语言很好。

点评

批处理之家我是知道的,那里有版主写出了纯批处理的大数计算方法,+-*/都有,真想用的可以直接拿来用,研究就算了,意义不大,时间长了还会怎么写的(对,自己写的时间长了也会忘,哈哈)。。。调用VBS也能实现,曾  详情 回复 发表于 2020-10-8 23:04
回复

使用道具 举报

18#
发表于 2020-10-8 20:07:51 | 只看该作者
junyee 发表于 2020-10-8 11:07
我上面的示例是没有开启延迟变量扩展。
开启延迟变量扩展后可以用 !ip! 来使用更方便。

是啊,简单的数学运算都有限制,比如1TB和1TB的字节数值互相换算就不能通过简单的乘除来实现

点评

这个可以借用外部命令。 1TB转换为字节数太大了,超过了32位。 隔壁有个批处理之家,可以下载到大量的第三方工具。 批处理 和 linux shell (哪怕是ash)比都显得太弱了。 linux 本身就附带了大量的实用工具,  详情 回复 发表于 2020-10-8 21:17
回复

使用道具 举报

17#
发表于 2020-10-8 14:01:16 | 只看该作者
江南一根葱 发表于 2020-10-8 13:35
这样写got :EOF后是不是不会往下执行了?我这往下还有很多if,比如netghostclient,会继续执行么

if de ...

call 有点像调用函数,调用结束(如 goto :EOF  或 exit /b n) 会返回到原位置.
goto 则是跳转, 跳转后再结束就有可能是脚本结束啦.


你理解一下...
  1. @echo off


  2. :main
  3. call :aaa
  4. call :bbb
  5. call :bbb end
  6. if %errorlevel% == 128 goto :end
  7. pause
  8. goto :main


  9. :aaa
  10. :bbb
  11. echo 你调用的标签是: %0
  12. if "%1" == "end" goto :END
  13. GOTO :EOF

  14. :end
  15. echo 啊....
  16. exit /b 128
复制代码
回复

使用道具 举报

16#
 楼主| 发表于 2020-10-8 13:35:06 | 只看该作者
本帖最后由 江南一根葱 于 2020-10-8 13:36 编辑
junyee 发表于 2020-10-8 12:28
没发现不可以啊。。

这样写got :EOF后是不是不会往下执行了?我这往下还有很多if,比如netghostclient,会继续执行么

if defined p2pclient (
echo xxx1
echo yyy1
EXIT /B 0
) else (
echo xxx2
echo yyy2
)
goto :EOF

if defined netghostclient (
echo xxx3
echo yyy3
EXIT /B 0
) else (
echo xxx4
echo yyy4
)
goto :EOF



点评

call 有点像调用函数,调用结束(如 goto :EOF 或 exit /b n) 会返回到原位置. goto 则是跳转, 跳转后再结束就有可能是脚本结束啦. 你理解一下...  详情 回复 发表于 2020-10-8 14:01
回复

使用道具 举报

15#
发表于 2020-10-8 12:28:09 | 只看该作者
江南一根葱 发表于 2020-10-8 10:59
还有请教下就是
if defined p2pclient (
echo xxx

没发现不可以啊。。

  1. @echo off


  2. REM http://bbs.wuyou.net/forum.php?mod=viewthread&tid=422367&page=1#pid4152055


  3. set p2pclient=


  4. if defined p2pclient (
  5. echo xxx1
  6. echo yyy1
  7. EXIT /B 0
  8. ) else (
  9. echo xxx2
  10. echo yyy2
  11. )
  12. goto :EOF

复制代码

点评

这样写got :EOF后是不是不会往下执行了?我这往下还有很多if,比如netghostclient,会继续执行么 [*]if defined p2pclient ( [*]echo xxx1 [*]echo yyy1 [*]EXIT /B 0 [*]) else ( [*]echo xxx2 [*]echo yyy  详情 回复 发表于 2020-10-8 13:35
回复

使用道具 举报

14#
发表于 2020-10-8 12:22:15 | 只看该作者
江南一根葱 发表于 2020-10-8 11:15
启动盘那个脚本基本是靠lua完成,lua我只会if then else and or ,或参考套用一些现成的语句
水平太次, ...

lua 自带的函数比批处理可要方便很多。

~~~
等你大作哈,我现在只想当伸手党。。。
回复

使用道具 举报

13#
 楼主| 发表于 2020-10-8 11:15:54 | 只看该作者
junyee 发表于 2020-10-8 11:07
我上面的示例是没有开启延迟变量扩展。
开启延迟变量扩展后可以用 !ip! 来使用更方便。

启动盘那个脚本基本是靠lua完成,lua我只会if then else and or ,或参考套用一些现成的语句
水平太次,没办法,批处理也差不多,不过我比较擅长瞎组合,偶尔有臆想不到的效果

点评

lua 自带的函数比批处理可要方便很多。 ~~~ 等你大作哈,我现在只想当伸手党。。。  详情 回复 发表于 2020-10-8 12:22
回复

使用道具 举报

12#
发表于 2020-10-8 11:07:18 | 只看该作者
江南一根葱 发表于 2020-10-8 10:55
多谢各位大神解惑
不过如果是括号的原因,那么我把
start "" X:\windows\system32\pecmd.exe LINK %Des ...

我上面的示例是没有开启延迟变量扩展。
开启延迟变量扩展后可以用 !ip! 来使用更方便。

setlocal 其实很简单的,多写几个脚本对比下就能理解。

你这个方法更绕 call 来 call 去的也不太方便阅读。


~~~
楼主在做启动盘方面有不少研究,
看样子批处理的功底要加强啊~
批处理是比较简单的脚本语言了,应该熟练掌握才是。


不过批处理比较弱智,有很多应用中有局限性。


点评

是啊,简单的数学运算都有限制,比如1TB和1TB的字节数值互相换算就不能通过简单的乘除来实现  详情 回复 发表于 2020-10-8 20:07
启动盘那个脚本基本是靠lua完成,lua我只会if then else and or ,或参考套用一些现成的语句 水平太次,没办法,批处理也差不多,不过我比较擅长瞎组合,偶尔有臆想不到的效果  详情 回复 发表于 2020-10-8 11:15
回复

使用道具 举报

11#
 楼主| 发表于 2020-10-8 10:59:36 | 只看该作者
本帖最后由 江南一根葱 于 2020-10-8 11:01 编辑

还有请教下就是
if defined p2pclient (
echo xxx
echo yyy
exit
) else echo xxx&&echo yyy
这样可以

但是
if defined p2pclient (
echo xxx
echo yyy
exit
) else (
echo xxx
echo yyy
)
这样写就不行

点评

没发现不可以啊。。  详情 回复 发表于 2020-10-8 12:28
回复

使用道具 举报

10#
 楼主| 发表于 2020-10-8 10:55:10 | 只看该作者
junyee 发表于 2020-10-8 07:40
楼主的这个批处理主要出在变量延迟扩展上。

因为call 是在括号里,而括号外无法预知 %ip% 的。

多谢各位大神解惑
不过如果是括号的原因,那么我把
start "" X:\windows\system32\pecmd.exe LINK %Desktop%\连接服务端硬盘,X:\windows\netmountc.exe,%ip%,X:\windows\netmountc.exe
这一句写成
  1. :serverlink
  2. start "" X:\windows\system32\pecmd.exe LINK %Desktop%\连接服务端硬盘,X:\windows\netmountc.exe,%ip%,X:\windows\netmountc.exe
复制代码
然后原来的位置再
  1. call :serverlink
复制代码
应该就可以了吧,我只会些最简单的笨办法,要是加入延迟变量这些我会头晕的


复制代码

点评

我上面的示例是没有开启延迟变量扩展。 开启延迟变量扩展后可以用 !ip! 来使用更方便。 setlocal 其实很简单的,多写几个脚本对比下就能理解。 你这个方法更绕 call 来 call 去的也不太方便阅读。 ~~  详情 回复 发表于 2020-10-8 11:07
回复

使用道具 举报

9#
发表于 2020-10-8 07:40:14 | 只看该作者
本帖最后由 junyee 于 2020-10-8 07:45 编辑

楼主的这个批处理主要出在变量延迟扩展上。

因为call 是在括号里,而括号外无法预知 %ip% 的。
解决办法可以开启变量延迟扩展,或括号去掉。

如:
  1. @echo off

  2. REM setlocal enabledelayedexpansion
  3. REM http://bbs.wuyou.net/forum.php?mod=viewthread&tid=422367&extra=
  4. REM ----------------------------------------------

  5. set p2pclient=1
  6. set pecmd=%~dp0pecmd.exe
  7. set f_ip=X:\Windows\system32\ip.txt
  8. set f_ip=%~dp0ip.txt


  9. REM ==============================================

  10. if not defined p2pclient EXIT /B 1

  11. echo 准备 houctools.....
  12. call :checkip
  13. timeout 2 /nobreak
  14. if not defined ip EXIT /B 1
  15. start "" %pecmd% LINK D:\连接服务端硬盘,C:\windows\system32\cmd.exe,/k "echo IP:%ip%",C:\windows\system32\cmd.exe


  16. call :runclientcmd
  17. pause
  18. EXIT /B 0

  19. :checkip
  20. set ip=
  21. for /f %%i in (%f_ip%) do set ip=%%i

  22. if defined ip (
  23.     echo IP:%ip%
  24. ) else (
  25.     echo 请检查 %f_ip%
  26. )
  27. goto :EOF

  28. :::从dhcp中提取服务器地址
  29. :dhcpip
  30. for /f "tokens=1,2 delims=:" %%a in ('Ipconfig /all^|find /i "DHCP 服务器 . . . . . . . . . . . :"') do (
  31.     for /f "tokens=1,2 delims= " %%i in ('echo %%b')  do set ip=%%i
  32. )
  33. exit /b


复制代码



%desktop% 这个变量在批处理中会被解释成空字符。


点评

多谢各位大神解惑 不过如果是括号的原因,那么我把 start "" X:\windows\system32\pecmd.exe LINK %Desktop%\连接服务端硬盘,X:\windows\netmountc.exe,%ip%,X:\windows\netmountc.exe 这一句写成 然后原来的位  详情 回复 发表于 2020-10-8 10:55
回复

使用道具 举报

8#
发表于 2020-10-7 22:18:31 来自手机 | 只看该作者
junyee 发表于 2020-10-7 21:49
%%desktop%% 是对的。
%desktop% 在批处理中会被解析成变量。


看上貌似是对的,但是一想又不对,Win中本来没有desktop这个变量,只在pecmd中生效,个人感觉和pecmd有关系。
回复

使用道具 举报

7#
发表于 2020-10-7 21:49:48 | 只看该作者
nttwqz 发表于 2020-10-7 17:47
不知道为什么,我这里测试的%%desktop%%这样写才能创建桌面快捷方式,否则什么都没有,至于%ip%还是%%ip%% ...

%%desktop%% 是对的。
%desktop% 在批处理中会被解析成变量。

就像在批处理 中for %i 要写成 for %%i

点评

看上貌似是对的,但是一想又不对,Win中本来没有desktop这个变量,只在pecmd中生效,个人感觉和pecmd有关系。  详情 回复 发表于 2020-10-7 22:18
回复

使用道具 举报

6#
发表于 2020-10-7 17:47:15 来自手机 | 只看该作者
不知道为什么,我这里测试的%%desktop%%这样写才能创建桌面快捷方式,否则什么都没有,至于%ip%还是%%ip%%都正常。

点评

%%desktop%% 是对的。 %desktop% 在批处理中会被解析成变量。 就像在批处理 中for %i 要写成 for %%i  详情 回复 发表于 2020-10-7 21:49
回复

使用道具 举报

5#
发表于 2020-10-7 16:14:47 | 只看该作者
江南一根葱 发表于 2020-10-7 14:53
确认过,是空的,怎么折腾都不存在。
现在暂时把它弄到:txtip段去了,

在脚本最开头set ip=“” 试试看是不是全局变量和局部变量的原因
按理说没有在子进程里使用local 是不会限定为局部变量的

或者你在set ip=%%a 和 set ip=%%i 之后 echo ip:%ip% &&pause
这样看看是在什么时候ip变量成空
回复

使用道具 举报

4#
 楼主| 发表于 2020-10-7 14:53:15 | 只看该作者
hilsonma 发表于 2020-10-7 14:39
在生成快捷方式前用 echo ip:%ip% &&pause 确认一下变量的值
没有问题后再把该行去掉。

确认过,是空的,怎么折腾都不存在。
现在暂时把它弄到:txtip段去了,

点评

在脚本最开头set ip=“” 试试看是不是全局变量和局部变量的原因 按理说没有在子进程里使用local 是不会限定为局部变量的 或者你在set ip=%%a 和 set ip=%%i 之后 echo ip:%ip% &&pause 这样看看是在什么时候ip  详情 回复 发表于 2020-10-7 16:14
回复

使用道具 举报

3#
发表于 2020-10-7 14:39:15 | 只看该作者
本帖最后由 hilsonma 于 2020-10-7 14:48 编辑

在生成快捷方式前用 echo ip:%ip% &&pause 确认一下变量的值
没有问题后再把该行去掉。

点评

确认过,是空的, 现在暂时把它弄到:txtip段去了,  详情 回复 发表于 2020-10-7 14:53
回复

使用道具 举报

2#
发表于 2020-10-7 13:30:37 | 只看该作者
将 exit /b 改成 goto :eof 试试看

点评

exit /b 和 goto:eof 是等效的。  发表于 2020-10-7 14:32
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-5 09:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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