搜索当前目录(不含子目录)的 BIN 文件,如果有两个或两个以上 BIN 文件,则设置:
SET GMAME=ERER
如果没有 BIN 文件,则设置:
SET GMAME=ER
如果只有一个 BIN 文件,则设置:
SET GMAME=BIN文件名 不包含后缀,比如:目录下有一个 DF54.BIN 则:
SET GMAME=DF54
求高手帮忙!
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
for /f "delims=" %%i in ('dir /b^|find /c "bin"') do (
if %%i geq 2 (
set gmame=erer
) else (
if %%i==1 (set gmame=bin%%~ni) else (set gmame=er)
)
)for /f "delims=" %%i in ('dir /b^|find /c "bin"') do (
if %%i geq 2 (set gmame=erer) else (
if %%i==1 for /f "delims=" %%j in ('dir /a /b^|find /i "bin"') do (
set gmame=%%~nj) else (set gmame=er)
)
)| 评分人 | 分数 | 时间 |
|---|---|---|
| wudixin96 | +3 | 2007-07-26 17:31 |
@echo off&setlocal enabledelayedexpansion
for /r . %%a in (*.bin) do (
set /a b+=1
if !b! geq 2 set gmame=erer&goto:eof
if !b! equ 1 set "gmame=bin%%~na"
)
if not defined b set gmame=er
| 评分人 | 分数 | 时间 |
|---|---|---|
| wudixin96 | +3 | 2007-07-26 17:31 |
Gemini 解答
在 2000 年代初期的技术语境下,该帖讨论的问题反映了 Windows NT 命令行扩展与实模式 DOS(Real Mode DOS)之间显著的功能断层。以下是对该讨论涉及的技术细节与错误的深度分析:
1. 命令扩展功能的平台差异
在 Post #8 中,用户提供的代码高度依赖 Windows NT 系列(如 Windows XP/2000)中
CMD.EXE的增强功能:
FOR /F开关:用于解析文件内容或命令输出,这是 MS-DOS 原生COMMAND.COM所不具备的。- 路径扩展语法(
%%~ni):用于直接提取文件名而不含后缀,这同样是 NT 专有特性。- 延迟变量扩展(
ENABLEDELAYEDEXPANSION):在循环中动态更新变量值。在纯 DOS 环境(如 MS-DOS 6.22 或 Windows 98 的实模式)下,
FOR命令仅支持FOR %%i IN (set) DO command的基本语法,不支持任何开关。因此,Post #11 提到的“光杆司令”是准确的。2. "Write protect error writing drive A" 错误原因
Post #9 中用户提到的错误并非由
FOR命令本身直接导致,而是由 DOS 的 I/O 处理机制引发的:
- 重定向与管道的临时文件:在实模式 DOS 中,使用管道符(
|)或重定向(>)时,系统有时会尝试在当前驱动器或TEMP/TMP变量指定的路径创建临时文件。如果脚本运行在只读的光盘(CD-ROM)环境,且当前路径未指向 RAMDISK,就会触发写保护错误。- 环境变量空间(Environment Space):若在
AUTOEXEC.BAT中未通过SHELL命令增大环境空间(如/E:2048),复杂的SET操作可能导致溢出。但在该案例中,由于用户在只读光盘根目录运行,系统尝试写入 A 盘(可能是由于某些 DOS 启动盘会将 A: 模拟为可写区或默认交换区)失败。3. 纯 DOS 环境下的替代方案
要在纯 DOS(无 NT 扩展)下实现“统计文件数并获取去后缀文件名”的功能,通常需要采用以下工程逻辑:
文件数量统计
通过
DIR /B结合FIND /C统计行数,并将结果重定向到文本文件,再通过一些变通方法读取:dir /b *.bin > filelist.txt find /c ".bin" filelist.txt > count.txt提取不带后缀的文件名
这是纯 DOS 批处理最难实现的部分,因为
SET不支持字符串截取。历史上的标准做法包括:
- 临时重命名法:利用
REN将目标文件复制到 RAMDISK,重命名为无后缀格式,再利用FOR循环获取。- 外部工具:使用
Strings.com(常用于 PC-DOS 或由第三方分发)或Norton Utilities中的BE.EXE。- DEBUG 脚本:通过汇编一小段程序来处理字符串。
4. 结论与纠正
Post #12 认为“在 DOS 下没法实现”是不准确的。在实模式 DOS 下,实现该逻辑的稳健做法通常是:
- 确保系统中配置了 RAMDISK(如
RAMDRIVE.SYS),并将所有临时文件和重定向操作指向该驱动器。- 使用
IF EXIST配合循环来判断文件数量。- 若只有一个文件,可以通过一个极其隐晦的
FOR命令变通(例如:FOR %%i IN (*.BIN) DO SET GMAME=%%i),随后利用REN结合通配符或专门的解析工具去掉.BIN后缀。此问题的核心矛盾在于用户试图将 32 位 Windows 控制台的高级批处理脚本直接移植到 16 位实模式环境,而忽略了两者命令解释器(
CMD.EXEvsCOMMAND.COM)在内核实现上的根本区别。