Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - удаление строки из файла

Ответить
Настройки темы
CMD/BAT - удаление строки из файла

Пользователь


Сообщения: 144
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Вот код:

Код: Выделить весь код
@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
)

Отправлено: 14:44, 01-11-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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

Отправлено: 15:43, 01-11-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 144
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось HFShak, 01-11-2013 в 16:46.


Отправлено: 16:40, 01-11-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Хотите список «проблемных» — делайте их вывод в другой файл, наподобие:
читать дальше »
Код: Выделить весь код
		if exist "\\%%~i\C$\Windows" (
			…
		) else (
			>"%~dp0ErrHosts.txt" echo %%~i
		)

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

Отправлено: 17:03, 01-11-2013 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Поправляюсь. Конечно не:
Код: Выделить весь код
>"%~dp0ErrHosts.txt" echo %%~i
а:
Код: Выделить весь код
>>"%~dp0ErrHosts.txt" echo %%~i
HFShak, приношу Вам свои извинения.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:16, 03-11-2013 | #5


Пользователь


Сообщения: 70
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

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
)

Последний раз редактировалось Гуллипут, 05-11-2013 в 21:24.


Отправлено: 21:14, 05-11-2013 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - удаление строки из файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Удаление принтеров из командной строки denzill Microsoft Windows 2000/XP 45 24-08-2021 23:31
CMD/BAT - [решено] Имя файла из строки копируемого файла. Seryoga204 Скриптовые языки администрирования Windows 20 16-03-2011 21:15
удаление строки Windows из загрузчика Linux Baiker Хочу все знать 7 04-01-2011 04:36
CMD/BAT - [решено] Чтение строки из файла в переменную Николя Скриптовые языки администрирования Windows 42 17-01-2010 19:42
[решено] Удаление строки из файла gregaz AutoIt 2 16-07-2009 18:46




 
Переход