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

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

Ответить
Настройки темы
CMD/BAT - скрипт сравнение файлов и копирования по части имени

Новый участник


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

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


Подскажите с такой проблемой есть 2 папки.
В папке D:\1 лежат файлы 5454_6546464564_56464546666_029(отработан).txt, причем цифры могут быть любые, неизменным остается только статус (отработан) в имени.
В папке D:\2 находятся файлы с такими же именами, но без статуса (отработан)
Собственно нужно сравнить все файлы в обеих папках и скопировать из папки 2 в папку 1 только файлы, у которых нет дублей со статусом (обработан) в папке 1.
Кучу тем пересмотрел, никак не получается. Пока временным решением сделал батник с копированием по времени создания, но это не то. Помогите кто может.

Отправлено: 15:33, 22-01-2020

 

Ветеран


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

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


Цитата mallonih:
причем цифры могут быть любые »
Какие именно — «любые»? 1.txt тоже может быть? Или же, всё-таки, есть определённые правила для количества и порядка цифр, разделённых символом «_»?

Вот тупо по количеству цифр (на WSH):
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder
Dim strDestFolder

Dim objFSO
Dim objRegExp

Dim objFile


If WScript.Arguments.Count = 2 Then
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	strSourceFolder = objFSO.GetAbsolutePathName(WScript.Arguments.Item(0))
	strDestFolder   = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
	
	If objFSO.FolderExists(strSourceFolder) Then
		If objFSO.FolderExists(strDestFolder) Then
			
			Set objRegExp = WScript.CreateObject("VBScript.RegExp")
			
			objRegExp.Pattern = "^\d{4}_\d{10}_\d{11}_\d{3}\.txt$"
			
			For Each objFile In objFSO.GetFolder(strSourceFolder).Files
				If objRegExp.Test(objFile.Name) Then
					If Not objFSO.FileExists(objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(objFile.Name) & "(отработан)." & objFSO.GetExtensionName(objFile.Name))) Then
						objFile.Copy strDestFolder & "\"
					End If
				End If
			Next
		Else
			WScript.Echo "Can't find destination folder [" & strSourceFolder & "]."
			WScript.Quit 3
		End If
	Else
		WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder> <Destination folder>"
	WScript.Quit 1
End If

WScript.Quit 0

Исходный и целевой каталоги задаются аргументами скрипта. Если это всегда одни и те же каталоги — можете «ручками» вписать их, наподобие:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder
Dim strDestFolder

Dim objFSO
Dim objRegExp

Dim objFile


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strSourceFolder = "D:\1"
strDestFolder   = "D:\2"

If objFSO.FolderExists(strSourceFolder) Then
	If objFSO.FolderExists(strDestFolder) Then
		
		Set objRegExp = WScript.CreateObject("VBScript.RegExp")
		
		objRegExp.Pattern = "^\d{4}_\d{10}_\d{11}_\d{3}\.txt$"
		
		For Each objFile In objFSO.GetFolder(strSourceFolder).Files
			If objRegExp.Test(objFile.Name) Then
				If Not objFSO.FileExists(objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(objFile.Name) & "(отработан)." & objFSO.GetExtensionName(objFile.Name))) Then
					objFile.Copy strDestFolder & "\"
				End If
			End If
		Next
	Else
		WScript.Echo "Can't find destination folder [" & strSourceFolder & "]."
		WScript.Quit 3
	End If
Else
	WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
	WScript.Quit 2
End If

Set objFSO = Nothing

WScript.Quit 0

Отправлено: 18:21, 22-01-2020 | #2



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

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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


"Батник"
Код: Выделить весь код
powershell -command "gci d:\2 |? name -notin ((gci d:\1) -replace '\(отработан\)') |copy -Destination d:\1"

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 22-01-2020 в 20:30.

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

Отправлено: 20:23, 22-01-2020 | #3


Ветеран


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

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


DJ Mogarych, я бы таки вынес: «(gci d:\1)» за пределы конвеера.

Последний раз редактировалось Iska, 22-01-2020 в 23:24.


Отправлено: 20:51, 22-01-2020 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


В переменную до обработки? Да, но здесь оно только один раз встречается, и вроде как не foreach, дерготни по выполнению листинга для каждого файла нет.

Да и хотелось "батник" сделать.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 22:11, 22-01-2020 | #5


Ветеран


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

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


Ещё раз посмотрел логи Process Monitor'а — таки да, Вы правы: один раз.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:25, 22-01-2020 | #6


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
	Set "File2=Z:\Box_In\2\*.txt"
	Set "Box1=Z:\Box_In\1"

	For %%i In ("%File2%") Do If Not Exist "%Box1%\%%~ni(*%%~xi" If Not Exist "%Box1%\%%~nxi" Copy "%%i" "%Box1%\"
Exit /B

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


Последний раз редактировалось megaloman, 23-01-2020 в 02:49.


Отправлено: 00:01, 23-01-2020 | #7


Новый участник


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

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


Всем огромное спасибо! Воспользовался решением DJ Mogarych, отлично работает!

Отправлено: 09:21, 23-01-2020 | #8



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Скрипт который раскидывает файлы по папкам, с частью имени этих файлов username-qq Скриптовые языки администрирования Windows 6 06-10-2018 18:30
CMD/BAT - [решено] извлечение имени файлов, а также части имени с дописанием Alexander_88 Скриптовые языки администрирования Windows 7 09-05-2015 01:45
CMD/BAT - [решено] Сравнение файлов по части имени sampir Скриптовые языки администрирования Windows 2 18-11-2012 19:57
CMD/BAT - Сравнение файлов по имени stasy9110 Скриптовые языки администрирования Windows 1 04-12-2011 21:27
CMD/BAT - [решено] Скрипт сортировки и копирования файлов по маске Daemonstar Скриптовые языки администрирования Windows 2 25-09-2010 15:47




 
Переход