标题: [文本处理] 批处理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
可以先用下面代码测试一下,看看是前面代码的问题还是标签后面代码的问题:- @echo off
- set /p folder=
- set /p var=
- if "%var%"=="" (echo,false) else echo,true
- 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. 不要双击执行- :begin
- echo 请输入变量的值
- set /p var=
- if defined var (
- goto :bye
- ) else (
- goto :gg
- )
-
- :gg
- echo 直接回车
- pause
- goto :eof
-
- :bye
- echo 有输入
- pause
- 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
虽然变量为空值,但由于双引号存在,等号成立,程序就不会出错。
还有一个解决办法,先行判断变量是否被定义,也可以避免出现上面错误的情况。完整代码如下:- @echo off
- setlocal enabledelayedexpansion
- set /p var=
- if defined var (
- if !var!==0 goto :ddll
- if !var!==1 goto :hhgg
- if !var!==2 goto :lrr
- if !var!==. goto :bye
- ) else (
- goto :gg
- )
- echo,输入值均不符合跳转条件。
- pause
- goto :eof
-
- :gg
- echo 未输入任何值
- pause
- goto :eof
-
- :ddll
- echo 0
- pause
- goto :eof
-
- :hhgg
- echo 1
- pause
- goto :eof
-
- :lrr
- echo 2
- pause
- goto :eof
-
- :bye
- echo .
- pause
- 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
我的意思是全都加上字符,向这样,应该可以- @echo off
- set /p var=
- if "%var%"=="0" goto :ddll
- if "%var%"=="1" goto :hhgg
- if "%var%"=="2" goto :lrr
- if "%var%"=="+" goto :bye
- if not defined var goto :gg
- echo,输入值均不符合跳转条件。
- pause
- goto :eof
-
- :gg
- echo 未输入任何值
- pause
- goto :eof
-
- :ddll
- echo 0
- pause
- goto :eof
-
- :hhgg
- echo 1
- pause
- goto :eof
-
- :lrr
- echo 2
- pause
- goto :eof
-
- :bye
- echo .
- pause
- 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 |