Board logo

标题: [文本处理] 批处理if语法中,空值回车闪退。系统是win10-64位,专业版 [打印本页]

作者: bcetl    时间: 2022-3-30 22:43     标题: 批处理if语法中,空值回车闪退。系统是win10-64位,专业版

@echo   第一步,将文件夹拖入此框
set /p folder=
@echo   第二步,请选择操作模式
set /p var=
if %var%==0 goto dell
if %var%==1 goto hhgg
if %var%==2 goto lrr
if %var%==. goto bye
以上是参考,无价值。。。以下是待修正的内容
if %var%==+ goto gg(有效)
if %var%=="" goto gg(原空值回车执行,运行结果:闪退)
if not defined var goto gg(原空值回车执行,运行结果:闪退)
if defined var (goto byebye) else goto gg(原空值回车执行,其它值则退出。运行结果:闪退)

(:gg为主脚本/主命令流程,原本是设计直接空值回车,执行主命令的,发现必须追加赋予一个值if %var%==+ goto gg)
以上4种方法,不赋值就一直闪退



请大神指正。。。。拜谢
作者: buyiyang    时间: 2022-3-30 23:33

本帖最后由 buyiyang 于 2022-3-30 23:37 编辑

下面第二条应该是if "%var%"=="" goto gg,其他应该是对的
作者: bcetl    时间: 2022-3-31 00:18

回复 2# buyiyang


    哦好的,谢谢。我呆会试试。。。会不会是电脑长时间运行,测试太多脚本了。导致系统有点混乱?
作者: bcetl    时间: 2022-3-31 01:09

回复 2# buyiyang


    大神,试了还是闪退。会不会是连续2个set /p变量,一个有定义,一个空值无定义的原因?导致脚本出乱?
作者: ANSL    时间: 2022-3-31 08:38

本帖最后由 ANSL 于 2022-3-31 09:08 编辑

把所有的if语句加上引号,如:
if "%i%"=="3" goto gg
用这个语句判空:
set str=
set /p "str=请输入任意字符,或直接回车:"
if defined str (
    echo 变量 str 的值不为空
) else echo 变量 str 为空值
pause
exit
检查bat是否改成ANSl格式
所有的 if 语句的后面加上
echo 没有条件满足if语句
pause>nul
exit
用SET赋值
如:SET A=%B%
变量拼接:SET A=%B%+%C%
把gg,dell,hhgg,bye,lrr这个批处理标签加上
:gg
echo 你已跳转到gg标签
pause
exit
:lrr
echo 你已跳转到lrr标签
pause
exit

:dell
echo 你已跳转到dell标签
pause
exit
:hhgg
echo 你已跳转到hhgg标签
pause
exit
:bye
echo 你已跳转到bye标签
pause
exit




%foldr%变量在后面没有应用啊!
作者: qixiaobin0715    时间: 2022-3-31 08:38

可以先用下面代码测试一下,看看是前面代码的问题还是标签后面代码的问题:
  1. @echo off
  2. set /p folder=
  3. set /p var=
  4. if "%var%"=="" (echo,false) else echo,true
  5. pause
复制代码

作者: bcetl    时间: 2022-3-31 12:24

本帖最后由 bcetl 于 2022-3-31 12:32 编辑

回复 6# qixiaobin0715
回复 5# ANSL


    现在电脑在处理大量任务,2天没重启。。。我怀疑可能是电脑运行久了,脚本运行多了,系统原因。。。。刚试了一下几种方案都闪退了。



以下是关键部分,单独测试了一下,直接回车都是闪退。我换电脑再试试

编码是ansi

setlocal enabledelayedexpansion
::固定路径
set folder=H:\1111
:begin
set /p var=
if %var%==0 goto dell(请忽略)
if %var%==1 goto hhgg(请忽略)
if %var%==2 goto lrr(请忽略)
if %var%==. goto bye(请忽略)
if %var%==+ goto gg(备选方案)

::无定义、无赋值、空值,直接回车,继续执行;
::if "%var%"== (echo 空值) else echo true
::if not defined var goto gg
if defined var (goto bye) else goto gg
::if "%var%==" (echo 空值) else echo true
::if "%var%"=="" (echo 空值) else echo true

:gg
@echo 测试执行
pause
pause

:bye
@echo 测试退出
pause
作者: bcetl    时间: 2022-3-31 12:33

以上代码,换了一台电脑测试,还是闪退。。。不知道原因。。。

ansi 和utf8编码都试了,结果是闪退。。。怀疑系统原因。
作者: Batcher    时间: 2022-3-31 14:26

回复 8# bcetl


试试这个思路:
1. 把无关代码全部删掉
2. 暂时忘掉拖放的操作,执行代码之后手工输入
3. 不要双击执行
  1. :begin
  2. echo 请输入变量的值
  3. set /p var=
  4. if defined var (
  5.     goto :bye
  6. ) else (
  7.     goto :gg
  8. )
  9. :gg
  10. echo 直接回车
  11. pause
  12. goto :eof
  13. :bye
  14. echo 有输入
  15. pause
  16. goto :eof
复制代码
具体调试方法请参考Q-01:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

如果还是有问题,请提供截图,请用图床:
http://bbs.bathome.net/thread-60985-1-1.html

如需上传附件,请用阿里云盘或百度网盘。
作者: bcetl    时间: 2022-3-31 14:41

本帖最后由 bcetl 于 2022-3-31 14:54 编辑

回复 9# Batcher


    嗯,谢谢大神。原因找到了。。。是跟前面的代码有冲突
if %var%==0 goto ddll
if %var%==1 goto hhgg
if %var%==2 goto lrr
if %var%==. goto bye
if %var%==+ goto gg
把这几行删掉后,就有效了。

只能转变思路把空值挪到前面来。下面是调整后的有效思路
set /p var=
if not defined var goto gg 有效
::if "%var%"=="" goto gg有效
::if defined var (goto bye) else (goto :gg)挪前面倒不适用
::if "%var%" equ "" (goto gg)有效
(把以上这几种方法,挪到数值前面,就有效果。下面继续)
if %var%==0 goto ddll
if %var%==1 goto hhgg
if %var%==2 goto lrr
if %var%==. goto bye
if %var%==+ goto gg
goto bye
:gg
echo +++
pause
pause

:ddll
echo 00
pause

:hhgg
echo 11
pause

:lrr
echo 22
pause

:bye
echo bye
pause
作者: qixiaobin0715    时间: 2022-3-31 16:41

本帖最后由 qixiaobin0715 于 2022-4-1 09:05 编辑

回复 10# bcetl
你说的不是真正原因,实际上不是太冲突。直接回车概念就是变量%var%未被定义,即变量值%var%为空。
if %var%==0 goto ddll
上面一行代码替换后就变成了:
if ==0 goto ddll
等号左边为空,等号不成立,程序就会因出错而退出。
解决的办法可以将变量引起来:
if "%var%"=="0" goto ddll
如果变量未被定义,那就是空值,由于引号的存在,替换后就变成了:
if ""=="0" goto ddll
虽然变量为空值,但由于双引号存在,等号成立,程序就不会出错。
还有一个解决办法,先行判断变量是否被定义,也可以避免出现上面错误的情况。完整代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p var=
  4. if defined var (
  5.     if !var!==0 goto :ddll
  6.     if !var!==1 goto :hhgg
  7.     if !var!==2 goto :lrr
  8.     if !var!==. goto :bye
  9. ) else (
  10.     goto :gg
  11. )
  12. echo,输入值均不符合跳转条件。
  13. pause
  14. goto :eof
  15. :gg
  16. echo 未输入任何值
  17. pause
  18. goto :eof
  19. :ddll
  20. echo 0
  21. pause
  22. goto :eof
  23. :hhgg
  24. echo 1
  25. pause
  26. goto :eof
  27. :lrr
  28. echo 2
  29. pause
  30. goto :eof
  31. :bye
  32. echo .
  33. pause
  34. goto :eof
复制代码

作者: buyiyang    时间: 2022-3-31 16:45

本帖最后由 buyiyang 于 2022-3-31 17:30 编辑

回复 10# bcetl


    我试了一下好像确实是这样,而且判断空值的if只能放在第一个,我猜空值应该是不能直接进行比较,在批处理中因为语法错误直接闪退了,我之前提出的那个错误应该也是这个原因,加引号可以防空,你还可以用其他字符,比如%var%#==#
作者: bcetl    时间: 2022-3-31 17:40

回复 12# buyiyang


    %var%#==#这个方法,刚刚试了,无效。只能简单一点,挪前跳转
作者: bcetl    时间: 2022-3-31 17:42

回复 11# qixiaobin0715


    我试了一下,会闪退。可能我电脑系统有问题。可惜现在处理大量任务,不能关机。
作者: buyiyang    时间: 2022-3-31 18:37

本帖最后由 buyiyang 于 2022-3-31 18:39 编辑

回复 14# bcetl


   我的意思是全都加上字符,向这样,应该可以
  1. @echo off
  2. set /p var=
  3. if "%var%"=="0" goto :ddll
  4. if "%var%"=="1" goto :hhgg
  5. if "%var%"=="2" goto :lrr
  6. if "%var%"=="+" goto :bye
  7. if not defined var goto :gg
  8. echo,输入值均不符合跳转条件。
  9. pause
  10. goto :eof
  11. :gg
  12. echo 未输入任何值
  13. pause
  14. goto :eof
  15. :ddll
  16. echo 0
  17. pause
  18. goto :eof
  19. :hhgg
  20. echo 1
  21. pause
  22. goto :eof
  23. :lrr
  24. echo 2
  25. pause
  26. goto :eof
  27. :bye
  28. echo .
  29. pause
  30. goto :eof
复制代码

作者: buyiyang    时间: 2022-3-31 18:52

回复 11# qixiaobin0715


   这个执行有错误,有没有可能空值不能进行比较,而整个if……else……就是第一个处理的命令。
作者: bcetl    时间: 2022-4-1 00:16

回复 15# buyiyang


    这个有效,真牛!!
作者: qixiaobin0715    时间: 2022-4-1 09:12

回复 14# bcetl
确实有问题。忽略了批处理的预处理机制,加上变量延迟就解决了。
11楼代码已修改。
还是要说一句,IF [NOT] string1==string2 command 这种结构双等号两边的字符串还是要养成加引号的习惯。




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