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

» Программирование "удобняшек" на VBScript (Часть 2)

Автор: lion shadow
Дата сообщения: 16.12.2011 16:11
Спасибо, я нашёл Microsoft Windows Script Host 2.0 Developer's Guide на русском, то что нужно.)
Автор: Svyazist
Дата сообщения: 19.12.2011 12:38
Привет всем, нужна помощь в написании скрипта, никак не могу разобраться с пробелами.
Задача простая - архивация файлов
Есть вот такая структура
Задаваемые параметры
Archivator="C:\Program Files\7-Zip\7z.exe"
ArchivParam1="a"

Далее формируем команду:
ArchivCommand1=CHR(34) & Archivator & ArchivParam1 & CHR(34)
Запускаем ее
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ArchivCommand1, 1, vbTrue

Соответственно получаем ошибку "не удается найти указанный файл"
я так понимаю что Run не находит файл по этому пути C:\Program Files\7-Zip\7z.exe т.к. в нем пробелы.


Как обойти? Поисковики замучил, ответа на свой вопрос не нашел, возможно что не правильно искал.

Заранее благодарен.

lion shadow

можно ссылку в личку, очень бы пригодилось. Спасибо.
Автор: Evgeny972
Дата сообщения: 19.12.2011 13:13
Svyazist
ArchivCommand1=CHR(34) & Archivator & CHR(34)& " " & ArchivParam1
Поскольку файла «C:\Program Files\7-Zip\7z.exea» дейчтвительно не существует
Автор: Svyazist
Дата сообщения: 19.12.2011 13:23
Evgeny972


Цитата:
ArchivCommand1=CHR(34) & Archivator & CHR(34)& " " & ArchivParam1
Поскольку файла «C:\Program Files\7-Zip\7z.exea» дейчтвительно не существует


Прошу прощения, конечно структура с пробелом.
Пытаюсь вывести на экран команду, она выводится правильная, с пробелом, но в итоге все-равно ошибка "не удается найти указанный файл"
Автор: megamozg13
Дата сообщения: 19.12.2011 13:38
Archivator="C:\Progra~1\7-Zip\7z.exe"
?
Автор: Svyazist
Дата сообщения: 19.12.2011 13:52
megamozg13

Цитата:
Archivator="C:\Progra~1\7-Zip\7z.exe"
?


Спасибо, это поможет только для Program files. Как быть с другими путями не системных папок?
Автор: megamozg13
Дата сообщения: 19.12.2011 14:15
Вот нашел у забугорных коллег:

Цитата:

Function qq(strIn)
qq = Chr(34) & strIn & Chr(34)
End Function
Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run qq("C:\Program Files\WinRAR\WinRAR.exe"), 6, True
set wshshell = Nothing
Автор: Evgeny972
Дата сообщения: 19.12.2011 16:10
Svyazist

Цитата:
Пытаюсь вывести на экран команду, она выводится правильная, с пробелом

Что выводится на экран? Это:
"C:\Program Files\7-Zip\7z.exe a". Так это неправильно. Файла «7z.exe a» тоже не существует
Правильно
"C:\Program Files\7-Zip\7z.exe" a


Добавлено:
Если запустить, то что ты привел, действительно: Система не может…
Если заменить, как я сказал

Код: Archivator="C:\Program Files\7-Zip\7z.exe"
ArchivParam1=" a"
ArchivCommand1=CHR(34) & Archivator & CHR(34)& ArchivParam1
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ArchivCommand1, 1, vbTrue
Автор: Svyazist
Дата сообщения: 20.12.2011 07:40
megamozg13
Evgeny972

Цитата:
Archivator="C:\Program Files\7-Zip\7z.exe"
ArchivParam1=" a"
ArchivCommand1=CHR(34) & Archivator & CHR(34)& ArchivParam1
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ArchivCommand1, 1, vbTrue


Спасибо за помощь, привел к этому виду, , все заработало
Archivator="C:\Program files\7-Zip\7z.exe"
ArchivParam1=Probel & "a" & Probel & Destinition & Data & ".7z" & Probel & "-slp" & Probel & SorceFolder & Probel & "-ssw" & Probel & "-sccUTF-8" & Probel & ">" & Destinition & Data & ".txt"
ArchivCommand1=CHR(34) & Archivator & CHR(34)& ArchivParam1
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%comspec% /c " & ArchivCommand1, 0, vbTrue

Probel соответственно - " "
SorceFolder, Destinition, Data - переменные.
Может кому пригодится такая структура для архивирования папок.

И еще вопрос, есть некая переменная в которую пишутся сообщения в процессе работы скрипта. Переменная по умолчанию, не массив. Потом данные из этой переменной отправляем в теле письма т.е. вставляем в objEmail.Textbody Получается примерно так:
Message = " текст1" & VbCrLf
Message = Message & "текст2" & VbCrLf
objEmail.Textbody = Message
В итоге в теле письма приходит все в одну строчку, как обойти?
Думаю либо писать сначала в отдельный временный файл методом writeline, потом считывать построчно, либо может использовать массив. Подскажите пожалуйста.
Автор: AndVGri
Дата сообщения: 20.12.2011 07:49
Svyazist
WriteLine пишет тоже VbCrLf, для разделения строк (стандарт Windows).
Попробуй ещё в качестве разделителя строк для Message VbLf или VbCr.
Автор: OOD
Дата сообщения: 22.12.2011 10:29
Подскажите как нажать на окне в панели задач кнопку свернуть?
запускаю OUTLOOK 2010


Код: function main($state)
{
// Производим запуск
$WSHShell=WScript.CreateObject("WScript.Shell");
$WSHShell.Run("OUTLOOK.EXE", 7, $state);
};
// Запускаем приложение свернутым в трей
main(2);
Автор: D77
Дата сообщения: 22.12.2011 16:39
Подскажите пожалста, а то совсем не шарю
Нужно с задержкой включить vpn-соединение

WScript.Sleep 50000
Set WshExec = WshShell.Exec("C:\001\lan2\vpn.lnk")

Пишет - файл не является приложением Win32
Автор: ComradG
Дата сообщения: 22.12.2011 17:16
D77
во-первых нет ссылки на объект WSHShell, во-вторых, не совсем понял для чего нужно торкать линк.
Код: Set WSHShell = WScript.CreateObject("WScript.Shell")
strExecute = "C:\001\lan2\vpn.lnk"

WSHShell.Run strExecute, 0, False
Автор: D77
Дата сообщения: 22.12.2011 17:55
ComradG

А как торкнуть само соединение я не знаю
Подскажите
Автор: ComradG
Дата сообщения: 22.12.2011 18:01
D77
а мне, если честно, влом объяснять. да и с vpn'ами я не особо люблю возиться через wsh-скрипты.
Автор: OOD
Дата сообщения: 22.12.2011 18:28
ComradG
StartMinimized работает и в трее появляется оутлук ,но он дублируется злостным окном , которое никак не исчезает из панели задач, писал на делфи програмку которая ищет все заголовки и поочереди сворачивает их через win api -толку нет
Автор: diskmen
Дата сообщения: 22.12.2011 20:32
Приветствую вас форумчане.
Подскажите как реализовать проверку имени каталога с заданным шаблоном.
Поясню:
есть необходимость получить все имена папок, содержащих в названии некоторый набор символов - с этим проблем нет. Затруднение в том, что подобных папок может быть несколько, необходимо сравнить полученное на первом шаге имя с заданным шаблоном и если совпадет, выполнить действие.
Пока пришел к такому варианту, но он не работает как надо, сравнения имен не происходит.

Код: strComputer = "."
Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = wmi.ExecQuery("Select * from Win32_Directory where drive=""c:"" and and filename like '%folder%'")
For Each objItem in colItems
Select Case objItem.name
Case "folder 1"
действие1
Case "New folder"
действие2
End Select
Next
Автор: Scaramanga
Дата сообщения: 23.12.2011 15:00
Доброго времени суток.
Есть часть кода:


Код:
Dim strRegistryKeyAndSubsToDelete: strRegistryKeyAndSubsToDelete= "\Software\Programm 1"
Dim strNTUserDatPath, i
For i = 0 To UBound(arrProfilePaths)
strNTUserDatPath = arrProfilePaths(i) & "\" & "ntuser.dat"
If objFSO.FileExists(strNTUserDatPath) = True Then
'LOAD the HIVE from the current ntuser.dat file into "TmpLoadHive"
strRun = "REG.EXE load HKU\TmpLoadHive " & Chr(34) & strNTUserDatPath & Chr(34)
intReturn = oShell.Run(strRun, 0, True)
'DELETE the key and subkeys in the TmpLoadHive
DeleteKeyAndSubsFromTmpLoadHive "TmpLoadHive" & strRegistryKeyAndSubsToDelete
strKeyNameToDelete
strRun = "REG.EXE unload HKU\TmpLoadHive"
intReturn = oShell.Run(strRun, 0, True)
Else
End If
Автор: Black_Lung
Дата сообщения: 23.12.2011 17:11
Scaramanga

попробуй это, токо осторожно, не удали что-то нужное



Цитата:
Set r=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

DelSubkey &H80000002,"","test"


sub DelSubkey(root,key,del_text)
iR = r.EnumKey(root,key,dsSubKeys)
if iR=0 and IsArray(dsSubKeys)=-1 then
    For each dsKey in dsSubKeys
    DelSubkey root,key+"\"+dsKey,del_text
    Next
    end if
if instr(key,del_text)>0 then
r.DeleteKey root,key
else
ir=r.EnumValues(root,key,val,vtype)
if iR=0 and IsArray(val)=-1 then
for k=0 to ubound(val)
        if instr(cstr(val(k)),del_text)>0 then r.DeleteValue root,key,val(k)
    next
    end if
end if


end sub




PS
второй параметр может быть Software или System
DelSubkey &H80000002,"software","test"

PPS
регистр текста учитывается "test" удалит а "Test" нет
Автор: ComradG
Дата сообщения: 23.12.2011 18:26
OOD

Цитата:
...писал на делфи програмку которая ищет все заголовки...
эээ... ммм... а зачем было изобретать велосипед, когда вывести заголовки окон приложений можно через Word.Application?
Код: Set objWord = CreateObject("Word.Application")
Set colTasks = objWord.Tasks

For Each task In colTasks
If task.Visible Then
WScript.Echo task.Name
End If
Next

objWord.Quit
Автор: diskmen
Дата сообщения: 24.12.2011 08:36
ComradG
Задача вполне реальная: да, необходимо рекурсивно перебрать все подпапки в указанном каталоге, выбрать все, содержащие в имени некое слово 'folder' (т .е. выбор по маске), в цикле сравнить каждый из найденных с шаблоном и в зависимости от совпадения выполнить действие.
Пока получился вот такой вариант

Код: strComputer = "."
Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colItems = wmi.ExecQuery("Select * from Win32_Directory where drive=""c:"" and and filename like '%folder%'")
For Each objItem in colItems
If StrComp(objItem.name,"C:\Reminder2",1)=0 Then
действие
Else
If StrComp(objItem.name,"C:\Program Files\Reminder",1)=0 Then
Else
If StrComp(objItem.name,"C:\Program Files (x86)\Reminder",1)=0 Then
Else
End If
End If
End If
Next
Автор: ComradG
Дата сообщения: 24.12.2011 14:37
diskmen

Цитата:
Запрос wmi применяется потому, что точное расположение искомой папки неизвестно заранее.
странное однако представление о wmi. советую перечитать на досуге мантры под названием msdn (курить до просветления, а не до галюнов). ежели серьезно, то вкратце попробую объяснить отчего в данном случае использовать wmi является моветоном. во-первых, wmi лучше использовать в случаях удаленного администрирования или нужды доступа к win-объекту, а раз так, то смотрим в сторону FSO.
Код: Set objFSO = CreateObject("Scripting.FileSystemObject")
Автор: diskmen
Дата сообщения: 24.12.2011 23:21
ComradG
Благодарю за примеры. Ушел курить читать мануалы.
Автор: atomheart
Дата сообщения: 25.12.2011 15:26
Есть вот такой скрипт для WinXPrus, который должен отключать сетевой адаптер:

Код: Const ssfCONTROLS = 3

sConnectionName = "KStar"

'For English versions of Windows
'sEnableVerb = "En&able"
'sDisableVerb = "Disa&ble"

'For Russian versions of Windows
sEnableVerb = "&Включить"
sDisableVerb = "Откл&ючить"

set shellApp = createobject("shell.application")
set oControlPanel = shellApp.Namespace(ssfCONTROLS)

set oNetConnections = nothing
for each folderitem in oControlPanel.items
if folderitem.name = "Сетевые подключения" then
set oNetConnections = folderitem.getfolder: exit for
end if
next

if oNetConnections is nothing then
msgbox "Couldn't find 'Network and Dial-up Connections' folder"
wscript.quit
end if

set oLanConnection = nothing
for each folderitem in oNetConnections.items
if lcase(folderitem.name) = lcase(sConnectionName) then
set oLanConnection = folderitem: exit for
end if
next

if oLanConnection is nothing then
msgbox "Couldn't find '" & sConnectionName & "' item"
wscript.quit
end if

set oDisableVerb = nothing
for each verb in oLanConnection.verbs
if verb.name = sDisableVerb then
set oDisableVerb = verb
oDisableVerb.DoIt
end if
next

wscript.sleep 1000
Автор: ComradG
Дата сообщения: 26.12.2011 11:23
atomheart
самое первое что бросается в глаза, так это
Код: Const ssfCONTROLS = 3
Автор: AndVGri
Дата сообщения: 26.12.2011 12:51
atomheart
Через WMI, хоть ComradG его и не любит. Просмотри список. У Win32_NetworkAdapter (objNetCard) есть метод Disable соответственно.

Код:
On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colNetCards = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapter Where NetConnectionID Is Not Null")

For Each objNetCard in colNetCards
WScript.Echo objNetCard.Name & " -- " & objnetcard.NetConnectionID
Next
Автор: atomheart
Дата сообщения: 26.12.2011 16:09
AndVGri
Запустил твой скрипт. Вот результат:

Что дальше?
Автор: megamozg13
Дата сообщения: 26.12.2011 16:24
atomheart
ну вам же 99% разжевали, стыдно должно быть...
вот


Код: For Each objNetCard in colNetCards
WScript.Echo objNetCard.Name & " -- " & objnetcard.NetConnectionID
errReturn = objNetCard.Disable()
If errReturn <> 0 Then
WScript.Echo "Disable Network adapter failed for adapter= " & objnetcard.DeviceId
Else
WScript.Echo "Disable Network adapter succeeded for adapter= " & objnetcard.DeviceId
End If
Next
Автор: atomheart
Дата сообщения: 26.12.2011 19:33
megamozg13
Строка: 1
Символ: 2
Ошибка: Объект не является семейством
Код: 800А01С3
Источник: Ошибка выполнения Microsoft VBScript

По вашей ссылке речь идёт о Win32_NetworkAdapter class, я не вижу, чтобы он встречался в приведённом вами коде.
Мне было бы стыдно, если б у меня был такой же мегамоск, какой, видимо, у вас, а т.к. в кодинге я ничего не смыслю, то и стыдиться мне не приходится. Если есть желание помочь - помогите готовым скриптом, может, ещё кому-нибудь пригодится. А не хотите - тогда извините за беспокойство.
Автор: megamozg13
Дата сообщения: 27.12.2011 06:43
atomheart
да тут даже не программирование, а наблюдательность. я привёл пример тела цикла, вот попробуйте скрипт целиком.

On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colNetCards = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapter Where NetConnectionID Is Not Null")

For Each objNetCard in colNetCards
WScript.Echo objNetCard.Name & " -- " & objnetcard.NetConnectionID
errReturn = objNetCard.Disable()
If errReturn <> 0 Then
WScript.Echo "Disable Network adapter failed for adapter= " & objnetcard.DeviceId
Else
WScript.Echo "Disable Network adapter succeeded for adapter= " & objnetcard.DeviceId
End If
Next

Страницы: 12345678910111213141516171819202122232425

Предыдущая тема: Помогите новичку в C++


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