Board logo

标题: [文本处理] 批处理FOR语句skip=!n!怎样可以实现? [打印本页]

作者: edmond    时间: 2010-9-16 16:27     标题: 批处理FOR语句skip=!n!怎样可以实现?

for 语句中 比如  skip= tokens=  后面怎样才可以引用变量  比如 skip=!n!
作者: TX_kakashi    时间: 2010-9-16 18:11

直接用就行.
  1. @echo off&setlocal enabledelayedexpansion
  2. set aaa=1
  3. set bb=2
  4. for /f "skip=%aaa% tokens=%bb%" %%i in (test.txt) do echo %%i
  5. pause
复制代码

作者: edmond    时间: 2010-9-16 19:04

谢谢,但是 为什么 变量延迟开启后不是 !!呢?
作者: TX_kakashi    时间: 2010-9-16 19:50

开变量延迟是个习惯,不过举得例子比较简单,不需要变量延迟,普通变量就可以用了。不过实际情况还是需要用到变量延迟的,lz自行修改一下便可。
作者: edmond    时间: 2010-9-16 20:20

@echo off
setlocal enabledelayedexpansion
for /l  %%a in (1,1,10) do (set n=!random! %% 3
     for /f "delims=~ skip=%n%" %%i in (1.txt) do (echo %%i)
)
pause
例如 此时 将无法实现
作者: TX_kakashi    时间: 2010-9-16 21:36     标题: 回复 5楼 的帖子

此时你的第2个for是套嵌在第一个for内,属于复合语句,你代码中的变量n是在复合语句中被赋值,所以在这里你必须要用变量延迟,也就是!n!。我之前所举得例子不属于复合语句,所以没必要用变量延迟。
作者: edmond    时间: 2010-9-16 21:44

如果 使!n! 就提示错误啊
作者: TX_kakashi    时间: 2010-9-16 22:06

尝试了N次,才发现for里面参数如果使用变量延迟就出现错误,只支持%n%等普通变量。解决办法就是把赋值语句不放在复合语句中便可。

[ 本帖最后由 TX_kakashi 于 2010-9-16 22:09 编辑 ]
作者: bluewing009    时间: 2010-9-17 00:08

这个可以从坛子里变量延迟的定义和开启原因上理解。
作者: 随风    时间: 2010-9-17 02:11

老问题了,
for 。。。。。%%a in
不能用 !!引用变量,也不能用 for 的 %%i  变量。
作者: Batcher    时间: 2010-9-17 09:00     标题: 回复 8楼 的帖子

可以试试把它拿出来,call一下。
作者: TX_kakashi    时间: 2010-9-17 09:18

我已经把set拿出来call了,似乎程序已然不认识%n%啊,只认!n!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l  %%a in (1,1,10) do (
  4.      call :_set
  5.      echo !n!
  6.      echo %n%
  7.      pause
  8.      for /f "delims=~ skip=!n!" %%i in (1.txt) do (echo %%i)
  9. )
  10. pause
  11. :_set
  12. set/a n=%random%%%3
  13. exit/b
复制代码

作者: batman    时间: 2010-9-17 16:49     标题: 请看下面的示例:

  1. @echo off
  2. for /l %%a in (1,1,5) do call :lp %%a
  3. pause>nul&goto :eof
  4. :lp
  5. for /f "tokens=%1" %%a in ('tasklist') do echo %%a
复制代码

作者: TX_kakashi    时间: 2010-9-18 14:12     标题: 回复 13楼 的帖子

使用参数变量,这个方法很巧妙啊
作者: 77七    时间: 2023-10-13 13:22

  1. @echo off
  2. set n=1
  3. setlocal enabledelayedexpansion
  4. cmd /q /c for /f "skip=!n! delims=" %%a in ('type "%~f0"') do echo %%a
  5. pause
复制代码

作者: qixiaobin0715    时间: 2023-10-13 15:27

回复 15# 77七
真有你的,把这么早的帖子给翻了出来。实际上可以换一个思路就没这么复杂,不使用skip而用more,!n!,%n%,%%a都可以适用:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,5) do (
  4. set /a n+=1
  5. for /f "delims=" %%b in ('more +!n! 123.txt') do echo,%%b
  6. )
  7. pause
复制代码

作者: 77七    时间: 2023-10-13 18:54

回复 16# qixiaobin0715


  谢谢大佬指点!昨天在写代码的时候想用到 skip=!n!,发现失败,今天通过搜索找到的这个帖子。
  1. @echo off
  2. set n=1
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%b in ("=") do (
  5. cmd /q /c "for /f "skip=!n! delims=%%b" %%a in ('type "%~f0"') do echo %%a"
  6. )
  7. pause
复制代码


  1. @echo off
  2. for /d %%d in (*) do (
  3. cmd /q /c "for /r "%%d" %%i in (*) do echo %%i"
  4. )
  5. pause
复制代码





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