[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 terse 于 2012-3-6 18:53 编辑

回复 45# CrLf
还是不以为这样的流程 是取文件的16进制
我以为还应用等大空文件 不是吗?(当然这里不讨论这个话题了)

TOP

本帖最后由 neorobin 于 2014-10-17 17:29 编辑

回复 40# terse

有一个问题, 分号 : 不能处理

我做了以下测试  (WinXP 32bit 简体中文版 和 Win7 64bit 简体中文版)
  1. @echo off
  2. echo 1 & for /f "delims=" %%a in (";") do echo %%a
  3. echo 2 & for /f "delims=" %%a in (";.") do echo %%a
  4. echo 3 & for /f "delims=" %%a in (".;") do echo %%a
  5. echo 4 & for /f "delims=" %%a in (".;.") do echo %%a
  6. pause
复制代码
得到输出为
  1. 1
  2. 2
  3. 3
  4. .;
  5. 4
  6. .;.
复制代码
我认为是 for /f 把分号 ;  当成了默认的行注释符(以此字符在行首, 将略过一行)

微软官方文档 eol 字符的解释, 我不认同
eol=c    Specifies an end of line character (just one character).

http://technet.microsoft.com/en-us/library/bb490909.aspx

但是这里的描述与事实是相符的
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
This command parses each line in Myfile.txt, ignoring lines that begin with a semicolon and passing the second and third token from each line to the FOR body (tokens are delimited by commas or spaces).

我尝试用 0x20--0x7E 范围之外的字符来做这个默认的 eol 字符, 比如 0x08,  0x20--0x7E 范围内字符便都可正常获取了, 测试代码如下:
  1. @echo off & mode 80,300
  2. set "ASCII_20_7E=                                 !"#$%%^&'()*+,-./0123456789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdefghijklmnopqrstuvwxyz{^|}~"
  3. set ASCII_20_7E
  4. setlocal enabledelayedexpansion
  5. set /a cnt=0x20
  6. for /l %%i in (0x20 1 0x7e) do (
  7.     for /f "eol=delims=" %%j in ("!ASCII_20_7E:~%%i,1!") do (
  8.         if "%%j"=="!" echo ASCII-33
  9.         if "%%j"=="^" echo ASCII-94
  10.         echo !cnt!  [%%j]
  11.         set /a cnt+=1
  12.     )
  13. )
  14. pause
复制代码
1

评分人数

    • terse: 谢谢指正,&quot;;&quot; 应该存在技术 + 1

TOP

回复 47# neorobin
谢谢neorobin 指教了
对于 ";" 问题记得以前也讨论过处理   有时候用 FINDSTR /n 处理文件
当然设置 eol 也不失为一好的方法
唉 总是犯此类错
就此题的话 原方法不变的话 修改FOR为下面
  1.     for /f "tokens=1*" %%j in ("$ !str:~%%i,1!") do (
  2.         if "%%k" neq "" (
  3.            if "!#%%k!" neq "" (
  4.               if "!#%%k!" lss "%%k" (set Ans=!Ans! %%k-!$%%k!) else set Ans=!Ans! %%k-!$#%%k!
  5.            ) else if "!$%%k!" neq "" (set Ans=!Ans! %%k-!$%%k!)else set Ans=!Ans! %%k-61
  6.         ) else set Ans=!Ans! %%k-33
  7.     )
复制代码

TOP

本帖最后由 CrLf 于 2014-10-17 20:37 编辑

回复 47# neorobin


"eol=delims=" 设置的是 eol=d,可以这样:
  1. for /F "tokens=2,3* delims=,"eol^= %%a in .....
复制代码

TOP

本帖最后由 neorobin 于 2014-10-17 22:59 编辑

回复 49# CrLf

不是 d

= 和 d 之间有一个退格符, 在论坛上不可见, 但可以用 点击 论坛的 复制代码 正常拷贝

不用不可见字符, 下面这样也可以, 0x20--0x7E 内的字符都不会被看作 eol 字符
  1. for /f delims^=^ eol^= %%j in ("!var!") do ...
复制代码

TOP

返回列表