Компьютерный форум 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=343760)

mallonih 22-01-2020 15:33 2906268

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

Iska 22-01-2020 18:21 2906300

Цитата:

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

Iska 22-01-2020 20:51 2906336

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

DJ Mogarych 22-01-2020 22:11 2906359

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

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

Iska 22-01-2020 23:25 2906368

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

megaloman 23-01-2020 00:01 2906377

Код:

@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


mallonih 23-01-2020 09:21 2906422

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


Время: 08:36.

Время: 08:36.
© OSzone.net 2001-