Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
вопрос на засыпку, что то я в сети не найду как на вбс переименовать папку?!
Используй обьектную модель WMI
Code
Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colFolders = objWMIService.ExecQuery _ ("Select * from Win32_Directory where name = 'c:\\Folder1'") For Each objFolder in colFolders errResults = objFolder.Rename("C:\Folder2") MsgBox "Результат выполнения (код ошибки): " & errResults Next
Также есть возможность переименовывать все что хочешь рекурсивно.
Это пространство имен (одно из них) в обьектной модели WMI, не обращай внимания \\. - точка означает локальный компьютер, если требуется управлять компьютером в домене, то вместо точки имя компа в сети. Как задавать вопросы
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colFolders = "[%1]" errResults = objFolder.Rename("[%2]") publication.nbSetVar "[%3]", errResults
не работает
Добавлено (16 Октябрь 2009, 20:06) --------------------------------------------- DEMBEL, у тебя в примере использовался цикл, если юзать в нб, то как запихивать туда последовательность имен?!
Quote
("Select * from Win32_Directory where name = 'c:\\Folder1'")
то что ты написал и не должно работать, где выборка обьектов "папка" и запрос к ней?
Quote (DEMBEL)
Set colFolders = objWMIService.ExecQuery _ ("Select * from Win32_Directory where name = 'c:\\Folder1'")
а ты просто присваиваешь имя переменной:
Quote (sp3d)
Set colFolders = "[%1]"
в результате у тебя обьект objFolder к которому ты пытаешься применить метод .Rename("[%2]") у тебя пустой. Да даже не в результате, а он просто пустой, где ты видишь что туда чтото присваивается? а в цикле присваивается:
For Each objFolder in colFolders Для каждого objFolder из коллекции colFolders... - автоматическое присвоение имени objFolder элементам коллекции colFolders при его "вынимании" из коллекции. Коллекция формируется в результате запроса к WMI, и objFolder - это не самостоятельный обьект в данном случае, это ты его так назвал, а лишь синоним элементов коллекции, собственных методов objFolder.Rename тут быть не может. Метод Rename делает WMI для коллекции colFolders, а раз ты ее не спрашиваешь, то и делать не будет. Цикл потомучто из другого скрипта вырезал кусок (в нем задавалась маска обектов, поэтому обьект был не один) и требовалось работать с каждым обьектом.
Quote (sp3d)
если юзать в нб, то как запихивать туда последовательность имен?!
что ты имеешь в виду, тебе необходимо переименовать много разных папок? зачем последовательность имен? Как задавать вопросы
Cim_Datafile='[%1]'") пути здесь должны содержать двойные \\ поэтому и не робит, и мой пример в т.ч. видимо
Хотя что я вру, проверил работает все и с одиночными слешами, переименовывает все пучком
Добавлено (16 Октябрь 2009, 21:23) --------------------------------------------- ты не забыл при objFile.Rename("c:\путь\файл.txt") полный путь к файлу указывать? или токо имя пишешь?
ну дак если пути к файлу будут одинаковые в %1 и %2, то он никуда и не переместит, получается)))
Добавлено (16 Октябрь 2009, 21:27) --------------------------------------------- принцип то тот же, что Копировать/Перемещать/Переименовать, меняются пути к файлу и все, включая его имя либо нет.
Добавлено (16 Октябрь 2009, 21:33) ---------------------------------------------
Quote (sp3d)
пока эксперементировал, то нашел как еще мона переименовать, но смущает MoveFolder
VBScript работает посредством обращения к существующим обьектным моделям винды. У них существуют одинаковые методы. Здесь ты обращаешься к скриптовой модели WSH, можно сделать тоже самое через WMI в моем примере. Моделей существует много, в т.ч. для интернет эксплорера, приложений микрософт офис, адобе... поэтому через VBScript можно управлять этим хозяйством, другое дело что некоторые методы моделей он не поймет, т.к. является урезанной версией языка Microsoft Visual Basic (VB), а модели создавались для программирования в VB и VB for Applications (VBA)
Добавлено (16 Октябрь 2009, 21:56) ---------------------------------------------
Quote (sp3d)
понимаешь надо из НБ имена папок назначить, а не из вбс
короче, сяду покопаюсь с этим случаем... тебе надо переименовать 10 папрк. для этого ты в НБ формируешь массив существующих имен папок, массив новых имен и передаешь эти массивы в скрипт, в скрипте в цикле вынимаются элементы массивов, сопоставляются по одному и происходит операция переименовывания, я так понял? Ну это при условии что папки в разных местах и с разными именами, еслиб они были похожие - Folder1 Folder2... то можно было бы проще... Как задавать вопросы
Ну если разницы нету между MoveFolder и Rename то тогда останавлюсь на MoveFolder она переименовывает и нет никаких ошибок Кста посмотри в скриптах НБ тоже есть функция по переименования файлов наз-ся File Rename
если все папки находятся внутри одной папки, то существующие имена можно просто "собрать" в скрипте, но буду делать исходя из того что пути абсолютно разные, будешь массив прописывать в НБ руками
или сделать через файл - прописать там имена папок и новые имена и читать его скриптом... короче, раз массивы, то делаю как будто читаем массив из НБ
--------------------------------------------- Чето как-то не так... сначала мутил-мутил массивы, а потом даже массивы внутри скрипта не потребовались, токо надо было правильно сформировать имя необушного массива с переменными для nbGetVar
И почему neobook не понимает запись [folder[count]] - было бы вовсе без извращений... че к чему так массивы называть без отделения номера элемента, пробовал писать в необук setvar "[folder[1]]" "c:\F111" setvar "[folder[2]]" "c:\F211" setvar "[folder[3]]" "c:\F322" setvar "[folder[4]]" "c:\F433"
так он мне постоянно возвращает значение последнего элемента при запросе AlertBox "" "[folder[1]]" пишет c:\F433
Set objFSO = CreateObject("Scripting.FileSystemObject") For count = 1 To 4 strName = nbGetVar("[folder"&count&"]") strNew = nbGetVar("[newfolder"&count&"]") objFSO.MoveFolder strName ,strNew Next
И всего-то делов... В имени переменной префикс str в этом случае обязателен!
Используя .MoveFolder нужно чтобы папка strNew не существовала, иначе произойдет перемещение исходной папки в нее.
При этом предполагается что в необук заданы массивы исходных имен setvar "[folder1]" "c:\F111" setvar "[folder2]" "c:\F211" setvar "[folder3]" "c:\F322" setvar "[folder4]" "c:\F433"
И массив новых имен для переименования setvar "[newfolder1]" "c:\F1122" setvar "[newfolder2]" "c:\F2233" setvar "[newfolder3]" "c:\F3344" setvar "[newfolder4]" "c:\F4455"
Счетчик в цикле count - число элементов массива, тут 4
А для конкретно твоего случая так как папки находятся внутри одной папки и их имена похожи с теми на которые надо переименовать (просто убрать часть исходного имени), то задачу можно решить и без НБ-массивов просто получив список подпапок в папке и отрезая/заменяя часть строки имени внутри скрипта.
---------------------------------------------
Quote (sp3d)
Ну если разницы нету между MoveFolder и Rename
Разница есть, поэтому надо следить чтобы
Quote (DEMBEL)
Используя .MoveFolder нужно чтобы папка strNew не существовала, иначе произойдет перемещение исходной папки в нее.
Дело в путях, если .MoveFolder не найдет целевую папку, то переименует исходную, а если найдет целевую, то как раз произойдет перемещение исходной папки в целевую. Как задавать вопросы
А чего тут путаться, делай в НБ два массива имен папок и запускай функцию и все. Если имена массивов возьмешь другие, то поправь их имена в функции. Как задавать вопросы
Set objFSO = CreateObject("Scripting.FileSystemObject") For count = 1 To 4 strName = nbGetVar("[folder"&count&"]") strNew = nbGetVar("[newfolder"&count&"]") objFSO.MoveFolder strName ,strNew Next
Добавлено (17 Октябрь 2009, 17:06) --------------------------------------------- Для каждого из элементов необушных массивов выполняется действие objFSO.MoveFolder strName ,strNew в цикле, со счетчиком равным кол-ву элементов, чего еще-то?
Добавлено (17 Октябрь 2009, 17:08) --------------------------------------------- Это мы загружаем из вбс в НБ массив, а как насчет из вбс в нб (в первом примере)
Сообщение отредактировано sp3d - Сб, 17 Октября 2009, 17:09
Это мы загружаем из вбс в НБ массив, а как насчет из вбс в нб (в первом примере)
Ты хотел сказать из НБ в вбс загружаем массив, а насчет из вбс в НБ, то я и просил такой пример с использованием массивов в скрипте. В твоем примере я начал было мутить скрипт с массивами, а в итоге сократил его до 5 строчек... Как задавать вопросы
DEMBEL, есть на вбс скрипт для саздание задачи (job), не могу разобратся с временем, да другие параметры не совсем ясны
Quote
strComputer = "." Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2") Set objScheduledJob = objWMIService.Get("Win32_ScheduledJob") Set objSWbemDateTime = CreateObject("WbemScripting.SWbemDateTime") objSWbemDateTime.SetVarDate(DateAdd("n", 1, Now())) Res = objScheduledJob.Create("my_app.exe", objSWbemDateTime.Value, False, 0, 0, True, intJobID) If Res <> 0 Then 'OK End If
почитал мсдн, но все равно темный лес, разъяснишь ситуэйшен?