Board logo

标题: [文本处理] 批处理在for中使用call有点不明白 [打印本页]

作者: non1979cn    时间: 2021-8-4 18:09     标题: 批处理在for中使用call有点不明白

  1. @echo off
  2. for /l %%a in (100 1 199) do (set var=%%a&call echo %%var:~1%%)
  3. pause>nul
复制代码
这个代码中,如果把&去掉,程序不能执行,直接echo %%a~%%好像也不行,想问问高手,这是为啥?
作者: cmd1152    时间: 2021-8-4 19:43

因为&会让批处理以为for /l %%a in (100 1 199) do (set var=%%a和call echo %%var:~1%%)是两个不同的命令
作者: cmd1152    时间: 2021-8-4 19:44

可以在&的前面加^
作者: yakeyun    时间: 2021-8-4 22:25

本帖最后由 yakeyun 于 2021-8-4 22:27 编辑

回复 1# non1979cn


      do后面既然括起来就是一个整句,如果后面改成echo,%%a,就可以看到输出是100~199。而原来的代码本身的输出结果是00~99,所以就可以明白后面的代码是把输出结果做了一个处理:把输出结果只取第二位及后面的部分。
      由于变量值不能直接处理,所以需要先用set赋值,然后再进行处理,所以才会有连接符出现,就是先用输出结果赋值,然后再提取数据。
作者: Batcher    时间: 2021-8-5 10:15

回复 1# non1979cn


建议不要使用那种糟糕的代码风格,改成这样是否比较容易看清楚:
  1. @echo off
  2. for /l %%a in (100 1 199) do (
  3.     set var=%%a
  4.     call echo %%var:~1%%
  5. )
  6. pause
复制代码

作者: cmd1152    时间: 2021-8-5 13:56

本帖最后由 cmd1152 于 2021-8-5 16:49 编辑

代码有一点点问题,帮你改一下(Windows7 专业版 测试没有问题)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (100 1 199) do (
  4.     set var=%%a
  5.      call echo;!var:~1!
  6. )
  7. pause
复制代码

作者: qixiaobin0715    时间: 2021-8-5 15:51

回复 6# cmd1152
1楼、5楼的代码没什么问题啊!不需要修改。
作者: cmd1152    时间: 2021-8-5 16:04

回复 7# qixiaobin0715


   
%%var:~1%%

作者: qixiaobin0715    时间: 2021-8-5 16:06

回复 8# cmd1152
简单,你可以自己运行一下代码。
补习一下call的用法。
变量延迟也可用call




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2