Войти

Показать полную графическую версию : Время исполнения скрипта


peretc001
31-01-2011, 10:04
Добрый день.

У меня скрипт раскидывает документы по папкам. Подскажите, как сделать чтоб при выполнении скрипта он показывал сколько процедур выполнено или сколько времени осталось до конца или чтоб он сам процесс копирования показывал, типа:

1.txt Ok
2.txt Ok
3.txt Ok

и т.д.

Ivan Bardeen
31-01-2011, 10:05
Будет проще подсказать, если вы покажете сам скрипт

peretc001
31-01-2011, 10:26
On Error Resume Next

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set Shell = WScript.CreateObject("WScript.Shell")

If Not FSO.FolderExists("1") Then
FSO.CreateFolder("1")
FSO.CreateFolder("1\2")
End If

Const OverwriteExisting = True
Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.MoveFile "1.txt" , "1\" ' перемещаем '
FSO.CopyFile "2.txt" , "1", OverwriteExisting
FSO.MoveFile "2.txt" , "1\2\" ' перемещаем '
FSO.MoveFile "3.txt" , "1\" ' перемещаем '
FSO.MoveFile "4.txt" , "1\" ' перемещаем '


WScript.Echo "Распределение завершено!"

Set Shell = Nothing
Set FSO = Nothing

WScript.Quit

Ivan Bardeen
31-01-2011, 10:40
файлы 1.txt, 2.txt... у вас лежат в одной папке?
И как вы определяете, какой файл нужно копировать, а какой перемещать и в какую папку?

peretc001
31-01-2011, 10:50
да, все файлы лежат в одной папке.

Там очень сложная структура и определенные базы копируется в определенную папку, а потом некоторые переносятся в другую. Они очень много весят, есть базы по 1,5 Гиги. Поэтому мне нужно вывести процесс копирования и(или) перемещения.

Если тот код упростить, то он выглядит примерно так как я написал выше.

Ivan Bardeen
31-01-2011, 11:49
Тогда добавьте конструцию, которую я привожу для каждой операции над файлом (Выделено жирным).
Она будет вести лог для каждой операции над файлом и записывать его в c:\temp\logtest.txt

On Error Resume Next
Const ForAppend = 8

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set Shell = WScript.CreateObject("WScript.Shell")

If Not FSO.FolderExists("1") Then
FSO.CreateFolder("1")
FSO.CreateFolder("1\2")
End If

Const OverwriteExisting = True
Set FOut = fso.OpenTextFile("c:\temp\logtest.txt",ForAppend,True)

FSO.MoveFile "1.txt" , "1\"
If Err.Number <> 0 Then
text = "Ошибка:" & " " & Err.Number & " " & "Описание:" & " " & Err.Description & " " & "При операции над файлом: 1.txt"
FOut.WriteLine Text
Else
text = "Операция над файлом 1.txt прошла успешно"
FOut.WriteLine Text
End If
FSO.CopyFile "2.txt" , "1",OverwriteExisting
FSO.MoveFile "2.txt" , "1\2\"
FSO.MoveFile "3.txt" , "1\"
FSO.MoveFile "4.txt" , "1\"


WScript.Echo "Распределение завершено"

Set Shell = Nothing
Set FSO = Nothing

WScript.Quit

Iska
31-01-2011, 12:00
peretc001, «Scripting.FileSystemObject» не позволяет этого сделать (получать прогресс копирования/перемещения), только между операциями. Обходной вариант — копировать/перемещать, например, посредством Проводника (объект «Shell.Application»).

peretc001
31-01-2011, 12:19
Ivan Bardeen, у меня очегь много файлов, порядка 200, это мне после каждого нужно написать?

If Err.Number <> 0 Then
text = "Ошибка:" & " " & Err.Number & " " & "Описание:" & " " & Err.Description & " " & "При операции над файлом: 1.txt"
FOut.WriteLine Text
Else
text = "Операция над файлом 1.txt прошла успешно"
FOut.WriteLine Text
End If

И этот метод, я так понял, не показывает сам процесс копирования.



Iska, а как использовать Shell.Application? Если я просто поменяю Scripting.FileSystemObject на Shell.Application, будет работать? Вы можете показать на примере скрипта что поменять?

Ivan Bardeen
31-01-2011, 12:42
Ivan Bardeen, у меня очегь много файлов, порядка 200, это мне после каждого нужно написать? »
Да, после каждого
И этот метод, я так понял, не показывает сам процесс копирования. »
Не показывает, только ведет лог.

peretc001
31-01-2011, 12:52
жаль, Ivan Bardeen, спасибо Вам за помощь

Ivan Bardeen
31-01-2011, 13:40
peretc001,
А вот так процесс копирования вас устроит? Пример для перемещения и копирования с помощью проводника в папку (targetfolder)

On Error Resume Next
Const ForAppend = 8

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set Shell = WScript.CreateObject("WScript.Shell")
Set objShell = CreateObject("Shell.Application")

If Not FSO.FolderExists("1") Then
FSO.CreateFolder("1")
FSO.CreateFolder("1\2")
End If

TargetFolder = "1"
Set objFolder = objShell.NameSpace(TargetFolder)
objFolder.MoveHere "3.txt", &H0&
objFolder.CopyHere "4.txt",&H0&

TargetFolder = "1\2"
Set objFolder = objShell.NameSpace(TargetFolder)
objFolder.MoveHere "1.txt", &H0&
objFolder.CopyHere "2.txt", &H0&

WScript.Echo "Распределение завершено"

WScript.Quit

Iska
31-01-2011, 13:48
Если я просто поменяю Scripting.FileSystemObject на Shell.Application, будет работать? »
Нет, не будет.
Вы можете показать на примере скрипта что поменять? »
На примере примера скрипта (http://forum.oszone.net/post-1600999.html#post1600999) — не стану, ибо бессмысленно. Могу привести простой пример — вот:
Option Explicit

Dim objShell
Dim objFolder

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace("E:\Песочница\0031")

If Not objFolder Is Nothing Then
objFolder.CopyHere "C:\WINDOWS\System32\*.dll"

Set objFolder = Nothing
End If

Set objShell = Nothing

WScript.Quit 0

Описание объекта «Shell.Application», его объектов, свойств и методов можно узнать здесь: Shell Objects for Scripting and Microsoft Visual Basic (Windows) (http://msdn.microsoft.com/en-us/library/bb773938(v=vs.85).aspx).




© OSzone.net 2001-2012