找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 3035|回复: 9

[其他] [已解决]CMD窗口运行bat命令的输出结果,有点奇怪

[复制链接]
发表于 2025-9-4 10:46:32 | 显示全部楼层 |阅读模式
本帖最后由 HalloWord 于 2025-9-6 10:20 编辑

当前文件夹下有一些图片文件,打开cmd在里面输入下面代码并运行

  1. (for %a in (*.jp*g) do @set /a _n+=1 &call echo ^<item href="images\%a" id=^"id_^%_n^%^" media-type="image/jpeg"/^>)
复制代码
运行后输出结果为:

  1. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
复制代码
输出的看着像是set /a的返回值??
为何会出现set /a的返回值??call命令为何没有输出??
对bat不太懂,有没有大佬解释一下
;
;
========超华丽的分割线========
原因看2,6,8楼,参考2楼代码第二段改了下,转义了变量_n,方便变量_n之前或之后有定义而使用,前后附加了括号便于重定向到文件,并且修正了images后的反斜杠为正斜杠

  1. (for %a in (*.jp*g) do @set/a "_n+=1">nul &call set/p="<item href="images/%a" id="id_^%_n^%" media-type="image/jpeg"/>"<nul&echo,)
复制代码
嗯嗯,仔细看的话,set/p这样的用法也挺奇怪的,而且=号后面的有英文双引号包裹,但是输出时没了,感觉这背后的又是各种各样东西
发表于 2025-9-4 11:53:12 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-5 10:27 编辑

回复 1# HalloWord

一。set/a ... 会有返回值屏显,要取消须如 set/a "_n+=1">nul
二。echo 的输出值 ^<...^> 若未被双引号包裹,其首尾两个重定向符号在句式 call echo ... 中依然有效(尽管前缀转义符^),故导致失误,看以下用双引号包裹后的运行结果(确保运行前变量 %_n% 为空值)

  1. for %a in (*.jp*g) do @set/a "_n+=1">nul &call echo,"<item href="images\%a" id="id_%_n%" media-type="image/jpeg"/>"
复制代码
如要完全达到楼主期望的正确结果,可改用以下命令行代码(确保运行前变量 %_n% 为空值)

  1. for %a in (*.jp*g) do @set/a "_n+=1">nul &call set/p="<item href="images\%a" id="id_%_n%" media-type="image/jpeg"/>"<nul&echo,
复制代码

评分

参与人数 1技术 +1 收起 理由
HalloWord + 1 感谢

查看全部评分

 楼主| 发表于 2025-9-5 10:09:31 | 显示全部楼层
回复 2# aloha20200628


    感谢,cmd窗口里set/a确实有回显,只是每次执行都有回显也太那个了
call不知道怎么回事,改成^^^<也不行,好像只能用英文双引号引起来??
发表于 2025-9-5 10:44:06 | 显示全部楼层
回复 3# HalloWord

关于 set/a 返回值屏显已在2楼文述及代码中解决
至于用 call echo,... 句式,主要是解决其中变量 %_n% 取值的问题。
达到如楼主完全期望的结果已如2楼第二段代码所示,另外再给一个与之等效的命令行示例版本如下

  1. for %a in (*.jp*g) do @set/a "n+=1">nul &for /f %n in ('set/a n') do @echo,^<item href="images\%a" id="id_%n" media-type="image/jpeg"/^>
复制代码
发表于 2025-9-5 12:07:47 | 显示全部楼层
本帖最后由 77七 于 2025-9-5 12:08 编辑

还是用批处理吧,用延迟变量扩展。这个太复杂了...搞不明白,相当于执行以下代码,重定向输出后跟文件名才会有输出。

  1. call echo href="images\%a" id=^"id_^%_n^%^" media-type="image/jpeg"/   ^<item ^> file
复制代码
 楼主| 发表于 2025-9-5 20:01:26 | 显示全部楼层
回复 4# aloha20200628


    大佬,我百度了好久,找到了一个帖子,说call会插入^字符
call echo句式主要的不是变量%_n%,1楼的代码去掉^<和^>,call echo就能显示了
就如2楼说的,用^<和^>会因为^字符不足而变成重定向句式,得不到结果
而用^^^<和^^^>会因为call会插入^字符,也得不到结果
某些特殊字符只能用双引号引起来了
帖子链接http://bbs.bathome.net/redirect.php?goto=findpost&ptid=3349&pid=21124
 楼主| 发表于 2025-9-5 20:06:56 | 显示全部楼层
回复 5# 77七


    感谢,只是有时候图省事,就直接在cmd窗口里输入执行了
百度了好久,找到了一个帖子,说call会插入^字符,帖子链接http://bbs.bathome.net/redirect.php?goto=findpost&ptid=3349&pid=21124
发表于 2025-9-5 20:12:03 | 显示全部楼层
  1. cmd /v /c "for %a in (*.jpg *.jpeg) do @set /a _n+=1 1>nul&echo;^<item href="images\%a" id="id_!_n!" media-type="image/jpeg"/^>"
复制代码
1.在cmd命令行,set /a始终带回显,在批处理中没有回显;

2.call命令不支持管道符,不支持重定向符:
https://learn.microsoft.com/en-u ... ndows-commands/call
Do not use pipes (|) or redirection symbols (< or >) with call.


3.除了管道与重定向符,call命令对 ^ 及 & 也会区别对待,比如:
  1. call echo "a^b"
复制代码
  1. call echo a^&b
复制代码
也就是说,call echo 与 call set 并不是变量延迟扩展的完美替代方案。

评分

参与人数 1技术 +1 收起 理由
HalloWord + 1 感谢解释!

查看全部评分

 楼主| 发表于 2025-9-6 09:58:24 | 显示全部楼层
回复 8# WHY


    非常感谢,这样一来就知道call echo没输出的根本原因了
可是也越来越感觉这call命令好繁琐复杂,要吐了
发表于 2025-9-6 10:35:46 | 显示全部楼层
回复 6# HalloWord

    由于始终缺乏来自官方详尽和不断维护的批处理用法文档,致使几十年来,前后多少用户只把批处作为一种实验技术。好在这种摸石头过河,反复测试的过程,被那些国内外 '批处老玩家' 积累了丰富的 '奇技淫巧',尤其是在2010年前后,似乎成为一个爆发期,至今很多关于批处的经典用法都可追溯到那个年代...
    言归本帖,如果把 echo 输出值用双引号包裹即可省去其中的转义符^,重定向符变为字面量,因此 call echo 句式如2楼第一段代码就会有效输出结果,只不过整个输出结果是用双引号包裹了。如果不想要双引号包裹输出结果,可将 call echo 句式改为 call set/p 句式如2楼第二段代码,即可有效输出未被双引号包裹的结果。而无论哪种句式,其中 call 其实是用于解决变量 %_n% 实时取值的问题,只不过当输出值未被双引号包裹时,其中的重定向符<>就会捣乱。如果不用 call 解决 %_n% 实时取值的问题,可改用4楼代码采用的 for ... echo 句式取代之...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:06 , Processed in 0.027335 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表