Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование "удобняшек" на VBScript

Автор: JohnSilver182
Дата сообщения: 15.02.2011 15:22
next
Автор: cambit
Дата сообщения: 15.02.2011 17:27
Опять я у раздорожья...
Я так понимаю, если запускать приложение из скрипта методом WshShell.Exec - обязательно будет DOS-окно, но его (приложение) можно контролировать с помощью WshExec.Status.
Если запускать через objShell.Run - можно окно скрыть, но проверить, запущен ли процесс нельзя. А как быть, если хоцца? Вообще, можно ли проконтролировать наличие выполняемого процесса по имени (напр. Spk.exe)?
Автор: Rush
Дата сообщения: 15.02.2011 18:26
cambit
Так можно:

Код: ProcName = "Spk.exe"
strWQL = "Select * from Win32_Process Where Name = '" & ProcName & "'"
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
RunApp = CBool(objWMI.ExecQuery(strWQL).Count)
Автор: webern
Дата сообщения: 15.02.2011 23:54
Вопрос к опытным.
Подскажите пожалуйста, есть ли принципиальная возможность, используя только WSH и JScript, получать данные непосредственно из файлов JPG/BMP/GIF/PNG (конкретно - формат и размер), и при этом не регистрируя сторонних компонентов вроде GFLAx. Т.е. использовать только то, что есть в голой Vista/Win7.
Пока я вынужден делать это через консольные возможности IrfanView, создавая и анализируя лишний текстовый info-файл, который потом приходится удалять. Хочется избавиться от избыточных, пусть и автоматических операций.
Рыл в направлении Windows Imaging Component, но безуспешно.
Прошу прощения, что вопрос не по VBScript, пишу лишь иногда только на JScript, а подходящего активного топика по JScript на этом форуме нет.
Разжёвывать не обязательно, достаточно направить по верному пути, если возможно.
Автор: AndVGri
Дата сообщения: 16.02.2011 04:48
webern
Посмотри здесь или тут.
Автор: Rush
Дата сообщения: 16.02.2011 08:58
webern
Не знаю, как в семерке, а в ХР можно получить размер и тип через GetDetailsOf. Вернее, тип получить нельзя - он формально берется из расширения (а вдруг исправили в новой ос?). А размер можно.
Можно через WIA, его дополнительно устанавливать не надо, присутствует при установке. Тут я набросал пример:

Код: var BMP = '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}';
var PNG = '{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}';
var GIF = '{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}';
var JPG = '{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}';
var TIF = '{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}';

var imgFormat;
var fName = 'c:\image.jpg';

var img = new ActiveXObject('WIA.ImageFile');
img.LoadFile(fName);

WScript.Echo('Width = ' + img.width);
WScript.Echo('Height = ' + img.height);

switch(img.FormatID) {
case BMP:
imgFormat = 'BMP';
break;
case PNG:
imgFormat = 'PNG';
break;
case GIF:
imgFormat = 'GIF';
break;
case JPG:
imgFormat = 'JPEG';
break;
case TIF:
imgFormat = 'TIFF';
}
WScript.Echo('Format = ' + imgFormat);
Автор: AndVGri
Дата сообщения: 16.02.2011 09:27
Rush

Цитата:
Можно через WIA, его дополнительно устанавливать не надо, присутствует при установке.

Не всегда. У нас в отделе WinXP SP3 на 5 машинах (ставили админы с головной конторы), ни на одной нет . Доставлял вручную.
Автор: Rush
Дата сообщения: 16.02.2011 09:35
AndVGri

Цитата:
Не всегда.

Так у человека семерка - там точно должна быть.
На всякий случай - ссылка на скачку.
Автор: JohnSilver182
Дата сообщения: 16.02.2011 10:22
route print + ipconfig

Цитата:
Список интерфейсов
82...........................CFI
81...........................USI


Цитата:
Адаптер PPP CFI:

DNS-суффикс подключения . . . . . :
IPv4-адрес. . . . . . . . . . . . : 192.168.0.240
Маска подсети . . . . . . . . . . : 255.255.255.255
Основной шлюз. . . . . . . . . :

Вот я хочу у VPN с именем CFI
1) узнать ID
2) IP адресс сервера и IP адрес клиента
Было бы круто если код работал WinXp \ Win7
Автор: webern
Дата сообщения: 16.02.2011 16:55
AndVGri
Rush
Большое спасибо за ценные наводки, сам точно не додумался бы до таких трюков.
А в сторону WIA я даже не догадался посмотреть - отключено это всё у меня.
Буду пробовать.
Автор: Ki1me
Дата сообщения: 17.02.2011 12:10
а как сделать так, чтобы нужный файл, копировался в папку и её подпапки ?
Автор: Rush
Дата сообщения: 17.02.2011 13:20
Ki1me

Цитата:
а как сделать так, чтобы нужный файл, копировался в папку и её подпапки ?

Что, один и тот же файл во все папки? Тогда так:

Код: Option Explicit

Dim objFSO
Dim strFilePath
Dim strFolderPath

strFilePath = "z:\file.txt"
strFolderPath = "z:\folder"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

CopyFileToFolders objFSO.GetFolder(strFolderPath)

Sub CopyFileToFolders(objFolder)
Dim SubFolderItem
objFSO.CopyFile strFilePath, objFolder.Path & "\"
For Each SubFolderItem In objFolder.SubFolders
objFSO.CopyFile strFilePath, SubFolderItem.Path & "\"
CopyFileToFolders SubFolderItem
Next
End Sub
Автор: Ki1me
Дата сообщения: 17.02.2011 13:57
Спасибо,
Автор: Ki1me
Дата сообщения: 18.02.2011 12:11
а как сделать что бы пустые папки удаляло только с определенного подуровня ? например C:\obmen\IT\Ivanov или C:\obmen\IT
Автор: Rush
Дата сообщения: 18.02.2011 12:24
Ki1me
Так начинай рекурсию с уровня нужной папки и все подпапки удаляй и все. Самое простое - использовать не wsh, а cmd. Писать меньше.
Автор: Ki1me
Дата сообщения: 18.02.2011 13:18
как в этом скрипте сделать что б писало сколько папок удалил ?
Dim oFSO, oFolder, oSubFolders

Const strRootFolder = "\\10.0.0.12\обмен\"

Set oFSO = CreateObject("Scripting.FileSystemObject")


If oFSO.FolderExists(strRootFolder) Then
Set oFolder = oFSO.GetFolder(strRootFolder)
Else
WScript.Echo "Incorrect root folder path"
Set oFSO = Nothing
WScript.Quit(1)
End If


Call RemoveEmptyFolders(oFolder)

Set oFolder = Nothing
Set oFSO = Nothing


sub RemoveEmptyFolders(byref oRootFolder)
Dim oFolder, oSubFolders
Set oSubFolders = oRootFolder.SubFolders

for each oFolder in oSubFolders
RemoveEmptyFolders(oFolder)
If oFolder.Size = 0 Then
Call oFSO.DeleteFolder(oFolder.Path, True)
End If
next

Set oSubFolders = nothing
Set oFolder = Nothing
end sub
Автор: Rush
Дата сообщения: 18.02.2011 14:12
Ki1me

Цитата:
как в этом скрипте сделать что б писало сколько папок удалил ?


Код: Dim oFSO, oFolder, oSubFolders, ni

Const strRootFolder = "\\10.0.0.12\обмен\"
ni = 0

Set oFSO = CreateObject("Scripting.FileSystemObject")

If oFSO.FolderExists(strRootFolder) Then
Set oFolder = oFSO.GetFolder(strRootFolder)
Else
WScript.Echo "Incorrect root folder path"
Set oFSO = Nothing
WScript.Quit(1)
End If

Call RemoveEmptyFolders(oFolder)

MsgBox "Удалено папок - " & CStr(ni)

Set oFolder = Nothing
Set oFSO = Nothing

Sub RemoveEmptyFolders(byref oRootFolder)
Dim oFolder, oSubFolders
Set oSubFolders = oRootFolder.SubFolders

For Each oFolder In oSubFolders
If oFolder.Size = 0 Then
SummEF(oFolder.SubFolders)
ni = ni + 1 + oFolder.SubFolders.Count
Call oFSO.DeleteFolder(oFolder.Path, True)
Else
RemoveEmptyFolders(oFolder)
End If
Next

Set oSubFolders = nothing
Set oFolder = Nothing
End Sub

Sub SummEF(fname)
Dim fItem
For Each fItem In fname
ni = ni + fItem.SubFolders.Count
SummEF(fItem.SubFolders)
Next
End Sub
Автор: cambit
Дата сообщения: 18.02.2011 17:07
Мастера, помогите! Есть вот такой скрипт:

Код: Dim objWS, iRetMsg
Set objWS = CreateObject("WScript.Shell")
Set objShell = CreateObject("WScript.Shell")
Set WshShell = CreateObject("WScript.Shell")
objShell.Run "C:\Windows\Declar\Mesg.exe", 0, False

iRetMsg = objWS.Popup("З Б І Р", 10, " . . В І Д Т В О Р Ю Є Т Ь С Я . . ",vbRetryCancel Or vbInformation)
Select Case iRetMsg
Case -1: Call Ex
Case vbRetry: WScript.Echo "Выбран -",vbRetry
Case vbCancel: WshShell.Run "taskkill /IM sndrec32.exe", 0
End Select


Sub Ex
end sub
Автор: Leon_Ko
Дата сообщения: 20.02.2011 10:10
Подскажите, плииз, как на wsh реализовать удаление файлов определённого расширения, с заходом во вложенные подкаталоги (рекурсия?). Т.е. при запуске скрипта из каталога, должны быть обработаны все нижеследующие подкаталоги. Здесь, похоже, приводились подобные примеры, но я, к сожалению, в wsh как "свинья в апельсинах" .
Автор: dandyd
Дата сообщения: 20.02.2011 12:51
Может быть кто сталкивался с проблемой:
Пытаюсь послать данные на порт удаленного компа
порт открывается, читать оттуда можно (GetData)
а на SendData выдает ошибку - Объект не поддерживает это свойство или метод: 'tcpClient.SendData'
FireWall отключен

фрагмент кода

Set tcpClient=WScript.CreateObject("MSWinsock.Winsock")
WScript.ConnectObject tcpClient,"tcpClient_"
tcpClient.Protocol = sckTCPProtocol
tcpClient.RemoteHost = "192.168.1.1"
tcpClient.RemotePort = 9005
tcpClient.Connect

start_time = second(Now)
Do While (tcpClient.State <> sckConnected) or (second(Now) >= start_time+3)
WScript.Echo "open port..."
WScript.Sleep 500
Loop

if not bConnected Then
WScript.Echo "timeout"
WScript.Quit
Else
tcpClient.SendData("li:2:10000016:")
end If

test_port.vbs(18, 3) Ошибка выполнения Microsoft VBScript: Объект не поддерживает это свойство или метод: 'tcpClient.SendData'
Автор: Scaramanga
Дата сообщения: 20.02.2011 19:26
Доброго времени суток.
Имеется такой скрипт смены сетевых настроекЖ

Код: strComputer = "."
strIP = Array("192.168.1.2")
strMask = Array("255.255.255.0")
strGateway = Array("192.168.1.1")
strDNS = Array("192.168.1.2","192.168.1.3")

Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colCON = objWMI.ExecQuery("Select * " & _
" From Win32_NetworkAdapterConfiguration " & _
" Where IPENabled=TRUE")
For Each objCON In colCON
objCON.EnableStatic strIP,strMask
objCON.SetGateways strGateway
objCON.SetDNSServerSearchOrder strDNS

Exit For
Next
Автор: Rush
Дата сообщения: 21.02.2011 01:25
Scaramanga

Цитата:
как сделать чтобы он еще и изменял wins сервер?

Так примерно:

Код: strIP_1 = "192.168.1.2"
strIP_2 = "192.168.1.3"
objCON.SetWINSServer strIP_1, strIP_2
Автор: Leon_Ko
Дата сообщения: 21.02.2011 06:58
Rush
Спасибо! Но для меня это действительно... Сильно!
Точнее, непосильно
Автор: Leon_Ko
Дата сообщения: 21.02.2011 10:14
Правда, появились некоторые вопросы .
Во-первых, как сделать так, что не было жёсткой привязки к букве диска и папке? В оригинале указанно "z:\folder", а если диск (буква) другой и папка, соответственно, тоже. Т.е. хотелось бы иметь полную универсальность: запускаем в корне "z:\" - получаем обработку всего диска (раздела), запускаем в "z:\folder" - получаем обработку в папках, соответственно, нижее. Это можно?
Во-вторых, не очень понятно с сообщением "Скрипт отработал с ошибками." Т.е. логика-то понятна, а вот работа...
Поясню конкретной ситуацией - на примере. Имеем раздел с папкой "z:\folder", где в подкаталогах ("z:\folder\1", "z:\folder\2", "z:\folder\2\1" и т.п.) имеются необходимые к удалению файлы *.bak. Меняем в скрипте strFolderPath = "z:\folder" на strFolderPath = "z:\" , т.е. запускаем удаление с корня раздела.
Выдаётся сообщение "Скрипт отработал с ошибками." что в общем-то логично.
Но файлы-то *.bak в каталогах "z:\folder\1", "z:\folder\2" удаляются! Что как-то не очень понятно .
Автор: Rush
Дата сообщения: 21.02.2011 11:08
Leon_Ko

Цитата:
Во-первых, как сделать так, что не было жёсткой привязки к букве диска и папке?

Т. е. не хочется руками править внутри? Можно сделать и так, что будет удалять начиная с папки со скриптом. Или можно сделать пункт в контекстном меню - выделяете папку и она обрабатывается (с подпапками, конечно). Или просто из командной строки.

Цитата:
Во-вторых, не очень понятно с сообщением "Скрипт отработал с ошибками." Т.е. логика-то понятна, а вот работа...
Поясню конкретной ситуацией - на примере. Имеем раздел с папкой "z:\folder", где в подкаталогах ("z:\folder\1", "z:\folder\2", "z:\folder\2\1" и т.п.) имеются необходимые к удалению файлы *.bak. Меняем в скрипте strFolderPath = "z:\folder" на strFolderPath = "z:\" , т.е. запускаем удаление с корня раздела.
Выдаётся сообщение "Скрипт отработал с ошибками." что в общем-то логично.

Совсем не логично. Если запускать с корня скрипт должен удалять на всем диске, Вы же хотели, чтобы обрабатывались подпапки, а у корня все папки на диске - подпапки.
Но дело не в этом, а в ошибках. Я вызвать ошибки у себя не смог. Закомментируйте строку On Error Resume Next, вот так:

Код: 'On Error Resume Next
Автор: Leon_Ko
Дата сообщения: 21.02.2011 11:32
Rush

Цитата:
Т. е. не хочется руками править внутри?

Не то, чтобы не хочется... Просто хочется положить этот скрипт в папку, к которой прописан %PATH%, и вызывать его (пользуюсь FAR'ом) по имени из нужного мне каталога...

Цитата:
Или можно сделать пункт в контекстном меню - выделяете папку и она обрабатывается (с подпапками, конечно).

Нет, этого не надо.

Цитата:
Или просто из командной строки.

А вот это как раз то .

Цитата:
Совсем не логично. Если запускать с корня скрипт должен удалять на всем диске,

Он и удаляет, но при этом пишет ошибку ("Скрипт отработал с ошибками.")
Так разве должно быть?

Цитата:
Вы же хотели, чтобы обрабатывались подпапки, а у корня все папки на диске - подпапки.

Всё правильно, именно это и надо.

Цитата:
Закомментируйте строку On Error Resume Next,

Пишет, "Разрешение отклонено", код 800А0046. Конкретно притензии к вот этой строке:
For Each SubFolderItem In objFolder.SubFolders
Кстати, файлы не удалились.

Автор: Rush
Дата сообщения: 21.02.2011 12:50
Leon_Ko

Цитата:
Пишет, "Разрешение отклонено", код 800А0046. Конкретно притензии к вот этой строке:
For Each SubFolderItem In objFolder.SubFolders
Кстати, файлы не удалились.

Нет доступа к папке. И скрипт закончил работу по получении ошибки. Скорее всего папка "System Volume Information".
Переделал - теперь будет работать без сбоев, я надеюсь.
[more]

Код:
Option Explicit

On Error Resume Next

If WScript.Arguments.Count > 1 Then
Dim objFSO
Dim objShApp
Dim strMask
Dim strFolderPath
Dim check: check = False
Dim chSubFolders: chSubFolders = False
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objShApp = WScript.CreateObject("Shell.Application")
If WScript.Arguments.Named.Exists("s") Then chSubFolders = True
strFolderPath = WScript.Arguments.Unnamed.Item(0)
strMask = WScript.Arguments.Unnamed.Item(1)
DelFileToFolders objFSO.GetFolder(strFolderPath)
If Err.Number Then
MsgBox "Скрипт отработал с ошибками.", 48, "Удаление файлов"
ElseIf check Then
MsgBox "Файлы " & strMask & " удалены успешно.", 64, "Удаление файлов"
Else
MsgBox "Файлы " & strMask & " не обнаружены.", 64, "Удаление файлов"
End If
End If

WScript.Quit

Sub DelFileToFolders(objFolder)
Dim SubFolderItem
If FilesExist(objFolder.Path) Then
objFSO.DeleteFile objFolder.Path & "\" & strMask, True
check = True
End If
If chSubFolders Then
For Each SubFolderItem In objFolder.SubFolders
On Error Resume Next
If FilesExist(SubFolderItem.Path) Then
objFSO.DeleteFile SubFolderItem.Path & "\" & strMask, True
check = True
End If
DelFileToFolders SubFolderItem
Next
End If
End Sub

Function FilesExist(strPath)
Dim arrFiles
Set arrFiles = objShApp.NameSpace(strPath).Items
arrFiles.Filter 64, strMask
FilesExist = CBool(arrFiles.Count)
End Function

Автор: Leon_Ko
Дата сообщения: 21.02.2011 13:21
Rush
Что-то у меня опять не выходит. Я так понимаю, расширение удаляемых файлов (в примере - .bak) в скрипте в явном виде нигде не прописанно? Потому, как удаляемый файл у меня может быть не только .bak - в моём, конкретном случае, это сейчас .wav .
В общем, выдаётся ошибка: "Индекс выходит за пределы допустимого диапазоны", код ошибки "800А0009". Может, чего не так делаю? А! Допёрло! То, что я написал чуть ниже - очень "длинная" командная строка, сводящая на нет (для меня) всё преимущество использования данного скрипта.
Я запускал так:
delext.vbs /s *.wav
А надо было так:
delext.vbs /s "h:\" "*.wav"
Всё работает, беру свои слова взад.
Тогда... Просьба! Командная строка, конечно, хорошо, но... Чрезмерное обилие параметров в данном случае... В общем, нужно просто запуск delext.vbs и ВСЁ! А уже взависимости от места, из которого вызывается этот самый delext.vbs и будут выполняться требуемые деяния. Я ж знаю, какую ф-цию он несёт. Т.е. расширение удаляемых файлов можно заложить и жёстко в самом скрипте, т.к. эта ф-ция постоянна. А вот место, откуда скрипт запускается, может и видоизменяться в широких пределах - на разных компах буквы разделов и названия папок разные...
Автор: Rush
Дата сообщения: 21.02.2011 14:16
Leon_Ko

Цитата:
В общем, нужно просто запуск delext.vbs и ВСЁ!

Ну тогда можно сделать так - бросил файл скрипта в нужную папку, запустил и все. И параметр отключения подпапок можно убрать.
Но лучше бы мне знать каким образом Вы собираетесь его использовать - на кнопку файл-менеджера повесить или еще каким образом. Почему смущает пара параметров?
Автор: Leon_Ko
Дата сообщения: 21.02.2011 14:32
Rush

Цитата:
Ну тогда можно сделать так - бросил файл скрипта в нужную папку, запустил и все.

Именно так. Только путь к этой папке (у меня она общая на всех компах) прописан в %Path% - системных переменных. Поэтому нужный мне скрипт (по имени) нетрудно вызвать из любого места и любого раздела.

Цитата:
И параметр отключения подпапок можно убрать.

Ну да. Мне это не нужно.

Цитата:
Но лучше бы мне знать каким образом Вы собираетесь его использовать - на кнопку файл-менеджера повесить или еще каким образом.

Просто вызывать из консоли. Точнее, из FAR'а.

Цитата:
Почему смущает пара параметров?

Потому, что набрать "delext" (можно даже опустить расширение, ОС сама его найдёт) гораздо проще и быстрее, чем набирать всю командную строчку .
А поскольку присутствует некая специфика - удаляются файлы определенного расширения, то можно сделать и 2-3 дубля того же скрипта...
В общем, мне удобно именно так

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

Предыдущая тема: Работа в Delphi c CryptoApi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.