标题: [文件操作] [已解决]为什么这个批处理运行到一半直接闪退? [打印本页]
作者: LTSC1809 时间: 2023-5-20 16:06 标题: [已解决]为什么这个批处理运行到一半直接闪退?
下面这个批处理运行后应当让用户拖入音频文件,然后将音频文件复制到某个文件夹,但是运行时直接闪退,用加入pause的方式找到了显示完“最多能加入12个音频,并且它们会替换掉原版唱片”后就闪退了,拖入cmd窗口运行没有产生任何报错信息,也是显示完这个内容直接回到输入指令的地方,至于程序中使用到的%1,并没有错误使用,因为本来这个程序是由其他批处理启动的,上一个用于启动本程序的批处理我已经传递了参数,代码如下:- echo off&cls
- color 0f
- title Minecraft Music Disc Tools
- echo 欢迎使用音频添加向导
- echo 最多能加入12个音频,并且它们会替换掉原版唱片
- for %%i in (11.ogg,13.ogg,mall.ogg,mellohi.ogg,far.ogg,stal.ogg,ward.ogg,strad.ogg,chirp.ogg,cat.ogg,wait.ogg,blocks.ogg) do (
- set /p fill_name=请拖入音频文件(.ogg)不需要的请留空:
- if not defined fill_name (goto not2)
- copy %fill_name% %1\assets\minecraft\sounds\records
- for %%I in (%fill_name%) do set ab=%%~nI
- ren %1\assets\minecraft\sounds\records\%ab% %%i
- echo %fill_name%>>%cd%\od.txt
- :not2)
- echo 添加的音频已经到达上限
- pause
- call %cd%\ext.bat %1
复制代码
作者: LTSC1809 时间: 2023-5-20 16:30
回复 2# BingjianREMIX 我也这么觉得,但是一开始没问题的,我之前改了一下do后面那个括号里的语句就这样了,这行本身没有改,为什么就会闪退
作者: BingjianREMIX 时间: 2023-5-20 16:43
本帖最后由 BingjianREMIX 于 2023-5-20 16:46 编辑
我改了之后他老提示“'not2' 不是内部或外部命令,也不是可运行的程序
或批处理文件。”- @echo off
- :start
- cls
- color 0f
- title Minecraft Music Disc Tools
- echo 欢迎使用音频添加向导
- echo 最多能加入12个音频,并且它们会替换掉原版唱片
- for %%i in (11.ogg,13.ogg,mall.ogg,mellohi.ogg,far.ogg,stal.ogg,ward.ogg,strad.ogg,chirp.ogg,cat.ogg,wait.ogg,blocks.ogg) do (
- set /p a=请拖入音频文件(.ogg)不需要的请留空:
- if not defined %a% (goto rs)
- copy %a% %1\assets\minecraft\sounds\records
- for %%I in (%a%) do set ab=%%~nI
- ren %1\assets\minecraft\sounds\records\%ab% %%i
- echo %a%>>%cd%\od.txt
- )
- :rs
- echo 添加的音频已经到达上限
- pause
- call %cd%\ext.bat %1
- goto start
复制代码
我已经把几乎所有的“not2”都删了,但是还是“'not2' 不是内部或外部命令,也不是可运行的程序
或批处理文件。”
作者: buyiyang 时间: 2023-5-20 16:51
复制代码
标签最好不要放循环内,如果一定要放的话也不要放个空的标签在最后
作者: buyiyang 时间: 2023-5-20 16:56
回复 3# BingjianREMIX 复制代码
这里错了,应该是复制代码
作者: BingjianREMIX 时间: 2023-5-20 17:00
回复 BingjianREMIX 这里错了,应该是
buyiyang 发表于 2023-5-20 16:56
copy过去的时候带上了,哈哈
作者: BingjianREMIX 时间: 2023-5-20 17:06
回复 1# LTSC1809 应该是这样了:- @echo off
- color 07
- cls
- title Minecraft Music Disc Tools
- echo 欢迎使用音频添加向导
- echo 最多能加入12个音频,并且它们会替换掉原版唱片
- for %%i in (11.ogg,13.ogg,mall.ogg,mellohi.ogg,far.ogg,stal.ogg,ward.ogg,strad.ogg,chirp.ogg,cat.ogg,wait.ogg,blocks.ogg) do (
- set /p a=请拖入音频文件(.ogg)不需要的请留空:
- if not defined a (goto :not2)
- copy %a% %1\assets\minecraft\sounds\records
- for %%I in (%a%) do set ab=%%~nI
- ren %1\assets\minecraft\sounds\records\%ab% %%i
- echo %a%>>%cd%\od.txt
- )
-
- :not2
- echo 添加的音频已经到达上限
- pause
- call %cd%\ext.bat %1
复制代码
如果是单文件而且拮据内存的话可以把color 07删除
作者: 77七 时间: 2023-5-20 17:13
本帖最后由 77七 于 2023-5-20 17:25 编辑
回复 7# BingjianREMIX
改成 if defined a 就不用(未定义跳到for的末尾了,或者跳到for外面)
要开延迟变量
作者: BingjianREMIX 时间: 2023-5-20 17:17
回复 BingjianREMIX
改成 if defined a 就不用未定义跳到for的末尾了,或者跳到for外面
要开延 ...
77七 发表于 2023-5-20 17:13
确实,相比之下我更小白啊哈哈
作者: LTSC1809 时间: 2023-5-20 17:24
本帖最后由 LTSC1809 于 2023-5-20 17:28 编辑
为啥把:not2标签移到了循环体外面,不闪退了,但是现在输入什么都会提示系统找不到指定的文件,输入空白的也是提示系统找不到指定的文件
作者: 77七 时间: 2023-5-20 17:30
回复 10# LTSC1809
在括号内set /p 赋值,后面要用到,得开延迟变量
作者: LTSC1809 时间: 2023-5-20 17:33
回复 11# 77七 哦,我一直以为只有在set x=xx&echo %x%这种地方需要延迟变量
作者: LTSC1809 时间: 2023-5-20 17:41
回复 11# 77七 为什么我开了变量延迟了,百分号也变成叹号了,但是现在运行显示文件已拷贝,重命名仍然提示找不到指定的文件,而且打开创建的文件夹会发现所谓已拷贝的文件并没有出现
作者: LTSC1809 时间: 2023-5-20 17:49
回复 7# BingjianREMIX
你这个会提示系统找不到指定的文件
作者: 77七 时间: 2023-5-20 17:50
回复 13# LTSC1809
- for %%i in (11.ogg,13.ogg,mall.ogg,mellohi.ogg,far.ogg,stal.ogg,ward.ogg,strad.ogg,chirp.ogg,cat.ogg,wait.ogg,blocks.ogg) do (
- setlocal enabledelayedexpansion
- set /p fill_name=请拖入音频文件(.ogg)不需要的请留空:
- if defined fill_name (
- copy !fill_name! "%~1\assets\minecraft\sounds\records\"
- for %%I in (!fill_name!) do (
- set "ab=%%~nI"
- )
- ren "%~1\assets\minecraft\sounds\records\!ab!" "%%i"
- >>"%cd%\od.txt" echo !fill_name!
- )
- endlocal
- )
复制代码
set ab=%%~nI ,这是另外的文件还是set /p 的文件?nxI?
作者: LTSC1809 时间: 2023-5-20 17:56
回复 15# 77七 这里这个变量ab我解释一下,之前把文件拷贝到了指定的文件夹,但是文件名还是原来的,所以要把它重命名成指定的文件名,为了把一开始的输入的路径去掉只剩下文件名的部分,所以就用%%~nI来去掉路径剩下文件名,这里把%%~nI的结果赋值给ab这个变量,为什么要这么做?因为我只知道在for语句中可以%%~n[形式变量名称],不在for语句中没法用双百分号,而且也不知道后面的形式变量名称要写什么,所以就用了一个for
作者: LTSC1809 时间: 2023-5-20 17:59
回复 15# 77七
我加上变量延迟的代码是这样的,拷贝可以了,但是重命名那里会说找不到文件,另外,还有一点,我把那个if not defind a去掉了,换成了现在这个样子,因为循环十二次,只要第一次赋值了,第二次再留空也是上次赋值的内容,不是空的,所以只能在第一次退出,后面就不能退出了,于是我改了- echo off&cls
- color 0f
- title Minecraft Music Disc Tools
- echo 欢迎使用音频添加向导
- echo 最多能加入12个音频,并且它们会替换掉原版唱片
- setlocal enabledelayedexpansion
- for %%i in (11.ogg,13.ogg,mall.ogg,mellohi.ogg,far.ogg,stal.ogg,ward.ogg,strad.ogg,chirp.ogg,cat.ogg,wait.ogg,blocks.ogg) do (
- set fill_name=aaavb
- set /p fill_name=请拖入音频文件(.ogg)全部拖入后请留空:
- if fill_name equ aaavb (goto not2)
- copy !fill_name! %1\assets\minecraft\sounds\records
- for %%I in (!fill_name!) do set ab=%%~nI
- ren %1\assets\minecraft\sounds\records\!ab! %%i
- echo !fill_name!>>%cd%\od.txt)
- :not2
- echo 添加的音频已经到达上限,或者您已经不再需要更多
- pause
- call %cd%\ext.bat %1
复制代码
作者: 77七 时间: 2023-5-20 18:08
回复 17# LTSC1809
用15楼代码试一下。
没看懂你说的,是不是set /p 的文件,如果是就改为nxI。
延迟变量在for里面和外面作用有一些差别,可以看下教程。
如果是,改成这样直接点
- if defined fill_name (
- copy /y !fill_name! "%~1\assets\minecraft\sounds\records\%%i"
- >>"%cd%\od.txt" echo !fill_name!
- )
复制代码
作者: LTSC1809 时间: 2023-5-20 18:12
回复 18# 77七 你这个少了重命名那一步,就是那个ren
作者: LTSC1809 时间: 2023-5-20 18:22
回复 18# 77七 十五楼代码结果是这样的- 请拖入音频文件(.ogg)不需要的请留空:C:\Users\Administrator\Desktop\我的音乐\154.mp3
- 系统找不到指定的路径。
- 已复制 0 个文件。
- 系统找不到指定的路径。
- 请拖入音频文件(.ogg)不需要的请留空:
复制代码
还是找不到指定的文件,还是两个
作者: 77七 时间: 2023-5-20 18:38
回复 20# LTSC1809
- for %%i in (11.ogg,13.ogg,mall.ogg,mellohi.ogg,far.ogg,stal.ogg,ward.ogg,strad.ogg,chirp.ogg,cat.ogg,wait.ogg,blocks.ogg) do (
- setlocal enabledelayedexpansion
- set /p fill_name=请拖入音频文件(.ogg)不需要的请留空:
- if defined fill_name (
- if not exist "%~1\assets\minecraft\sounds\records\" (
- echo md "%~1\assets\minecraft\sounds\records\"
- md "%~1\assets\minecraft\sounds\records\"
- )
- echo copy /y !fill_name! "%~1\assets\minecraft\sounds\records\%%i"
- copy /y !fill_name! "%~1\assets\minecraft\sounds\records\%%i"
- >>"%cd%\od.txt" echo !fill_name!
- )
- endlocal
- )
复制代码
作者: LTSC1809 时间: 2023-5-20 19:35
下一个文件,也是运行到一半闪退,在cmd中运行显示出“稍后您需要按照顺序来加入扩展内容,音频文件的顺序已经在工具文件夹下保存为文本”这一行文字后就报错"此处不应有:"我十分的懵,哪来的冒号,那个set /p吗,我把冒号去掉也还是说此处不应有:啊,代码如下- echo off&cls
- color 79
- title Minecraft Music Disc Tools
- echo 欢迎使用扩展向导
- echo 如果您不需要扩展操作,请关闭窗口
- echo 稍后您需要按照顺序来加入扩展内容,音频文件的顺序已经在工具文件夹下保存为文本
- for %%i in (11,13,mall,mellohi,far,stal,ward,strad,chirp,cat,wait,blocks) do (
- set /p text=请输入唱片的介绍(不需要的请留空):
- if not defined text (goto not)
- echo {>%1\assets\minecraft\lang\zh_cn.json
- echo "item.minecraft.music_disc_%%i.desc": "%text%",>>%1\assets\minecraft\lang\zh_cn.json
- echo }>>%1\assets\minecraft\lang\zh_cn.json
- :not)
- echo "item.minecraft.music_disc_pigstep.desc": "Lena Raine - Pigstep">>%1\assets\minecraft\lang\zh_cn.json
- for %%I in (11,13,mall,mellohi,far,stal,ward,strad,chirp,cat,wait,blocks) do (
- set /p picture=请拖入唱片材质(不需要的请留空):
- if not defined picture (goto not1)
- copy %picture% %1\assets\minecraft\textures\item
- for %%t in (%picture%) do set picname=%%~nt
- ren %1\assets\minecraft\textures\item\picname music_disc_%%I.png
- :not1)
- echo 这部分工作已经圆满完成
- echo 至此,整个资源包的创建已经完成,请将资源包加入游戏测试
- echo 请按任意键退出...
- pause>nul
复制代码
作者: czjt1234 时间: 2023-5-20 19:49
本帖最后由 czjt1234 于 2023-5-20 19:51 编辑
13行
( ) 内不能有 : 标签
作者: LTSC1809 时间: 2023-5-20 19:59
回复 23# czjt1234
那我该怎么做到当输入为空时跳过这次循环,并且在下一次循环继续循环呢?标签放在循环体外面的话,输入一次空值就会直接退出循环体,后面就没法再次输入内容了
作者: czjt1234 时间: 2023-5-20 20:54
本帖最后由 czjt1234 于 2023-5-20 20:56 编辑
多重嵌套- if defined text (
- (echo {
- echo "item.minecraft.music_disc_%%i.desc": "%text%",
- echo })>%1\assets\minecraft\lang\zh_cn.json
- )
复制代码
作者: LTSC1809 时间: 2023-5-23 12:32
回复 21# 77七
那个echo md为什么要echo?这样命令会显示出来不好看的,把echo删掉可以运行吗,还有就是这个程序是由另一个程序拉起的,上一个程序已经创建好了文件夹,不再需要在这里创建文件夹了,直接删掉那个md就可以了对罢
作者: 77七 时间: 2023-5-23 13:45
回复 26# LTSC1809
查错用的,没有错误可以删掉echo 的整行。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |