You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DosBox下批处理变量字符串操作失效致变量清空问题求助

在DosBox 0.74-3批处理中提取纯文件名(移除扩展名)的解决方案

问题原因

你遇到的变量被清空的问题,是因为DosBox模拟的早期DOS环境(command.com)不支持Windows cmd.exe的扩展变量替换语法——%file_name:~0,-3%、%file_name:.in=%这类字符串操作是Windows NT之后的cmd才有的功能,DOS无法识别,直接将整个表达式解析为空,导致变量值丢失,echo输出“ECHO is off”。

有效解决方法

方法1:使用DOS for命令的文件变量扩展(推荐)

DOS的for命令支持对文件名字符串提取纯文件名(不带扩展名),语法为%%~nf(批处理中必须用双百分号,命令行中用单百分号)。这个方法既可靠又简洁,不需要临时文件:

rem 假设%file_name%是带扩展名的文件名(可含路径)
for %%f in (%file_name%) do set pure_name=%%~nf
copy %file_name% %out_dir%\%pure_name%.out >NUL
  • 不管file_name是否带路径,%%~nf都会直接提取纯文件名(不含路径和扩展名),比如C:\test\file.in会被提取为file,test.in会被提取为test。
  • 替换你原代码中用临时文件提取文件名的部分,完全不需要dir、temp.temp和set /p这些步骤,避免了临时文件的冗余操作。

方法2:纯DOS命令手动截取(兼容极端场景)

如果因特殊原因无法使用for命令,可以用ren命令配合临时文件来间接提取纯文件名,步骤如下:

rem 复制原文件到临时文件
copy %file_name% temp_no_ext >NUL
rem 重命名临时文件,利用DOS特性去掉扩展名
ren temp_no_ext *.
rem 提取重命名后的纯文件名
dir /B temp_no_ext>temp.temp
set /p pure_name=<temp.temp
rem 清理临时文件
del temp_no_ext temp.temp
rem 执行复制操作
copy %file_name% %out_dir%\%pure_name%.out >NUL

这个方法利用DOS重命名时*.会去掉扩展名的特性,但需要注意如果当前目录有同名无扩展名文件会冲突,不如for命令稳定。

修正后的完整代码示例

替换你原有的代码片段,最终版本如下:

rem 假设%file_name%和%out_dir%已提前定义
for %%f in (%file_name%) do set pure_name=%%~nf
copy %file_name% %out_dir%\%pure_name%.out >NUL

内容的提问来源于stack exchange,提问作者binyamin alony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:22:26