返回列表 发帖
回复 31# DAIC


    我觉得你发错地方了~

TOP

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

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

TOP

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

TOP

回复 33# liero1982


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

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

评分人数

TOP

回复 34# CrLf


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

TOP

回复 35# liero1982


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

TOP

回复 35# liero1982


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

TOP

空设备真的是空的吗
pause<nul
https://pc.woozooo.com/mydisk.php

TOP

返回列表