CMD в установленный текстовый файл без перезаписи и в собственной строке - PullRequest
0 голосов
/ 05 мая 2020

Я нахожусь в некотором недоумении и нехватке времени. Возникли проблемы со следующим:

У меня есть предварительно установленный текстовый файл. Мне нужно запустить несколько общих c командных запросов, которые затем будут добавлены ONTOP к уже существующим данным в указанном файле без перезаписи. Кроме того, мне нужно добавить информацию перед выводом. Например, предположим гипотетически, что я использую следующие две команды в пределах Windows 7:

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

Любая помощь будет принята с благодарностью, просто пытаюсь найти наиболее практичный способ сделать это. Каждый раз, когда я пытаюсь это сделать, я сталкиваюсь с множеством проблем.

Ответы [ 4 ]

1 голос
/ 06 мая 2020

Это легко можно сделать, написав первые две строки, а затем скопировав все, кроме первых двух строк из текущего файла. Это записывается во временный файл, который будет перемещен в исходное имя файла.

Измените значение THEFILE на ваше имя файла.

=== repheader.bat

@echo off
SETLOCAL
SET "THEFILE=C:\src\t\currentfile.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
1 голос
/ 06 мая 2020

Вероятно, самый простой способ - это следующие командные строки ():

(< 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)

Обратите внимание, что входной файл должен содержать менее 64 КБ строк, каждая из которых должна быть короче 64 КБ символов.

1 голос
/ 06 мая 2020

Распечатайте заголовок в новый файл, затем НАПИШИТЕ все, что нужно, до go после заголовка из существующего файла. Затем вы можете выполнить REN для нового файла с именем старого файла для достижения желаемого результата. Я не знаю другого способа сделать это в пакетном режиме.

Для тегов перед выходами попробуйте:

FOR /F %%A IN ('tzutil /g') DO ECHO timezone:%%A >> output.txt
0 голосов
/ 06 мая 2020

на случай, если вы серьезно настроились на решение powershell, вот одно ... [ ухмылка ]

что оно делает ...

  • устанавливает имя файла для использования
  • создает файл для тестирования
    когда вы будете готовы использовать свой собственный тестовый файл, удалите или отключите весь блок #region/#endregion.
  • получает часовой пояс, имя хоста и содержимое целевого файла.
    при этом не отображается смещение tz ИЛИ стандартное / дневное состояние.
  • создает here-string для 3 значений и заполняет эти значения в
  • обрезает две пустые строки, которые каким-то образом добавляются
  • отправляет новое содержимое в старый файл
    это перезаписывает оригинал. это заставляет меня нервничать ... вы можете добавить шаг резервного копирования, чтобы сохранить оригинал.

код ...

$InFile = "$env:TEMP\JonnyDavy_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.
...