批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖
回复 31# DAIC


    我觉得你发错地方了~

TOP

在文本某行中插入字符(支持任意字符,保留空行)

本帖最后由 tkaven 于 2012-3-20 18:26 编辑
  1. @echo off&color a&setlocal enabledelayedexpansion
  2. ::用法 call :insert "要修改的本文文档路径" "在哪一行下面插入文字" "所要插入的文字"
  3. call :insert "C:\Users\Administrator\Desktop\新建 Text Document.txt" "5" "我好喜欢你啊,哈哈哈"
  4. endlocal
  5. echo 操作完成,按任意键退出&pause>nul
  6. exit
  7. :insert
  8. FOR /F %%l in ('find /c /v ""^< %1') do (
  9. for /l %%a in (1 1 %%l) do (
  10. set /p str=
  11. set /a 当前行=当前行+1
  12. if !当前行! GTR %~2 (
  13. echo.!str!
  14. ) else (
  15. if !当前行! EQU %~2 (echo.!str!&echo.%~3) else (echo.!str!)
  16. )
  17. set str=
  18. )
  19. )< %1 >> "%~d1%~p1%~n1_已处理%~x1"
  20. goto :eof
复制代码

TOP

问:
  1. dir | set /p v=0
复制代码
这句是不能达到获取命令输出首行文字的目的的。读了楼主的分析,估计是因为只有cr没有lf的缘故,如何通过命令补一个lf让set /p捕获前文输出呢?

TOP

回复 33# liero1982


与换行符无关,是父进程不能获取子进程变量环境的原因,解释如下:

这样实际上是可以获取到的:
  1. dir | set /p VAR=^& set VAR
  2. ::此处已经捕获变量
  3. pause
  4. set VAR
  5. ::此处变量消失
  6. pause
复制代码
为什么会有这种现象,是因为管道是前后两个进程通信,cmd 如果发现前后的语句是内部命令(或用 & | && || 连接的代码块),就会启动一个 cmd 去执行这一部分
所以上面的代码相当于:
  1. cmd /c dir | cmd /c "set /p VAR=& set VAR"
复制代码
也就是说,VAR 变量是在被管道启动的子进程 cmd.exe 中赋值的,只在子进程中有效,当前运行的父进程 cmd.exe 是获取不到的
1

评分人数

TOP

回复 34# CrLf


    谢谢,受教了;那按照这个思路,是不是就真没办法用一条简单的语句实现命令输出到变量(我现在只知道用 临时文件 或者用 for /f)

TOP

回复 35# liero1982


    可以试试 conset、CSet、seti 之类的第三方工具,除此之外没有简洁的办法了

TOP

回复 35# liero1982


    可以学习并使用PowerShell用它来取代BAT

TOP

返回列表