Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理文件-在文件中插入行_Windows_Batch File_Cmd - Fatal编程技术网

Windows 批处理文件-在文件中插入行

Windows 批处理文件-在文件中插入行,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试使用以下代码(从)将一行插入到文件中 我的问题是该文件有注释行(以分号开头),需要保留这些注释行 ; directory during network startup. This statement must indicate a local disc ; drive on your PC and not a network disc drive. LOCALDRIVE=C:\TEMP; ; PANELISATION PART/NET NAMING CONVENTION ; When

我正在尝试使用以下代码(从)将一行插入到文件中

我的问题是该文件有注释行(以分号开头),需要保留这些注释行

; directory during network startup. This statement must indicate a local disc
; drive on your PC and not a network disc drive.
LOCALDRIVE=C:\TEMP;

; PANELISATION PART/NET NAMING CONVENTION
; When jobs are panelised, parts/nets are renamed for each panel step by
当我运行批处理文件时,它会忽略分号行,因此我只得到:

LOCALDRIVE=C:\TEMP;

要保留分号行,我需要做什么?

看起来您只回显了行分隔符,而不是整行:

echo%%l>>%tempfile%


我对ms dos脚本很生疏,所以我不能给你更多的信息。

看起来你只是在回显行分隔符,而不是整行:

echo%%l>>%tempfile%


我对ms dos脚本很生疏,所以我不能给你更多的信息。

看起来你只是在回显行分隔符,而不是整行:

echo%%l>>%tempfile%


我对ms dos脚本很生疏,所以我不能给你更多的信息。

看起来你只是在回显行分隔符,而不是整行:

echo%%l>>%tempfile%


我对ms dos脚本很生疏,所以我不能给你更多的信息。

默认情况下,
FOR
命令处理
作为行尾字符,因此所有以
开头的行正在被忽略

eol=
添加到
FOR
命令中,如下所示:

for /f "eol= delims=" %%l in (%inputfile%) do (

默认情况下,FOR
命令处理
作为行尾字符,因此所有以
开头的行正在被忽略

eol=
添加到
FOR
命令中,如下所示:

for /f "eol= delims=" %%l in (%inputfile%) do (

默认情况下,FOR
命令处理
作为行尾字符,因此所有以
开头的行正在被忽略

eol=
添加到
FOR
命令中,如下所示:

for /f "eol= delims=" %%l in (%inputfile%) do (

默认情况下,FOR
命令处理
作为行尾字符,因此所有以
开头的行正在被忽略

eol=
添加到
FOR
命令中,如下所示:

for /f "eol= delims=" %%l in (%inputfile%) do (

EOL选项确定要忽略的行。默认值是分号。如果您知道一个字符永远不会出现在行的第一个位置,那么您可以简单地将EOL设置为该字符。例如,如果您知道一行不能以
|
开头,则可以使用

for /f "eol=| delims=" %%l in (%inputfile%) do ...
有一种笨拙的语法完全禁用了EOL,也禁用了DELIMS:

for /f delims^=^ eol^= %%l in (%inputfil%) do ...
请注意,FOR/F始终丢弃空行,因此上述任一情况都会导致:

; directory during network startup. This statement must indicate a local disc
; drive on your PC and not a network disc drive.
LOCALDRIVE=C:\TEMP;
; PANELISATION PART/NET NAMING CONVENTION
; When jobs are panelised, parts/nets are renamed for each panel step by
如果要保留空行,则需要使用技巧。使用FIND或FINDSTR在每行之前插入行号,然后使用展开查找/替换删除行号。现在你知道了,这一行永远不会以
开头,因此您可以忽略EOL选项

for /f "delims=" %%L in ('findstr /n "^" "%inputfile%"') do (
  set "ln=%%L"
  set "ln=!ln:*:=!"
  REM You now have the original line, do whatever needs to be done here
)
但是以上所有内容都有一个潜在的问题,即在扩展FOR变量时启用了延迟扩展,这意味着任何包含
的内容将被损坏。要解决此问题,必须在循环中打开和关闭延迟扩展:

setlocal disableDelayedExpansion
...
for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
  set "ln=%%L"
  setlocal enableDelayedExpansion
  set "ln=!ln:*:=!"
  REM You now have the original line with ! preserved, do whatever needs done here
  endlocal
)
此外,当回显空行时,它将打印出
ECHO处于关闭状态
,除非您执行以下操作

echo(!ln!
每次在循环中使用
>
时,打开并将写入光标定位到末尾都需要时间。将整个操作括在一组括号中并重定向一次会更快。此外,还可以使用单个移动命令替换DEL和REN

下面是最后一个健壮的脚本:

@echo off
setlocal disableDelayedExpansion
set "inputfile=variables.txt"
set line=0
>"%inputfile%.new" (
  for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
    set "txt=%%L"
    set /a line+=1
    setlocal enableDelayedExpansion
    set "txt=!txt:*:=!"
    if !line! equ 4 (
      echo New line content here
    ) else (
      echo(!txt!
    )
    endlocal
  )
)
move /y "%inputfile%.new" "%inputfile%" >nul
endlocal
对于这样一项简单的任务来说,这是一项非常艰巨的工作,它需要大量的神秘知识

有一个更快的黑客,只要

  • 前4行不超过1021字节
  • 前3行都没有需要保留的尾随控制字符
  • 其余的行没有必须保留的
    字符(更多的行将
    转换为空格字符串)
@echo关闭
setlocal enableDelayedExpansion
设置“inputfile=variables.txt”
>%inputfile%。新建(

EOL选项确定要忽略的行。默认值为分号。如果您知道某个字符永远不会出现在行的第一个位置,则可以简单地将EOL设置为该字符。例如,如果您知道某行不能以
|
开头,则可以使用

for /f "eol=| delims=" %%l in (%inputfile%) do ...
有一种笨拙的语法完全禁用了EOL,也禁用了DELIMS:

for /f delims^=^ eol^= %%l in (%inputfil%) do ...
请注意,FOR/F始终丢弃空行,因此上述任一情况都会导致:

; directory during network startup. This statement must indicate a local disc
; drive on your PC and not a network disc drive.
LOCALDRIVE=C:\TEMP;
; PANELISATION PART/NET NAMING CONVENTION
; When jobs are panelised, parts/nets are renamed for each panel step by
如果要保留空行,请使用技巧。使用“查找”或“查找”命令在每行之前插入行号,然后使用“扩展查找/替换”删除行号。现在您知道该行从不以
开头,因此可以忽略下线选项

for /f "delims=" %%L in ('findstr /n "^" "%inputfile%"') do (
  set "ln=%%L"
  set "ln=!ln:*:=!"
  REM You now have the original line, do whatever needs to be done here
)
但上述所有问题都存在一个潜在问题,即在展开FOR变量时启用了延迟展开,这意味着任何包含
的内容都将被损坏。要解决此问题,必须在循环中打开和关闭延迟展开:

setlocal disableDelayedExpansion
...
for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
  set "ln=%%L"
  setlocal enableDelayedExpansion
  set "ln=!ln:*:=!"
  REM You now have the original line with ! preserved, do whatever needs done here
  endlocal
)
此外,当回显空行时,它将打印出
ECHO处于关闭状态
,除非您执行以下操作

echo(!ln!
每次在循环中使用
>
时,打开并将写入光标定位到末尾都需要时间。将整个操作括在一组括号中并重定向一次会更快。此外,您还可以使用单个移动命令替换DEL和REN

下面是最后一个健壮的脚本:

@echo off
setlocal disableDelayedExpansion
set "inputfile=variables.txt"
set line=0
>"%inputfile%.new" (
  for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
    set "txt=%%L"
    set /a line+=1
    setlocal enableDelayedExpansion
    set "txt=!txt:*:=!"
    if !line! equ 4 (
      echo New line content here
    ) else (
      echo(!txt!
    )
    endlocal
  )
)
move /y "%inputfile%.new" "%inputfile%" >nul
endlocal
对于这样一项简单的任务来说,这是一项非常艰巨的工作,它需要大量的神秘知识

有一个更快的黑客,只要

  • 前4行不超过1021字节
  • 前3行都没有需要保留的尾随控制字符
  • 其余的行没有必须保留的
    字符(更多的行将
    转换为字符串)