Как предотвратить появление пустых строк при повторении файла .txt с использованием цикла FOR в пакетном скрипте

#windows #for-loop #batch-file #space

#Windows #цикл for #пакетный файл #Космос

Вопрос:

У меня есть один текстовый файл с текстом и несколькими пустыми строками-пробелами. При выполнении некоторых операций в .txt-файле с помощью цикла for обнаруженные, изначально содержавшие пустые пробелы строки исчезли.

Пример: у меня есть temp.txt файл с приведенными ниже входными данными :

 #
 Require
 #

 #Rel task
 #
 
 HOST_ID=

 ACTIVATE_ID

 #
 #
  

После выполнения некоторых операций с использованием цикла FOR я получаю результат в том же файле .txt, как показано ниже :

 #
 Require
 #
 #Rel task
 #
 HOST_ID=56767Ether
 ACTIVATE_ID
 #
 #
  

Итак, я не хочу игнорировать эти пустые пробелы.
Я попытался использовать usebacq ключевое слово в цикле for, но не сработало.
Я перепробовал все возможные способы сделать это, но каждый раз терпел неудачу.

Вот мой код :

 @echo off

setlocal enableextensions disabledelayedexpansion
set rem=56767Ether
set "textFile=temp.txt"

for /f "delims=" %%i in ('type "%textFile%" ^amp; break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    
    if !line!==HOSTID= (
        set "foo=!line:HOSTID=HOSTID=%rem%!"
        set "line=!foo:~0,-1!"
    )
    >>"%textFile%" echo(!line!
    endlocal
)
:EXIT
pause
  

В приведенном выше коде я пытаюсь добавить некоторую дополнительную строку перед предоставленной строкой в том же файле .txt.

Комментарии:

1. @echo off это не bash. Я попытался удалить ненужные теги

2. @Jetchisel что такое Powah shell? Вы имеете в виду powershell ? это далеко не batch-file код.

3. for /f "tokens=1,* delims=[]" %%i in ('type "%textFile%" ^| find /v /n "" ^amp; break ^> %textFile%') do ( затем используйте %%j вместо %%i

4. @Gerhard. У меня это работает. Большое спасибо за вашу помощь. Не могли бы вы, пожалуйста, сказать мне, почему вы использовали [] в delims.

5. for /F по замыслу игнорирует пустые строки, поэтому find /N может использоваться для добавления [ номера плюс строки плюс ] , из-за чего строки больше не кажутся пустыми для for /F ; затем префиксы удаляются с помощью опций tokens и delims

Ответ №1:

Вот альтернативный метод, идея которого заключается в том, что вам не нужно отложенное расширение, и (для безопасности) вы не пытаетесь читать из одного файла и записывать в него.

Что он делает, так это сначала определяет, существует ли требуемая строка в файле, если этого не происходит, скрипт закрывается, если это происходит, он устанавливает переменную в номер строки. Затем файл анализируется, выводя содержимое каждой строки нетронутым, за исключением строки, соответствующей сохраненной переменной, где она добавляется %rem% к ней.

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

 @Echo Off
SetLocal EnableExtensions

Set "rem=56767Ether"
Set "textFile=temp.txt"

Set "lineNum="
For /F Delims^=: %%G In ('^""%__AppDir__%findstr.exe" /INR "<HOST_ID=>" "%textFile%" 2^>NUL^"')Do Set "lineNum=%%G"
If Not Defined lineNum GoTo :EOF
For %%G In ("%textFile%")Do Set "_=%%~nG.bak" amp; Copy /Y "%%G" "%%~nG.bak">NUL
(For /F "Tokens=1*Delims=:" %%G In ('^""%__AppDir__%findstr.exe" /N "^" "%_%"^"')Do If %%G NEq %lineNum% (Echo=%%H)Else Echo %%H%rem%)>"%textFile%"
Pause
  

Ответ №2:

Я не уверен, есть ли в вашем файле пробел перед HOST_ID= , как в настоящее время, но в этом примере были добавлены как с пробелом, так и без него:

 @echo off

setlocal enableextensions disabledelayedexpansion
set "rem=56767Ether"
set "textFile=temp.txt"
for /f "tokens=1,* delims=[]" %%i in ('type "%textFile%" ^| find /v /n "" ^amp; break^>"%textFile%"') do (
    set "line=%%j"
    setlocal enabledelayedexpansion
    if "!line!" == "HOST_ID=" set "line=!line!%rem%"
    if "!line!" == " HOST_ID=" set "line=!line!%rem%" 
    echo(!line!
    endlocal
)
:EXIT
pause
  

Разделители используются [] потому, что мы добавляем номера строк, которые вы не видите как [n] , перед каждой записью с помощью find /V /N "" . Таким образом, мы сохраняем пустые строки.

Комментарии:

1. Смотрите описание внизу ответа о delims=[]