Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование "удобняшек" на VBScript (Часть 2)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопросы, задачи и их решения по VBScript.

 
Мануал (english, 600 Кб). | Зеркало
MS Scripting 5.6 (700 КБ), включает последнюю версию VBS. Владельцам XP/2000(?) должен быть не нужен. | Зеркало
Немного на wikiпедии.
Предыдущие части: 1
 
Смежные темы:
Сценарии Windows
Командная строка, батники\сценарии (bat, cmd)
Скрипты KiXtart

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:12 12-07-2011 | Исправлено: Smitis, 23:28 26-02-2018
sundraw

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Большое спасибо! С Вашей помощью вопрос решён.

Всего записей: 844 | Зарегистр. 15-05-2011 | Отправлено: 10:55 28-05-2019 | Исправлено: sundraw, 18:33 28-05-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как бы улучшить, особенно, чтобы «Имя файла с пробелами» нормально отрабатывало?

Код:
'Windows-1251
 
Sub FileExists(file)
    If (NOT fso.FileExists(file)) Then
        WScript.Echo file, " - не найден."
        Call EndScript()
    End If
End Sub
 
Sub EndScript
    If (NOT IsNull(fso)) Then Set fso = Nothing End If
    If (NOT IsNull(objShell)) Then Set objShell = Nothing End If
    WScript.Quit
End Sub
 
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
 
Dim file
file = "Имя файла с пробелами.ps1"
Call FileExists(file)
 
prog = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
args = " -nologo -noninteractive -file "
comd = prog & args & file
 
Set shell = CreateObject("WScript.Shell")
shell.Run comd, 0, false

Всего записей: 3521 | Зарегистр. 16-08-2012 | Отправлено: 17:30 14-06-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Как бы улучшить, особенно, чтобы «Имя файла с пробелами» нормально отрабатывало?  

comd = prog & args & """" & file & """"

----------
Разум когда-нибудь победит

Всего записей: 3216 | Зарегистр. 09-02-2003 | Отправлено: 22:54 14-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Спасибо. Так работает. Магия кавычек…

Всего записей: 3521 | Зарегистр. 16-08-2012 | Отправлено: 23:33 14-06-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
iNNOKENTIY21
Можно ещё chr(34) использовать

----------
Разум когда-нибудь победит

Всего записей: 3216 | Зарегистр. 09-02-2003 | Отправлено: 13:46 15-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
Можно ещё chr(34) использовать

Есть преимущества?
 
Я там: Updates.vbs еще путь добавил, для фулнейма и запуска не только из каталога скрипта. надеюсь без косяков. Вроде работает

Всего записей: 3521 | Зарегистр. 16-08-2012 | Отправлено: 14:41 15-06-2019
generator324

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите чайнику, плииз!
Нужно удалить несколько файлов по маске. Файлы вида "имя файла_номер.zip". Номер файла может быть разный, т.е. он изначально неизвестен. Примерно в таком виде:
"имя файла_01.zip"
"имя файла_02.zip"
"имя файла_03.zip"
Ну, и так далее. Т.е. файлов может быть несколько. И нужно удалить все, которые содержат "имя файла".
Делал так (нашёл пример где-то):

Код:
 
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists("D:\XXX\имя файла_*.zip") Then _
   fso.DeleteFile "D:\XXX\имя файла_*.zip", TRUE
 

Но оно удаляет только в том случае, если я напишу конкретное имя файла. Например, "имя файла_03.zip"
А мне нужно удалить по маске. И ничего не выходит
Сорри за сумбурное, чайниковское изложение

Всего записей: 1090 | Зарегистр. 11-01-2019 | Отправлено: 20:36 25-08-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, generator324
Попробуйте получать содержимое папки при помощи "Shell.Application" и фильтровать.  

Код:
const SHCONTF_FOLDERS = &h00020
const SHCONTF_NONFOLDERS = &h00040
const SHCONTF_INCLUDEHIDDEN = &h00080
const SHCONTF_INCLUDESUPERHIDDEN = &h10000
 
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShellApp = CreateObject("Shell.Application")
Set oFolder = oShellApp.NameSpace("D:\XXX\")
Set oFolderItems = oFolder.Items()
oFolderItems.Filter SHCONTF_FOLDERS + SHCONTF_NONFOLDERS + SHCONTF_INCLUDEHIDDEN, "filename_*.zip"
For Each oFile in oFolderItems
  If oFSO.FileExists(oFile.Path) Then oFSO.DeleteFile(oFile.Path)
Next

Обратите внимание, для "Shell.Application" zip-файл - это папка!

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 21:11 25-08-2019
generator324

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Ух, как всё сложно <для меня>! А нельзя ли как-нибудь попроще? Ну, типа удаления файлов при помощи команды Del (RD) по маске?
Я, собственно, это и пытался сделать. Просто кусочек, который я привёл, это часть большого скрипта, который выкачивает обновления ДубльГис. Обнаружил, что со временем в папке скапливается большое кол-во этих "имя файла_*.zip". Но это ещё не самое неприятное - неприятное происходит в случае отсутствия соединения с инетом: в случае наличия файла обновления предыдущей версии он распаковывается, и создаётся иллюзия прошедшего обновления. Хотя в действительности этого не произошло.
Поэтому и пришло решение удалять все эти файлы по завершению обновления, чтобы в следующий раз не возникало коллизий...
Можно, конечно наверное в %TEMP% распаковывать - он чистится у меня регулярно, но... Меня заинтересовала сама возможность удаления файлов по маске (VBScript) - возможно, прийдётся использовать где-нибудь ещё...

Всего записей: 1090 | Зарегистр. 11-01-2019 | Отправлено: 21:49 25-08-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
generator324
"Попроще" - разве что регекспом проверять.

Код:
 
Set oFSO = CreateObject("Scripting.FileSystemObject")
 
Set oRegExp = CreateObject("VBScript.RegExp")
oRegExp.IgnoreCase = True
oRegExp.Pattern = "^имя файла_.*\.zip$"
 
Set oFolder = oFSO.GetFolder("D:\XXX\")
For Each oFile in oFolder.Files
  If oRegExp.Test(oFile.Name) Then oFSO.DeleteFile(oFile.Path)
Next
 

PS WshShell.Run  del - не вариант?

Код:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd /c del ""D:\XXX\имя файла_*.zip""",0,true

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 22:10 25-08-2019
generator324

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy

Цитата:
"Попроще" - разве что регекспом проверять.  

Уф! Попробую завтра поэксперементировать, может что получится .
Меня смутило (в вашей первой версии) и сейчас вот это:

Код:
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oRegExp = CreateObject("VBScript.RegExp")  

Знаю, что смешно, но поскольку я "знаток" тот ещё, а меня дальше идут некие "конструкции" (вызов wget с параметрами, распаковка - в общем используется WshShell) боюсь, что не смогу скрестит "ужа с ежом"
Сейчас у меня так:

Код:
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
 

А вот как поведёт себя добавление всяких oFSO и oRegExp не знаю. По идее, ничего страшного - хотя что-то будет явно избыточным <у меня>. В общем, поэкперементировать надо.

Цитата:
PS WshShell.Run  del - не вариант?  

Кстати, да - вполне себе вариант . Только окошко будет мелькать - ну, да это не страшно. Что-то даже в голову не пришло, хотел уж вызов батника городить, хотя зачем? Всё ж просто! Если знать, как.
Не думал, что удаление файлов по маске через WSH вызовет такие сложности - думал, просто я чего-то мудрю. А оно вона как...

Всего записей: 1090 | Зарегистр. 11-01-2019 | Отправлено: 22:49 25-08-2019
Tilks

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
зачем vbs, если батник должен удалять, если система понимает по русски.
мне такое не удаляет, из за языка
del "имя файла_*.zip"
 
такое удаляет
del "file name_*.zip"
 
команда del

Цитата:
для удаления нескольких файлов можно воспользоваться подстановочными знаками (* и ?). При использовании символов подстановки в команде del следует быть особенно внимательным во избежание нежелательных удалений.

 
 
 
Добавлено:
имя файла_01.zip
имя файла_02.zip
имя файла_03.zip
имя файла_04.zip
file name_01.zip
file name_02.zip
file name_03.zip
file name_04.zip
 
удаляет батником, который в кодировке utf-8 без BOM

Код:
chcp 65001
del "R:\TEMP\User\file name_*.zip"
del "R:\TEMP\User\имя файла_*.zip"
pause

Всего записей: 2688 | Зарегистр. 14-08-2005 | Отправлено: 00:38 26-08-2019
generator324

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tilks

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

Затем, что он (vbs) уже есть . Просто потребовалось добавить ф-цию удаления файла по маске. Никогда ранее не сталкивался с таким в vbs, вот и возник вопрос. Как удалить много файлов с помощью батника знаю

Всего записей: 1090 | Зарегистр. 11-01-2019 | Отправлено: 07:55 26-08-2019
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
день добрый коллеги
в VBS не силен, кое что по шаблону.
 
 
можно ли через VBS создать REG_SZ в реестре
с именем \\BE1-DC-02.be1.corp.local\client64\common\1cestart.exe
и значением WIN7RTM
 
нужно тоже самое что делает это:
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "\\BE1-DC-02.be1.corp.local\client64\common\1cestart.exe" /t REG_SZ /d WIN7RTM /f
 
пытался накорябать, но не могу создать имя с \\  vbs их не воспринимает, пытался экранировать двойными кавычками но не получается, прошу помощи  
 
Set wshShell = CreateObject( "WScript.Shell" )
sPath = ""\\BE1""
 
reg_root = "HKCU"
reg_key = "\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\"
reg_param = sPath
reg_value ="WIN7RTM"
 
wshshell.RegWrite reg_root & reg_key & reg_param, reg_value, "REG_SZ"

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 13:52 05-09-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
JohnRD
sPath = "\\BE1"
 
П.С.
А понял, нужно, что бы имя параметра содержало обратный слеш...
Такое впечатление, что никак.
Если нужен именно VBS, могу предложить попробовать обходной манёвр - использовать в пути прямые слеши вместо обратных (может прокатить, а может и нет, надо пробовать)

Код:
CreateObject("WScript.Shell").RegWrite "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\//BE1-DC-02.be1.corp.local/client64/common/1cestart.exe", "WIN7RTM", "REG_SZ"



----------
Разум когда-нибудь победит

Всего записей: 3216 | Зарегистр. 09-02-2003 | Отправлено: 11:32 06-09-2019 | Исправлено: Smitis, 12:03 06-09-2019
Rush

Уже за тридцать...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JohnRD
Можно так попробовать:

Код:
 
const HKEY_CURRENT_USER = &H80000001
 
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 
reg_key = "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
reg_param = "\\BE1-DC-02.be1.corp.local\client64\common\1cestart.exe"
reg_value = "WIN7RTM"
 
objReg.SetStringValue HKEY_CURRENT_USER, reg_key, reg_param, reg_value
 

Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 14:39 06-09-2019 | Исправлено: Rush, 14:40 06-09-2019
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Rush
 
спасибо
работает, но если есть ключ Layers
изначально его нет, пока не был сделан хоть один режим совместимости
 

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 15:26 06-09-2019
Rush

Уже за тридцать...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JohnRD
 

Код:
 
const HKEY_CURRENT_USER = &H80000001
 
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 
reg_key = "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
reg_param = "\\BE1-DC-02.be1.corp.local\client64\common\1cestart.exe"
reg_value = "WIN7RTM"
 
objReg.CreateKey HKEY_CURRENT_USER, reg_key
 
objReg.SetStringValue HKEY_CURRENT_USER, reg_key, reg_param, reg_value
 

 
Если раздела нет - он создается, если существует - CreateKey игнорируется.

Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 16:35 06-09-2019
JohnRD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Rush
огромное спасибо,  
все отлично
 
может кому пригодится:
 
проблема возникла с 32разрядными клиентами 1с последних версий на win7 и 32 и 64
периодически вываливаются 1с с такой ошибкой
 

Код:
 
Сигнатура проблемы:
  Имя события проблемы:                 APPCRASH
  Имя приложения:                             1cv8c.exe
  Версия приложения:                        8.3.14.1779
  Отметка времени приложения:     5cde5b71
  Имя модуля с ошибкой:                  ntdll.dll
  Версия модуля с ошибкой:             6.1.7601.24335
  Отметка времени модуля с ошибкой:        5c267e2a
  Код исключения:                              c0000005
  Смещение исключения:                  00034723
  Версия ОС:                                          6.1.7601.2.1.0.256.48
  Код языка:                                          1049
  Дополнительные сведения 1:        0a9e
  Дополнительные сведения 2:        0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:        0a9e
  Дополнительные сведения 4:        0a9e372d3b4ad19135b953a78882e789
 

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

Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 09:41 09-09-2019 | Исправлено: JohnRD, 09:42 09-09-2019
korosya

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Создаю UI при помощи JavaScript. Есть блок из различных элементов. Возможно ли сделать кнопку "+", при нажатии на которую снизу от этого же блока появился второй такой же блок, у которого было бы такая же кнопка "+" для создания третьего блока (и т.д.) и кнопка "-" для удаления этого второго блока? Если возможно, то подскажите, пожалуйста, как.

Всего записей: 1005 | Зарегистр. 19-07-2003 | Отправлено: 20:46 11-09-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование "удобняшек" на VBScript (Часть 2)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru