Запись в файл в пакетном режиме - PullRequest
0 голосов
/ 12 апреля 2020

Я настроил приложение для пары друзей и меня в пакетном режиме с помощью системы автоматического обновления, но мне нужно добавить строку кода в систему автоматического обновления. Я решил полностью переписать файл, требуется много времени, чтобы добавить «echo» из каждой строки и «>> text.txt» в конце каждой строки и добавить «^» при необходимости, поэтому мне было интересно если бы был более простой способ записи большого количества кода в файл в пакетном режиме. Пример:

@echo off
rem I need a way to do the following without adding 'echo' and '>>text.txt'

echo echo Checking for updates... >text.txt
echo echo 1.4 ^>^>new.txt >>text.txt
echo ping localhost -n 2 ^>nul >>text.txt
rem and so on and so on.

Или, если есть способ просто добавить новую строку кода в определенном c месте в файле, это также поможет! Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Если я правильно понимаю, вы можете сделать следующее:

  • в пакетном файле, добавляя к каждой строке текста, который вы хотите вывести, :::: (это недопустимая метка, которая будет игнорироваться);
  • , затем используйте следующий код:

    rem // Redirect to file:
    > "text.txt" (
        rem // Find all lines that begin with `::::` and loop over them:
        for /F "delims=" %%T in ('findstr "^::::" "%~f0"') do (
            rem // Store currently iterated line:
            set "TEXT=%%T"
            rem // Toggle delayed expansion to avoid loss of `!`:
            setlocal EnableDelayedExpansion
            rem // Remove `::::` prefix and output remaining line:
            echo(!TEXT:*::::=!
            endlocal
        )
    )
    

    замените set "TEXT=%%T" на call set "TEXT=%%T", если вы хотите включить процентное расширение в возвращаемом тексте (например, он может содержать %~nx0, который затем будет расширен до имени файла скрипта).

Я часто использую эту технику (без вывода перенаправление) для справочных систем в моих пакетных файлах (/?).

0 голосов
/ 13 апреля 2020

Ваш вопрос

Мне нужен способ сделать следующее без добавления echo и >>text.txt

В сценарии используется символ продолжения строки, символ каретки ^.
Первый символ после каретки ^ всегда экранирован, как и символы перевода строки:

@echo off
SETLOCAL EnableDelayedExpansion

call :init

>text.txt (
echo @echo off%NL%
Checking for updates...%NL%
>^>new.txt echo 1.4%NL%
>NUL ping localhost -n 2
)

ENDLOCAL
exit /b

:init
( set LF=^
%= 0X0D FORM FEED =%
)
::0X0A Carriage Return
FOR /F %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"

::Create newline/line continuation character
set ^"NL=^^^%LF%%LF%^%LF%%LF%^^" %= Unix-Style Endings \n =%
::set ^"NL=%CR%^^^%LF%%LF%^%LF%%LF%^^" %= Windows-Style Endings \r\n =%
exit /b

Переменная %LF% является экранированным переводом строки, а %NL% это экранированный %LF% плюс экранированный символ ^ для продолжения строки.

Код

>^>new.txt echo 1.4%NL%
>NUL ping localhost -n 2

может показаться странным. Почему первая карета ^ не экранирована?
Поскольку %NL% уже экранирована от нее.
Источники:

0 голосов
/ 13 апреля 2020

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

@(  Echo @Echo Checking for updates...
    Echo @(Echo 1.4^)^>^>"new.txt"
    Echo @(%__AppDir__%ping.exe LocalHost -n 2^)^>NUL
)>"text.txt"

Существуют и другие возможности, но в настоящее время, основанные на из-за недостатка информации в вашем вопросе, я не хочу расширяться в настоящее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...