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

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

Ответить
Настройки темы
CMD/BAT - [решено] for do copy создаёт лишний файл

Старожил


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

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


Изменения
Автор: shadowbat
Дата: 28-09-2022
Вложения
Тип файла: zip test.zip
(716 байт, 0 просмотров)
есть два файла:
file.txt
file_2.txt

при запуске такого батника:
Код: Выделить весь код
@echo off
chcp 1251
::for %%i in ("%CD%\*.txt") do (copy "%%i" "%%~dpni_new%%~xi")
for /R "%CD%" %%i in (*.txt) do (copy "%%i" "%%~dpni_new%%~xi")
создаётся не 2 файла, а 3. один из них лишний с двумя "_new"
Код: Выделить весь код
file.txt
file_2.txt
file_2_new.txt
file_new.txt
file_new_new.txt
(если переименовать file_2.txt в zzz.txt, то ошибка пропадает и создаётся как и положено 2 файла)
(если в батнике поменять _new на -new, то ошибка пропадает и создаётся как и положено 2 файла)

в чём причина такой ошибки?

Отправлено: 09:34, 28-09-2022

 

Аватара для NickM

Ветеран


Contributor


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

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


А какая задача то у Вас?
Или Вы думаете, что кто-нибудь поймёт её из Вашего кода сценария?

Отправлено: 11:00, 28-09-2022 | #2



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

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


Старожил


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

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


Цитата NickM:
А какая задача то у Вас? »
задача - найти причину создания лишнего файла "_new"
если эта причина не будет найдена, то я поменяю "_new" на "-new" в коде и буду с этим жить

Отправлено: 08:15, 29-09-2022 | #3


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата shadowbat:
задача - найти причину создания лишнего файла "_new" »
При некоторых условиях (правильных по синтаксису, но неправильных для корректного кода), в цикле for может образоваться "лишняя" итерация. Как раз, для Вашего случая...
Вот, код, который наглядно отображает эту "лишнюю" итерацию:
Код: Выделить весь код
@echo off
set /a f=5 &:число создаваемых файлов в каталоге
set /a k=0 &:динамический счетчик для наименований файлов
set /a n=0 &:динамический счетчик для подсчета итераций

rem Если отсутствует, создаем каталог TEXT, рядом со сценарием:
set "d1=%cd%\text"
if not exist "%d1%" md "%d1%"

cd "%d1%"
setlocal enabledelayedexpansion
rem Создаем тестовые файлы:
if not exist "*.txt" (
	for /l %%i in (1,1,!f!) do rem: фигня>"!k!.txt"&set /a k+=1
)

rem Проверка лишней итерации в цикле:
echo.Файлов в каталоге:
dir /b/a-d
echo.--------------------------
echo.
echo.Переименование файлов циклом и собственно, "лишняя итерация":
for %%A in (*.txt) do (
	echo %%A

	rem Так проходов n+1 от количества файлов:
	rename "%%A" "!random!.txt"
	
	set /a n+=1
)
echo.
echo Проходов: !n!
echo.--------------------------
echo.
echo.Итоговое число файлов в каталоге:
dir /b/a-d
echo.
pause
Т.е. при наличии 5 текстовых файлов, цикл for выполняет 6 итераций...
Мораль: не выполняйте переименование файлов посредством цикла for, в одном и том же каталоге, где находятся исходные файлы.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 29-09-2022 в 08:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:42, 29-09-2022 | #4


Ветеран


Contributor


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

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


shadowbat, Если интересно не только "почему", но и "как", то
Код: Выделить весь код
@Echo Off
cls
>nul chcp 1251
	For /R "%CD%" %%i in (*.txt) Do >nul (Echo %%i|FindStr /E /I "_new%%~xi" ||copy "%%i" "%%~dpni_new%%~xi")
pause
Exit /B
Код: Выделить весь код
@Echo Off
cls
>nul chcp 1251
	FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "*.txt" /S /A:-D /B ^|FindStr /E /I /V "_new.txt"`) DO >nul copy "%%i" "%%~dpni_new%%~xi"
pause
Exit /B
При повторном запуске этих батников копий _new_new не будет, хотя минус - повторное копирование.
Поэтому лучше использовать xcopy /D
Код: Выделить весь код
@Echo Off
cls
>nul chcp 1251
	FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "*.txt" /S /A:-D /B ^|FindStr /E /I /V "_new.txt"`) DO Echo F|>nul xcopy /D "%%i" "%%~dpni_new%%~xi"
pause
Exit /B
Либо
Код: Выделить весь код
@Echo Off
cls
>nul chcp 1251
	FOR /F "usebackq delims=" %%i IN (`2^>nul Dir "*.txt" /S /A:-D /B ^|FindStr /E /I /V "_new.txt"`) DO (
		If Not Exist "%%~dpni_new%%~xi" >nul copy "%%i" "%%~dpni_new%%~xi"
	)
pause
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-09-2022 в 10:27.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:10, 29-09-2022 | #5


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата shadowbat:
в чём причина такой ошибки? »
Как альтернативу cmd, лучше изучайте powershell, возможностей у него больше... а также, более понятный синтаксис и легче для запоминания.
Ваша задача, на powershell:
Код: Выделить весь код
$folder = '.\TEST'
$filter = '*.txt'
$pattern = '_new'

dir $folder -filter $filter -file|%{
	if($_ -notmatch $pattern){
		copy $_.fullname ($_.directoryname + '\' + $_.basename + $pattern + $_.extension)
	}
}

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:00, 29-09-2022 | #6


Старожил


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

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


megaloman
YuS_2
благодарю за помощь

Отправлено: 16:38, 30-09-2022 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Лишний раздел HDD lunar Хочу все знать 2 06-12-2013 20:22
CMD/BAT - лишний проход цикла kolya17 Скриптовые языки администрирования Windows 1 05-10-2011 21:07
Вирус создаёт на флешке файл "- xXx.exe"... Geliosvamp Лечение систем от вредоносных программ 1 04-12-2009 19:27
Разное - [решено] Лишний диск в системе lunas Microsoft Windows 2000/XP 5 25-12-2007 13:14
[решено] Кто создаёт этот подозрительный файл...? Marsianin Microsoft Windows 2000/XP 8 27-05-2006 12:53




 
Переход