CMD到已建立的文本文件,而不会覆盖并在其自己的行上



我有点棘手,时间紧迫。以下方面存在一些问题:

我有一个预先建立的txt文件。我需要运行几个通用的命令提示符,然后这些命令提示符将被添加到所述文件中预先存在的数据的ONTOP中,而不会被覆盖。此外,我需要在输出之前添加信息。例如,假设我在Windows7中使用以下两个命令:

tzutil /g
&
hostname

将输出:

US Mountain Standard Time
&
MyComputer

我需要将这两个输出添加到它们自己的行中,即文件中预先存在的数据的ONTOP中。这些基本上将被用作报头信息。我还需要在输出前添加标签,例如:

timezone:US Mountain Standard Time
hostname:MyComputer
ORIGINAL DATA NOT TO BE OVERWRITTEN
ORIGINAL DATA NOT TO BE OVERWRITTEN
ORIGINAL DATA NOT TO BE OVERWRITTEN
ORIGINAL DATA NOT TO BE OVERWRITTEN

只要能找到最实用的方法,我们将不胜感激。每当我尝试这样做时,我总是会遇到多个问题。

可能最简单的方法是以下命令行(cmd(:

(< nul set /P ="timezone:" & tzutil /G & echo/& < nul set /P ="hostname:" & hostname & more +2 "file.txt") > "file.txt.tmp"
move /Y "file.txt.tmp" "file.txt"

作为一个批处理文件,我会这样写:

(
< nul set /P ="timezone:"     & rem // (write text without line-break at the end)
tzutil /G                     & rem // (write the time zone name)
echo/&                          rem // (append a line-break since `tzutil` does not)
< nul set /P ="hostname:"     & rem // (write text without line-break at the end)
hostname                      & rem // (write the host name with trailing line-break)
more +2 "file.txt"            & rem // (return file content except first two lines)
) > "file.txt.tmp"                & rem // (redirect to a temporary file)
move /Y "file.txt.tmp" "file.txt" & rem // (move temporary file onto original one)

请注意,输入文件包含的行数必须少于64K,每行数必须短于64K个字符。

将页眉打印到一个新文件中,然后键入现有文件中页眉后面需要的内容。然后,您可以用旧文件的文件名对新文件进行REN,以获得您想要的结果。我不知道还有什么其他方法可以批量完成。

对于输出前面的标签,请尝试:

FOR /F %%A IN ('tzutil /g') DO ECHO timezone:%%A >> output.txt

这可以很容易地完成,我先写前两行,然后从当前文件中复制除前两行之外的所有内容。这将被写入一个临时文件,该文件将被移动到原始文件名。

将THEFILE的值更改为您的文件名。

===repheader.bat

@echo off
SETLOCAL
SET "THEFILE=C:srctcurrentfile.txt"
SET "TEMPFILE=%TEMP%repheader.tmp"
(   FOR /F %%A IN ('TZUTIL /g') DO (ECHO timezone:%%~A)
FOR /F %%A IN ('hostname') DO (ECHO hostname:%%~A)
FOR /F "delims= skip=2" %%A IN ('TYPE "%THEFILE%"') DO (ECHO %%~A)
) >"%TEMPFILE%"
MOVE /Y "%TEMPFILE%" "%THEFILE%"
ENDLOCAL
EXIT /B 0

如果您真的想要一个powershell解决方案,这里有一个。。。[grin]

它的作用。。。

  • 设置要使用的文件名
  • 创建用于测试的文件
    当您准备使用自己的测试文件时,删除或禁用整个#region/#endregion
  • 获取时区、主机名和目标文件的内容
    这不会显示tz偏移量或标准/夏令时状态
  • 为3个值创建CCD_ 2;将这些值填入
  • 修剪掉以某种方式添加的两行空行
  • 将新内容发送到旧文件
    这将覆盖原始内容。这让我很紧张。。。您可能需要添加一个备份步骤来保留原始步骤

代码。。。

$InFile = "$env:TEMPJonnyDavy_KeepOrignalLines.txt"
#region >>> create a test file
#    when ready to do this for real, remove the entire "#region/#endregion" block
@'
1st line to keep.
Line to keep, the 2nd.
Third one.
Last to keep.
'@ | Set-Content -LiteralPath $InFile
#endregion >>> create a test file
$TimeZone = (Get-TimeZone).Id
$HostName = $env:COMPUTERNAME
$FileContent = Get-Content -LiteralPath $InFile -Raw
(@'
TimeZone : {0}
HostName : {1}
{2}
'@ -f $TimeZone, $HostName, $FileContent).Trim() |
Set-Content -LiteralPath $InFile

重写文件的内容。。。

TimeZone : Central Standard Time
HostName : [MySysName]
1st line to keep.
Line to keep, the 2nd.
Third one.
Last to keep.