[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 11# weichenxiehou


这样可以免去多余的空格:
>>new.txt echo,%odd%
echo>>new.txt,%odd%

TOP

回复 8# CrLf


向版主学习
能否讲解下为什么要用findstr呢,是为了兼容空行吗,但是空行跟下面的空字符串判断有冲突怎么办?还有setlocal+endlocal在这里是怎样工作的呢?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f %%a in (a.txt) do (
  4.     setlocal
  5.     set /p a=
  6.     set /p b=
  7.     if "!b!" neq "" (
  8.         echo,!b!
  9.     )
  10.     if "!a!" neq "" (
  11.         echo,!a!
  12.     )
  13.     endlocal
  14. ))<a.txt
复制代码

TOP

不好意思,手快没考虑清楚...应该是:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f %%a in ('find /c /v ""^<a.txt') do (
  3.    for /l %%b in (1 2 %%a) do (
  4.       set a=&set b=
  5.       set /p a=
  6.       set /p b=
  7.       echo !b!&echo !a!
  8.    )
  9. ))<a.txt>b.txt
复制代码
如果要修改多个文本,改一下就行了:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (*.*) do (
  3.    (for /f %%a in ('find /c /v ""^<a.txt') do (
  4.       for /l %%b in (1 2 %%a) do (
  5.          set a=&set b=
  6.          set /p a=
  7.          set /p b=
  8.          echo !b!&echo !a!
  9.       )
  10.    ))<%%i>$
  11.    move $ "%%i"
  12. )
复制代码
findstr 确实是为了兼容空行,但是此处应该直接用 find 获取行数比较简单,我把两种效果的思路搞混了。
至于 setlocal 和 endlocal 则是为了开闭一个临时的变量表用于临时保存变量,避免影响之后的操作。其实也不够严谨,因为无法保证 setlcoal 之前 变量a 和变量b 都为空,所以还是应该直接用 set 清空变量

TOP


多谢各位鼎力相助!
来日慢慢图报!
有创新,多创新;无创新,多模仿;无模仿,多坚持

TOP

不好意思,手快没考虑清楚...应该是:如果要修改多个文本,改一下就行了:findstr 确实是为了兼容空行,但是 ...
CrLf 发表于 2011-9-14 11:00



    测试了一下,好像运行错误!找不到文件,我是放在一个文件夹内运行的
有创新,多创新;无创新,多模仿;无模仿,多坚持

TOP

不好意思,手快没考虑清楚...应该是:如果要修改多个文本,改一下就行了:findstr 确实是为了兼容空行,但是 ...
CrLf 发表于 2011-9-14 11:00



    可以成功运行。
但如果存在空行就会出错。

版主能说明一下运行的原理吗?

set /p a=<a.txt 这样子不是只有第一行会赋给变显吗?

TOP

回复 21# hankerer
试试下面的就应该懂了。。
  1. @echo off
  2. for /l %%i in (1 1 10) do echo,%%i>>a.txt
  3. type a.txt
  4. (for /l %%i in (1 1 10) do set/p _a%%i=)<a.txt
  5. set _a
  6. pause>nul
复制代码
看得多说得多,远比不上写得多。

TOP

回复  hankerer
试试下面的就应该懂了。。
weichenxiehou 发表于 2011-9-14 18:15



    感谢。我的理解是所有的set /p 操作都保存在缓存里,最后由a.txt一次性输入。每行正好有一个回车换行来模拟输入。不知道理解的对不对。

TOP

回复 23# hankerer
理解得八九不离十吧……
看得多说得多,远比不上写得多。

TOP

  1. sed -r "N;s/(.*)\n(.*)/\2\n\1/" test.txt
复制代码

TOP

  1. gawk "{if(getline s)print s;print}" a.txt
复制代码

TOP

回复 15# weichenxiehou


    你好我想请教你一个问题
假如是用这个批处理一个文件夹里面的所有txt,然后将处理结果输出到新的文件夹

@echo off&setlocal enabledelayedexpansion
set n=&set odd=
(for /f "delims=" %%i in (dir /a-d/b *.txt') do (
  set/a n+=1,m=n%%2
  if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
))md new
if %m% equ 1 echo,%odd% >>new.txt

这样好像不行,将他们的结果输出到新的文件夹如何表示的
1

评分人数

    • CrLf: 请将超过一行的代码用 code 括起来PB -2
有创新,多创新;无创新,多模仿;无模仿,多坚持

TOP

回复 27# fanfande
  1. @echo off&setlocal enabledelayedexpansion
  2. md new
  3. set n=&set odd=
  4. (for /f "delims=" %%i in (a.txt) do (
  5.   set/a n+=1,m=n%%2
  6.   if !m! equ 1 (set "odd=%%i") else echo,%%i&echo,!odd!
  7. ))>new\result.txt
  8. if %m% equ 1 echo,%odd% >>new\result.txt
复制代码

TOP

回复 26# FOR


    假如是用这个批处理一个文件夹里面的所有txt,然后将各自的处理结果输出到新的文件夹内,如何写呢?谢谢你哦!
有创新,多创新;无创新,多模仿;无模仿,多坚持

TOP

回复 28# awk


   
您上面这个还是仅仅处理a.txt然后把结果输出到新的文件夹以result.txt
假如是用这个批处理一个文件夹里面的所有txt,然后将各自的处理结果输出到新的文件夹内,如何写呢?
我用for /f "delims=" %%I in ('*.txt') do ( 不行,没成功,我在死板硬套,
谢谢你哦!
有创新,多创新;无创新,多模仿;无模仿,多坚持

TOP

返回列表