Как я могу программировать (VB.NET) чтобы скопировать файлы из папки в другую, файлы, перечисленные в xlsx
Всем привет,
Я не разработчик и новичок в VBS, мое требование состоит в том, что у меня есть лист excel с именами 3K + имя файла, чтобы скопировать их из папки в другую, только 5 в то время, пока эти 5 файлов не будут обработаны сервером, а затем обновить список.
Я написал VBscript, который может читать filelist1 (txt ) с 5 именами файлов внутри и копировать их из источника в пункт назначения , а затем регистрировать скопированные файлы или сбой. затем проверьте папку назначения, если в ней есть файлы, подождите 2 минуты, если в ней нет файлов, начните копировать файлы из filelist2, а затем протоколируйте процесс.
последнее, скопируйте файл журнала в папку журнала с отметкой времени в названии :) вот и все, извините за то, что многое объясняю.
1-Есть ли какой-либо другой способ облегчить мою жизнь вместо того, чтобы заполнять список файлов 2 снова и снова ?
что-то вроде открытия листа excel, чтения 5 имен из столбца A, затем копирования из src в dest и записи скопированного в B ??
2-Мне нужен индикатор выполнения, который показывает передачу в реальном времени, как копирование windows ( я думаю, VBS не может этого сделать).
3-Могу ли я преобразовать его в VB.net так что у меня может быть настроение GUI, очень простое, как "Нажмите здесь, чтобы скопировать 5 файлов и индикатор выполнения под кнопкой "
Спасибо всем заранее
Что я уже пробовал:
Dim objFSO, objShell, WSHshell, objFolder, objFolderItem Dim objFLD Dim objFileList, strFileToCopy, strSourceFilePath, strTargetFilePath, strLogFile Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("Shell.Application") Set WSHshell = CreateObject("WScript.Shell") Set fld = objFSO.GetFolder("\\ajdoh5bics01\ajmn_share\AJA\AJA_Manual_Archive\") Const ForReading = 1, ForWriting = 2, ForAppending = 8 ' On Error Resume Next Do Until fld.Files.Count = 0 If fld.Files.Count = 0 Then MsgBox "Cool. Diva Watch Folder is Empty. Press Okay to continue" Else MsgBox "Diva Watch Folder is Not Empty, will wait for 2 Min" Wscript.sleep 120000 'pause 1 Min End If loop msgBox " This process will copy the files in the file list 1. " & strFileList1 & " Do you want to proceed ?" ' The list of files to copy. Should be a text file with one file on each row. No paths - just file name. Const strFileList1 = "\\aja-mm\nas\Manaf\Diva Migration\filelist1.txt" Const strFileList2 = "\\aja-mm\nas\Manaf\Diva Migration\filelist2.txt" ' Should files be overwriten if they already exist? TRUE or FALSE. Const blnOverwrite = FALSE ' Make a log file and/or clear it's contents strLogFile = "\\aja-mm\nas\Manaf\Diva Migration\Temp-Diva.log" ' & "Temp-Diva.log" Dim objLogFile Set objLogFile = objFSO.OpenTextFile(strLogFile, ForWriting, True) objLogFile.WriteLine "" ' Get the source path for the copy operation. Const strSourceFolder = "\\ajdoh5bics01\ajmn_share\AJA\AJA TX Archive DO NOT DELETE\" ' Get the target path for the copy operation. Const strTargetFolder = "\\ajdoh5bics01\ajmn_share\AJA\AJA_Manual_Archive\" Set objFileList = objFSO.OpenTextFile(strFileList1, ForReading, False) Dim strResults, iSuccess, iFailure iSuccess = 0 iFailure = 0 On Error Resume Next Do Until objFileList.AtEndOfStream ' Read next line from file list and build filepaths strFileToCopy = objFileList.Readline strSourceFilePath = objFSO.BuildPath(strSourceFolder, strFileToCopy) strTargetFilePath = objFSO.BuildPath(strTargetFolder, strFileToCopy) ' Copy file to specified target folder. Err.Clear objFSO.CopyFile strSourceFilePath, strTargetFilePath, blnOverwrite If Err.Number = 0 Then ' File copied successfully iSuccess = iSuccess + 1 objLogfile.WriteLine "Copied " & strFileToCopy If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then ' Running cscript, output text to screen Wscript.Echo strFileToCopy & " copied successfully" End If Else ' Error copying file iFailure = iFailure + 1 TextOut "Error " & Err.Number & " (" & Err.Description & ") trying to copy " & strFileToCopy objLogfile.WriteLine "Failed " & strFileToCopy End If Loop strResults = strResults & vbCrLf strResults = strResults & iSuccess & " files copied successfully." & vbCrLf strResults = strResults & iFailure & " files generated errors" & vbCrLf Wscript.Echo strResults Sub TextOut(strText) If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then ' Running cscript, use direct output Wscript.Echo strText Else strResults = strResults & strText & vbCrLf End If End Sub ''''''''''''''''''''''' ''''''''''''''''''''''''' ''''''''''''''''''''''''' '''''''''''''''''''''''' ' line 82 ' Wscript.sleep 60000 'pause 1 Min On Error Resume Next Do Until fld.Files.Count = 0 If fld.Files.Count = 0 Then MsgBox "Diva Watch Folder is Empty. Press Okay to continue" Else MsgBox "Diva Watch Folder is Not Empty, will wait for 2 Min" Wscript.sleep 120000 'pause 1 Min End If loop msgBox " This process will copy the files in the file list 2. " & strFileList2 & " Do you want to proceed ?" ' The list of files to copy. Should be a text file with one file on each row. No paths - just file name. Const ForReading2 = 2 Set objFileList = objFSO.OpenTextFile(strFileList2, ForReading, False) iSuccess = 0 iFailure = 0 On Error Resume Next Do Until objFileList.AtEndOfStream ' Read next line from file list and build filepaths strFileToCopy = objFileList.Readline strSourceFilePath = objFSO.BuildPath(strSourceFolder, strFileToCopy) strTargetFilePath = objFSO.BuildPath(strTargetFolder, strFileToCopy) ' Copy file to specified target folder. Err.Clear objFSO.CopyFile strSourceFilePath, strTargetFilePath, blnOverwrite If Err.Number = 0 Then ' File copied successfully iSuccess = iSuccess + 1 objLogfile.WriteLine "Copied " & strFileToCopy If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then ' Running cscript, output text to screen Wscript.Echo strFileToCopy & " copied successfully" End If Else ' Error copying file iFailure = iFailure + 1 TextOut "Error " & Err.Number & " (" & Err.Description & ") trying to copy " & strFileToCopy objLogfile.WriteLine "Failed " & strFileToCopy End If Loop strResults = strResults & vbCrLf strResults = strResults & iSuccess & " files copied successfully." & vbCrLf strResults = strResults & iFailure & " files generated errors" & vbCrLf Wscript.Echo strResults Sub TextOut(strText) If Instr(1, Wscript.Fullname, "cscript.exe", 1) > 0 Then ' Running cscript, use direct output Wscript.Echo strText Else strResults = strResults & strText & vbCrLf End If End Sub ''''''''''''''''''''''' ''''''''''''''''''''''''' '''''''Send the log file to logs folder'''''''''''''''''' '''''''''''''''''''''''' Dim sSourceFolder Dim sDestFolder Dim sDBFile Dim sDateTimeStamp Const OVER_WRITE_FILES = True sSourceFolder = "\\aja-mm\nas\Manaf\Diva Migration\" sBackupFolder = "\\aja-mm\nas\Manaf\Diva Migration\logs" sDBFile = "Temp-Diva" sDBFileExt = "log" sDateTimeStamp = cStr(Year(now())) & _ Pad(cStr(Month(now())),2) & _ Pad(cStr(Day(now())),2) & _ Pad(cStr(Hour(now())),2) & _ Pad(cStr(Minute(now())),2) & _ Pad(cStr(Second(now())),2) 'If the backup folder doesn't exist, create it. If Not objFSO.FolderExists(sBackupFolder) Then objFSO.CreateFolder(sBackupFolder) End If 'Copy the file as long as the file can be found If objFSO.FileExists(sSourceFolder & "\" & sDBFile & "." & sDBFileExt) Then objFSO.CopyFile sSourceFolder & "\" & sDBFile & "." & sDBFileExt,_ sBackupFolder & "\" & sDBFile & "_" & sDateTimeStamp & "." & sDBFileExt,_ OVER_WRITE_FILES End if Set objFSO = Nothing Function Pad(CStr2Pad, ReqStrLen) Dim Num2Pad Pad = CStr2Pad If len(CStr2Pad) < ReqStrLen Then Num2Pad = String((ReqStrlen - Len(CStr2Pad)), "0") Pad = Num2Pad & CStr2Pad End If End Function
Garth J Lancaster
Конечно, вы можете сделать это в VB.Net - я не знаю, в чем ваша проблема (Ы) и что вас останавливает - вы, кажется, хорошо разбираетесь в "процессе", нет никаких причин, почему вы не можете писать в VB
Я бы предложил вам
а) найдите хороший базовый праймер по VB.Net формы
б) подумайте о том, какую функциональность вы хотите "выгнать" из VB.Net "GUI", и начать просто / постепенно - например
b1) просто кнопка "Пуск" и текстовое поле на форме, сделайте копию на "событии" нажатия кнопки "Пуск", обновите текстовое поле, чтобы сказать "x элементов сделано", начните с фиксированного / консервированного # вещей для копирования
b2) добавьте средство выбора файла, чтобы выбрать электронную таблицу, и, возможно, linqtoexcel, чтобы прочитать ее, отвесите это в обработчик кнопки запуска ' b1
b3) возможно, переместить копию на "фоновый" рабочий с возможностью отмены
b4) добавьте окно прогресса в форму и отвесьте его, чтобы получать обновления от фонового рабочего
ваш выбор элементов b1-b4 и выше, очевидно, будет зависеть от вашего опыта и скорости обучения, другие будут делать это по-другому, но если вы очень Новичок во всем этом, просить вас внедрить фонового работника, чтобы не заморозить ваш пользовательский интерфейс, - это довольно сложная задача (вот почему я также предлагаю начать с небольшого количества файлов, вы можете увеличить их количество, пока не достигнете болевой точки-замораживания пользовательского интерфейса или увеличения ваших знаний и т. д.)
как и в большинстве других вещей, вы обнаружите, что разбить его на куски / кусочки размером с укус - это правильный путь, и не бойтесь использовать карандаш и бумагу для рисования графического интерфейса (или инструменты проволочного каркаса и т. д.), чтобы спланировать его перед началом.