#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=[]