Показать полную графическую версию : удаление строки из файла
Добрый день!
Помогите, пж-ста, добавить в скрипт код удаление строки из файла.
Есть файл с именами компьютеров.
Нужно, чтобы скрипт работал до тех пор, пока все хосты не будут обработаны.
Вот код:
@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
)
тут нужно добавить код удалнения хоста %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
Предположим в файле 3000 хостов, нужен файл, где все "ОК" и файл, со списком оставшихся "проблемных" хостов.
Вызывается функция :FUNC, отрабатывается весь список, записывает в лог обработанные хосты, затем идет возврат к :Start и по новой, но зачем проходить весь список? Нужно только оставшуюся часть. И удобно смотреть сколько осталось обработать.
HFShak, начнём с того. что в командном языке пакетных файлов отсутствует такая функция, как «удаление строки» (edlin в расчёт не берём). Удаление строк из файла, участвующего в разборе (без его предварительного чтения целиком и передачи по конвейеру) — это вообще интересная штука с не всегда предсказуемым поведением.
Хотите список «проблемных» — делайте их вывод в другой файл, наподобие:
if exist "\\%%~i\C$\Windows" (
…
) else (
>"%~dp0ErrHosts.txt" echo %%~i
)
Хотите «смотреть сколько осталось» — делайте изначально подсчёт строк в файле, расчёты по мере обработки, включайте результаты подсчётов в вывод на консоль. И только-то.
Поправляюсь. Конечно не:
>"%~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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.