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

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

Автор: WestGott
Дата сообщения: 18.04.2012 21:27
Привет всем
Извините что вопрос немножко не попадает в тему, но может тут наёдётся тот кто с этим сталкивался.
Я написал скрипт в языке JScript
Но как только дошёл до его обкатки в системах с включённым UAC упёрся в грабли, чтобы скрипт работал его нужно запускать с административными полномочиями.
А в контекстном меню для файлов с расширением "js" нет пункта "Запуск от имени администратора".

Погуглив тему наткнулся на код перезапуска скрипта с полномочиями администратора для VBScript.


Код:
If WScript.Arguments.Count = 0 Then
Set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " Run", , "runas", 1
Else
'Сюда пишем код скрипта
End If
Автор: Black_Lung
Дата сообщения: 19.04.2012 10:51
nicka

можно реализовать через InternetExplorer.Application, htm в vbs

chel78
команда ожидания: wscript.sleep(количество мсек)
Автор: chel78
Дата сообщения: 19.04.2012 11:40

Цитата:
команда ожидания: wscript.sleep(количество мсек)

не катит, ошибку кажет.


Код: "VBError --> Number: 424    Source: Microsoft VBScript runtime error    Description: Object required: 'wscript'    Line: 4    Column: 0"
Автор: Black_Lung
Дата сообщения: 19.04.2012 12:51
Да, ошибка, если без vbs то можно так:

Код:
Application.Wait Now + TimeValue("00:00:10")
Автор: chel78
Дата сообщения: 19.04.2012 14:40

Цитата:
Да, ошибка, если без vbs то можно так:

Код:

Application.Wait Now + TimeValue("00:00:10")

снова не оно.. ошибки не кажет, пишет сакцесс, но в итоге ничего не происходит
Автор: Black_Lung
Дата сообщения: 19.04.2012 17:38
chel78
оно ничего писать не должно, просто ждёт время заданное параметром TimeValue
Если нужна явная пауза то можно вставить Msgbox "Pause", это будет висеть пока не нажмеш ОК.
Автор: chel78
Дата сообщения: 19.04.2012 18:04

Цитата:
оно ничего писать не должно

так оно и не делает ничего
Автор: johnysc3
Дата сообщения: 23.04.2012 15:54
Здравствуйте!
Windows Server 2008 R2, VBS, терминальные пользователи без админ-прав.
Подскажите, пожалуйста, как мне в скрипте vbs увидеть переменные окружения текущего пользователя, если я запускаю скрипт из планировщика с полными правами (галочка "Выполнять с наивысшими правами")?
Подробнее:
Есть скрипт, меняющий временные папки для пользователей в терминале:

Код: const HKEY_CURRENT_USER = &H80000001
strComputer = "."

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")

strKeyPath = "Environment"
strValue1Name = "TEMP"
strValue1 = "t:\Temp\" & createobject("wscript.shell").expandenvironmentstrings("%username%")

strValue2Name = "TMP"
strValue2 = "t:\Temp\" & createobject("wscript.shell").expandenvironmentstrings("%username%")

oReg.SetExpandedStringValue _
HKEY_CURRENT_USER,strKeyPath,strValue1Name,strValue1

oReg.SetExpandedStringValue _
HKEY_CURRENT_USER,strKeyPath,strValue2Name,strValue2
Автор: megamozg13
Дата сообщения: 23.04.2012 16:04
johnysc3
вот вырезка из моего основного логон скрипта, все в синтаксисе JavaScript:


Цитата:
Shell=WScript.CreateObject("WScript.Shell");
path=WScript.ScriptFullName.substr(0,WScript.ScriptFullName.length-WScript.ScriptName.length);
user=Shell.ExpandEnvironmentStrings("%USERNAME%"); user=user.toUpperCase();
comp=Shell.ExpandEnvironmentStrings("%COMPUTERNAME%"); comp=comp.toUpperCase();


if (comp=="SERVER"|comp=="SERVER2"){
try {Shell.Run(path+"Set_TMP.js",0,true)} catch(e) {WScript.Echo("Ошибка автозагрузки: "+path+"Set_TMP.js\nОбратитесь к администратору")};
};


скрипт прописывания темпов для каждой сессии Set_TMP.js:

Цитата:
function STR0(x,y)
{ var str=x.toString(10); while (str.length<y){str="0"+str}; return (str);}

Sh=new ActiveXObject("WScript.Shell"); Fso=new ActiveXObject("Scripting.FileSystemObject");
username=Sh.ExpandEnvironmentStrings("%USERNAME%"); username=username.toUpperCase();
comp=Sh.ExpandEnvironmentStrings("%COMPUTERNAME%"); comp=comp.toUpperCase();

session=Sh.ExpandEnvironmentStrings("%SESSIONNAME%"); session=session.toUpperCase();
if (session.length>7) { session=session.substr(8); session=STR0(session,5); };

if (comp=="SERVER"){
tmp_path="E:\\TMP\\"; if (!Fso.FolderExists(tmp_path)) Fso.CreateFolder(tmp_path);
tmp_path="E:\\TMP\\"+session; if (!Fso.FolderExists(tmp_path)) Fso.CreateFolder(tmp_path);
Sh.RegWrite("HKEY_CURRENT_USER\\Environment\\TEMP",tmp_path);
Sh.RegWrite("HKEY_CURRENT_USER\\Environment\\TMP",tmp_path);
};

if (comp=="SERVER2"){
tmp_path="D:\\TMP\\"; if (!Fso.FolderExists(tmp_path)) Fso.CreateFolder(tmp_path);
tmp_path="D:\\TMP\\"+session; if (!Fso.FolderExists(tmp_path)) Fso.CreateFolder(tmp_path);
Sh.RegWrite("HKEY_CURRENT_USER\\Environment\\TEMP",tmp_path);
Sh.RegWrite("HKEY_CURRENT_USER\\Environment\\TMP",tmp_path);
};


вот эта может быть непонятная штука:

Цитата:
session=Sh.ExpandEnvironmentStrings("%SESSIONNAME%"); session=session.toUpperCase();
if (session.length>7) { session=session.substr(8); session=STR0(session,5); };

это проверка логина на консоль сервака, там выстреливает "CONSOLE" когда в других случаях "SESSIONNAME=RDP-Tcp#722" например
Автор: johnysc3
Дата сообщения: 23.04.2012 16:13
Да, но Sh.RegWrite("HKEY_CURRENT_USER\\Environment\\TEMP",tmp_path); не выполнится с ограниченными правами, а с админ правами - выполнит изменение переменной TEMP у админа. В этом суть проблемы.
Автор: megamozg13
Дата сообщения: 23.04.2012 16:19
johnysc3 "HKEY_CURRENT_USER" в "курент юзер" всё должно работать и у вас.
а с админ правами, вы выполняете скрипты от имени админа, там конечно другие переменные окружения.
Автор: johnysc3
Дата сообщения: 23.04.2012 17:18
Сделал запуск скрипта через gpedit.msc -> Конфигурация пользователя -> Конфигурация Windows -> Сценарии вход/выход -> вход в систему, и все заработало Всем спасибо, сам изначально закосячил со способом запуска - с планировщика не работает.
Автор: Kostenius
Дата сообщения: 11.05.2012 00:16
Здравствуйте, ру-бордовцы!
Озадачился на днях автоматизировать создание архива из выбранных файлов и папок с помощью кнопки на панели Total Commander. При нажатии кнопки вызывается .VBS файл с параметрами:
%P (исходный путь);
%S (имена всех выделенных файлов);
%N (имя файла с расширением под курсором. Используется для задания имени создаваемого архива).
и интерпретируется WSH. При успешном создании архива исходные файлы/папки автоматически удаляются.
После нескольких дней чтения документации и экспериментов (впервые создаю программу на объектно-ориентированном языке) родился следующий скрипт:

Код:
Dim objargs, i, farh, path
Set objargs = WScript.Arguments
For i=1 To objargs.Count-2
farh = farh & Chr(34) & objargs(i) & Chr(34) & " "
Next
Set WshShell = CreateObject("WScript.Shell")
Set job = WshShell.Exec ("e:\progs\TotalCmd\plugins\arc\7za.exe a -tzip " &Chr(34)&objargs(objargs.Count-1) & ".zip"&Chr(34)& " "&farh)
    Do
    WScript.Sleep 30
    Loop While job.Status = 1
    path = Chr(34)&objargs(0)&Chr(34)    
    WshShell.Exec ("cmd /c cd /d " &path&"& del /f /q "& farh&"& rd /s /q "&farh)
Автор: aanufriev
Дата сообщения: 11.05.2012 10:48
[more] Добрый день!
Я в создании скриптов полный ноль, что конечно расстраивает, но изучить прежде чем написать этот скрипт времени мне не дают
Задача такая, необходимо создать скрипт, который сможет выполнять данные действия:
из файла приходящего в папку C:\INFO\, название файла read*.* (*-бывает разное, в основном 001), пример файла read1804.001 кодировка DOS, взять текст *.arj (* текст меняется) после создать файл get.txt с текстом get mfo *.arj и положить его в папку C:\БИКИ\get\, переместить файл read*.* в C:\INFO\(сегодняшняя дата в формате «год.месяц.число»)\

второй скрипт (можно конечно его объединить, просто архив приходит примерно через минуту)

приходит архив в папку C:\BNK\IZM\ с названием *.arj необходимо разархивировать его в туже папку, после архив удалить.
Запускается exe файл C:\BNK\01RKC#.exe (ПО досовское) выскакивает сообщение об обновлении, необходимо кликнуть как то на «ignore»,
http://saveimg.ru/show-image.php?id=...a9a0105d15f167
закрыть ПО (закрывается по двум кликам «esc»)
На сетевом диске Z:\ изменить имя папки DAT на нынешнюю дату в формате год.месяц.число (пример 2012.04.18)
скопировать папку C:\BNK\DAT на сетевой диск Z:\

Было бы конечно еще хорошо если в случае окончания всех этих действий на мой ПК прилетало бы сообщение типа «БИКИ обновлены» (можно реализовать например жббером или любым лругим способом)

помогите пожалуйста, кто чем сможет, как это можно реализовать? [/more]
Автор: Vitalka84
Дата сообщения: 12.05.2012 08:49
[more] Доброго времени суток!
Стоит следующая задача:
- на удалённом ftp сервере есть каталог в который стекаются файлы в формате .csv.
- нужно скачать файлы локально и перекодировать их в формат .xls
Все эти действия должны происходит в результате запуска одного .bat файла.
Скачивать файлы проблем не составляет, но автоматически перекодировать - проблема. В интернете много написано как это сделать при помощи TotalCSVConverter и ему подобных программ, которые можно запускать с командной строки. Но нормальные программы платные, а всё что я нашёл "шаровое" работает криво либо вообще не работает... Как вариант решил обратится к VBA. Признаюсь сразу, что до этого никогда ничего не писал на VBA.
Нашёл скрипт, который перекодирует .csv в .xls:

const xlCSV = 6
const xlTextMSDOS = 21
const xlWorkbookNormal = -4143
const wdFormatRTF = 6
const wdFormatDocument = 0
const wdFormatText = 2
const wdFormatDOSText = 4
Z = WScript.Arguments.UnNamed.Item(0)
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
ExcelApp.WorkBooks.Open "D:\test.csv"
ExcelApp.ActiveWorkbook.SaveAs "D:\test.xls", xlWorkbookNormal
ExcelApp.Quit

Далее попытался "научить" скрипт перекодировать все файлы в каталоге. Как параметр Z передаю путь к каталогу:

const xlCSV = 6
const xlTextMSDOS = 21
const xlWorkbookNormal = -4143
const wdFormatRTF = 6
const wdFormatDocument = 0
const wdFormatText = 2
const wdFormatDOSText = 4
Z = WScript.Arguments.UnNamed.Item(0)
Dim x as String
Dim file as string
x = "Z"
file = Dir(x)
Do While file <> ""
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
ExcelApp.WorkBooks.Open "x & file"
ExcelApp.ActiveWorkbook.SaveAs "x.xls", xlWorkbookNormal
ExcelApp.Quit
file = Dir
Loop

При запуске скрипта с cmd вылетает ошибка:
D:\test.vbs(9, 7) Ошибка компиляции Microsoft VBScript: Предполагается наличие окончания инструкции
Ругается на строку:
Dim x as String
Но что в ней не так? Или вообще весь скрипт написан не правильно?
Запускаю с cmd так:
cscript.exe test.vbs D:\csv\
ОООчень прошу помощи.
Заранее огромное спасибо! [/more]
Автор: Black_Lung
Дата сообщения: 14.05.2012 10:27
aanufriev
vbs не дружит с *.*, это лучше делать обычным cmd.

Vitalka84
Убери dim с заданием типа, это в vbs не используется, команда dim только нужна для обявления масива.
Автор: ComradG
Дата сообщения: 14.05.2012 16:07
Black_Lung
меняй диллера и не кури что попало!
Цитата:
команда dim только нужна для обявления масива.
разбежался об забор! тебе Option Explicit уже ни о чем не говорит? и ты вообще в курсе, что значит Dim? Dim - оператор обявления переменной с последующим резервированием для нее памяти.
Цитата:
vbs не дружит с *.*, это лучше делать обычным cmd
всю жизнь дружила, а пришел Black_Lung и переписал интерпретатор w\cscript, не уведомив при этом мелкософт читай msdn и не в води в заблуждение остальных своими высерами.
Автор: Vitalka84
Дата сообщения: 15.05.2012 00:13

Цитата:
Vitalka84
Убери dim с заданием типа, это в vbs не используется, команда dim только нужна для обявления масива.


Не помогло... Ошибка осталась прежней... Есть ещё варианты?

Автор: Black_Lung
Дата сообщения: 15.05.2012 10:48
ComradG

Цитата:
меняй диллера и не кури что попало!

Оказывается нужно курить для этого, не вкурсе, расскажи что и диллера какого брть.


Цитата:
разбежался об забор! тебе Option Explicit уже ни о чем не говорит?
....
Цитата:
переписал интерпретатор
извиняюсь забыл дописать "имхо". Я vbs использую по необходимости и "Option Explicit" мне никогда не было нужно и dim мне нужен только для масива.

Vitalka84
Если убрать "as String", то ошибки нет, а можно вообще стоки c dim убрать, имхо, они не нужны без них отлично работает:

[more]
const xlCSV = 6
const xlTextMSDOS = 21
const xlWorkbookNormal = -4143
const wdFormatRTF = 6
const wdFormatDocument = 0
const wdFormatText = 2
const wdFormatDOSText = 4
Set fso = CreateObject("Scripting.FileSystemObject")
folder = WScript.Arguments.UnNamed.Item(0)
Set f = fso.GetFolder(folder)
Set fc = f.Files
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
For each fl in fc
    fext=fso.GetExtensionName(fl)
    if fext="csv" then
        fname=left(fl.name,len(fl.name)-4)
        wscript.echo fname    
        ExcelApp.WorkBooks.Open fl
        ExcelApp.ActiveWorkbook.SaveAs folder&fname&".xls", xlWorkbookNormal
    end if
next
ExcelApp.Quit
[/more]
Автор: Vitalka84
Дата сообщения: 15.05.2012 22:09
Black_Lung
Спасибо огромнейшее!!! Действительно работает!!!
Правда если файлов >20, то скрипт отрабатывает довольно таки долго... Может можно как-то разогнать его?
Автор: ComradG
Дата сообщения: 16.05.2012 10:38
Vitalka84
во-первых, лучше не использовать неименнованные переменные (запоминать порядок следования аргументов - это абзац), т.е. задать именованные аргументы, вроде:

Код: With WScript.Arguments.Named
If .Count <> 2 Then
WScript.Echo "Error: lost argument."
WScript.Echo "/s - source folder with input files" & Chr(10) & "/o - output directory"
WScript.Echo.Quit(1)
Else
Set Excel = WScript.CreateObject("Excel.Application")
Excel.DisplayAlerts = False

With WScript.CreateObject("Scripting.FileSystemObject")
For Each file In .GetFolder(Item("s")).Files
'здесь логика конвертации
Next
End With

EXcel.Quit
End If
End With
Автор: Cyril Konst
Дата сообщения: 23.05.2012 09:08
подскажите скрипт, который бы принимал файлы по pop3 и копировал их в папочку?
Автор: Klondayk7
Дата сообщения: 24.05.2012 10:32
Всем доброго!

Не могу понять почему не перенаправляется выходной поток в файл.
Вот следующая кострукция не отрабатывает:


Код: Set WshShell = WScript.CreateObject("WScript.Shell")
RetCode = WshShell.Run ("ftp -s:" & ftpscript & " >>F.log", , True)
Автор: jeykey
Дата сообщения: 24.05.2012 12:41
Klondayk7
Надо как-то так:

Код:
command = "ftp -s:" & ftpscript"
logfile = "D:\F.log"

Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec(command)
Set TextStream = WshExec.StdOut
Do
    Str = Str & TextStream.ReadLine() & vbCrLf
Loop Until TextStream.AtEndOfStream
TextStream.Close

Set fso = CreateObject("Scripting.FileSystemObject")
Set TextStream = fso.CreateTextFile(logfile)
TextStream.Write(str)
TextStream.Close
Автор: anynamer
Дата сообщения: 26.05.2012 01:28
Помогите, пожалуйста, со скриптом который делает это на локальном ПК:


и другой скрипт, который наоборот заполняет эти данные:

IP-адрес: XX.XX.XX.XXX
Маска подсети: 255.255.254.0
Основной шлюз: XX.XX.XX.X
Предпочитаемый DNS: XX.XX.XX.X
Альтернативный DNS: XXX.XXXXX.X

Автор: jeykey
Дата сообщения: 26.05.2012 11:20
anynamer
[more=динамика]
strComputer = "."
strMACAddress = "00:00:00:00:00:00"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and MACAddress = " & """" & strMACAddress & """")

strDNS = NULL

For Each objNetAdapter In colNetAdapters
objNetAdapter.EnableDHCP()
errDNS = objNetAdapter.SetDNSServerSearchOrder(strDNS)
Next

If errReturn = 0 Then
MsgBox "DHCP Enabled"
Else
MsgBox "Error"
End If
[/more]

[more=статика]
strComputer = "."
strMACAddress = "00:00:00:00:00:00"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and MACAddress = " & """" & strMACAddress & """")

strIPAddress = Array("000.000.000.000")
strSubnetMask = Array("000.000.000.000")
strGateway = Array("000.000.000.000")
strGatewayMetric = Array(1)
strDNS = Array("000.000.000.000", "000.000.000.000")

For Each objNetAdapter in colNetAdapters
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
errDNS = objNetAdapter.SetDNSServerSearchOrder(strDNS)
If errEnable = 0 Then
MsgBox "The IP address has been changed."
Else
MsgBox "The IP address could not be changed."
End If
Next
[/more]

В скрипте надо указать свои настройки IP и mac-адрес сетевой карты. mac-адрес можно убрать, просто у меня установлен virtualbox и без указания mac скрипт на его виртуальном адаптере тоже меняет настройки.
З.Ы. И, кстати, если установлена семерка, то надо запускать от имени администратора. Я запускал командную строку от имени админа и оттуда уже скрипт. Вот такие костыли)))
Автор: folta
Дата сообщения: 26.05.2012 14:57
вопрос как обычно, странный)
можно ли воссоздать на VBScript гм...алгоритм, который сможет убить все дочерние процессы explorer.exe, не трогая его самого?
запустил-убил-завершил.
если да, буду читать, а так, чего зазря мучаться))
Автор: karakurt2
Дата сообщения: 26.05.2012 18:27
Насколько я знаю, в Windows нет такого соотношения родительский процесс-дочерний процесс как в *NIX. Создавая дочений процесс, вы получаете его дескриптор, который можно опрашивать о состоянии работы запущенного процесса. Можно поместить все процессы в оболочку (не знаю русский термин, по-английски job), которая позволит завершить сразу несколько процессов, находящихся в этой оболочке. Но, разумеется это надо реализовать программно, а большинство дочерних процессов работают автономно, после запуска родительский процесс их не контролирует.
Автор: anynamer
Дата сообщения: 26.05.2012 19:39
jeykey Большое спасибо!
А в этой строке второй диапазон это Альтернативный DNS ?

Код: strDNS = Array("000.000.000.000", "000.000.000.000")
Автор: jeykey
Дата сообщения: 26.05.2012 22:00
anynamer
да

Страницы: 12345678910111213141516171819202122232425

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


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