скрипт сравнение файлов и копирования по части имени
Подскажите с такой проблемой есть 2 папки.
В папке D:\1 лежат файлы 5454_6546464564_56464546666_029(отработан).txt, причем цифры могут быть любые, неизменным остается только статус (отработан) в имени.
В папке D:\2 находятся файлы с такими же именами, но без статуса (отработан)
Собственно нужно сравнить все файлы в обеих папках и скопировать из папки 2 в папку 1 только файлы, у которых нет дублей со статусом (обработан) в папке 1.
Кучу тем пересмотрел, никак не получается. Пока временным решением сделал батник с копированием по времени создания, но это не то. Помогите кто может.
|
Цитата:
Цитата 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
|
DJ Mogarych |
22-01-2020 20:23 2906325 |
"Батник"
Код:
powershell -command "gci d:\2 |? name -notin ((gci d:\1) -replace '\(отработан\)') |copy -Destination d:\1"
|
DJ Mogarych, я бы таки вынес: «(gci d:\1)» за пределы конвеера.
|
DJ Mogarych |
22-01-2020 22:11 2906359 |
В переменную до обработки? Да, но здесь оно только один раз встречается, и вроде как не foreach, дерготни по выполнению листинга для каждого файла нет.
Да и хотелось "батник" сделать.
|
Ещё раз посмотрел логи Process Monitor'а — таки да, Вы правы: один раз.
|
Код:
@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
|
Всем огромное спасибо! Воспользовался решением DJ Mogarych, отлично работает!
|
Время: 08:36.
© OSzone.net 2001-