Войти

Показать полную графическую версию : удаление строки из файла


HFShak
01-11-2013, 14:44
Добрый день!
Помогите, пж-ста, добавить в скрипт код удаление строки из файла.
Есть файл с именами компьютеров.
Нужно, чтобы скрипт работал до тех пор, пока все хосты не будут обработаны.

Вот код:

@echo off

:Start
for /F "usebackq tokens=*" %%f in (%~dp0hostnames.txt) do CALL :FUNC %%~f
goto :Start

:FUNC
if exist \\%1\C$\Windows (
md \\%1\C$\TEMP
echo %1 done >> %TEMP%\log.txt

...тут нужно добавить код удалнения хоста %1 из файла hostnames.txt...

) else (
goto :eof
)

Iska
01-11-2013, 15:43
тут нужно добавить код удалнения хоста %1 из файла hostnames.txt »
Зачем?

:Start
for /F "usebackq tokens=*" %%f in (%~dp0hostnames.txt) do CALL :FUNC %%~f
goto :Start
»
Зачем? Почему не просто:
for /F "usebackq tokens=*" %%f in (%~dp0hostnames.txt) do CALL :FUNC %%~f
exit /b
? Например:
@echo off
setlocal enableextensions enabledelayedexpansion

set sHosts=%~dp0hostnames.txt

if exist "%sHosts%" (
for /f "usebackq delims=" %%i in ("%sHosts%") do (
if exist "\\%%~i\C$\Windows" (
md "\\%%~i\C$\Temp"
>>"%Temp%\log.txt" echo [%%~i] done.
)
)
) else (
echo Can't find file [%sHosts%].
)

endlocal
exit /b 0

HFShak
01-11-2013, 16:40
Предположим в файле 3000 хостов, нужен файл, где все "ОК" и файл, со списком оставшихся "проблемных" хостов.
Вызывается функция :FUNC, отрабатывается весь список, записывает в лог обработанные хосты, затем идет возврат к :Start и по новой, но зачем проходить весь список? Нужно только оставшуюся часть. И удобно смотреть сколько осталось обработать.

Iska
01-11-2013, 17:03
HFShak, начнём с того. что в командном языке пакетных файлов отсутствует такая функция, как «удаление строки» (edlin в расчёт не берём). Удаление строк из файла, участвующего в разборе (без его предварительного чтения целиком и передачи по конвейеру) — это вообще интересная штука с не всегда предсказуемым поведением.

Хотите список «проблемных» — делайте их вывод в другой файл, наподобие:
if exist "\\%%~i\C$\Windows" (

) else (
>"%~dp0ErrHosts.txt" echo %%~i
)

Хотите «смотреть сколько осталось» — делайте изначально подсчёт строк в файле, расчёты по мере обработки, включайте результаты подсчётов в вывод на консоль. И только-то.

Iska
03-11-2013, 01:16
Поправляюсь. Конечно не:
>"%~dp0ErrHosts.txt" echo %%~i
а:
>>"%~dp0ErrHosts.txt" echo %%~i
HFShak, приношу Вам свои извинения.

Гуллипут
05-11-2013, 21:14
Я бы сделал так:

copy nul "%temp%\hostnames.tmp"
for /F "usebackq delims=" %%s in ("%~dp0hostnames.txt") do (
if not %1==%%s echo %%s>>"%temp%\hostnames.tmp"
)
move "%temp%\hostnames.tmp" "%~dp0hostnames.txt"



Сейчас перечитал предыдущие посты и понял, что неверно сформулировано задание:
"...тут нужно добавить код удаления хоста %1 из файла hostnames.txt..."
Я и добавил. А надо было здесь сделать только формирование нового файла, с тем, чтобы после цикла им заменить старый:

@echo off

:Start
copy nul "%temp%\hostnames.tmp"
for /F "usebackq tokens=*" %%f in (%~dp0hostnames.txt) do CALL :FUNC %%~f
move "%temp%\hostnames.tmp" "%~dp0hostnames.txt"
goto :Start

:FUNC
if exist \\%1\C$\Windows (
md \\%1\C$\TEMP
echo %1 done >> %TEMP%\log.txt

for /F "usebackq delims=" %%s in ("%~dp0hostnames.txt") do (
if not %1==%%s echo %%s>>"%temp%\hostnames.tmp"
)

) else (
goto :eof
)




© OSzone.net 2001-2012