Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   удаление строки из файла (http://forum.oszone.net/showthread.php?t=271154)

HFShak 01-11-2013 14:44 2245405

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

Вот код:

Код:

@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 2245431

Цитата:

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

Зачем?

Цитата:

Цитата HFShak
Код:

: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 2245466

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

Iska 01-11-2013 17:03 2245494

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

Хотите список «проблемных» — делайте их вывод в другой файл, наподобие:
читать дальше »
Код:

                if exist "\\%%~i\C$\Windows" (
                        …
                ) else (
                        >"%~dp0ErrHosts.txt" echo %%~i
                )


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

Iska 03-11-2013 01:16 2246393

Поправляюсь. Конечно не:
Код:

>"%~dp0ErrHosts.txt" echo %%~i
а:
Код:

>>"%~dp0ErrHosts.txt" echo %%~i
HFShak, приношу Вам свои извинения.

Гуллипут 05-11-2013 21:14 2248122

Я бы сделал так:

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
)


Время: 18:33.

Время: 18:33.
© OSzone.net 2001-