Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   +VBS: копирование файлов с сервера в папку установки проги (http://forum.oszone.net/showthread.php?t=104302)

la_vanille_ciel 04-04-2008 07:56 774289

+VBS: копирование файлов с сервера в папку установки проги
 
Такая ситуация: в автокад были добавлены некоторые шаблоны (то есть файлы .dwg), которые содержали официальное короткое название нашей организации, сейчас пришло указание сменить официальное короткое название организации и во всех шаблонах в автокаде соответственно поменять это название. Все автокады (2004, 2007, 2008) ставятся с серверов, там есть их развертки. В развертках я все поменяла, теперь получается, что у всех пользователей, у кого автокады были поставлены раньше (это окоо 150 пользователей), старые шаблоны, то есть необходимо их подменить на новые с новым названием, можно конечно ручками ходить по кабинетам и копировать новые файлы с шаблонами, но это долго и нехорошо. Поэтому надо написать такой скрипт, который будет копировать эти файлы с сервера туда, где лежат такие же (только старые) у пользователя на компе. Проблема еще в том, что системные пути разные, то есть у кого-то это Programs, у кого-то Program Files, так же у кого-то Documents, у кого-то Documents and Settings. У меня опыт написания скриптов почти нулевой, но на сколько я знаю, cmd файлы не работают с unc путями, а как задавать системные папки в vbs я никак не могу найти, и как вообще получить путь, где стоит автокад и соответственно лежат шаблоны?

la_vanille_ciel 04-04-2008 08:20 774302

Только что где-то прочитала, что cmd работают с unc путями, подскажите, как это реализовать.

la_vanille_ciel 04-04-2008 09:00 774326

Set fileFSO = CreateObject("Scripting.FileSystemObject")
source_file = "\\Apu18s\Shell\civil3D_2007_net\acad2000.lsp"
dest_file = "%ProgramFiles%\\Autodesk Civil 3D 2007\\Graph\\acad.lsp"
fileFSO.CopyFile source_file, dest_file , true



Примерно таким должен быть файл, но не работает dest_file, как исправить?

Petya V4sechkin 04-04-2008 10:40 774379

Цитата:

Цитата la_vanille_ciel
Только что где-то прочитала, что cmd работают с unc путями, подскажите, как это реализовать.

Код:

Copy /Y "\\Apu18s\Shell\civil3D_2007_net\acad2000.lsp" "%ProgramFiles%\Autodesk Civil 3D 2007\Graph\acad.lsp"

la_vanille_ciel 04-04-2008 10:47 774382

Спасибо за ответ, но не получилось....вобщем так: у меня автокад 2007 стоит в Program Files, а сист перем %Program Files% = Programs.... то есть надо узнать в этом скрипте, где стоит автокад.....сорри, я наверно, не очень правильно объяснила первый раз..

и даже если явно задать Program Files, то все равно не копируется (((((

Petya V4sechkin 04-04-2008 10:56 774388

la_vanille_ciel, тогда придется брать из реестра.
Выясните, в каком параметре и разделе прописан путь.

Например у 2006-го (русского) это AcadLocation в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R16.2\ACAD-4001:419

А у 2007-го?

la_vanille_ciel 04-04-2008 11:00 774391

у 2007 это будет так же, только R 17.0 ...

я нашла скрипт чтения этого пути в реестре, но есть две проблемы с ним:
1) он не совсем рабочий:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "Software\Autodesk"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
For Each subkey In arrSubKeys
If subkey = "AutoCAD" Then
find = True
Path_reg = strKeyPath & "\" & subkey
Exit For
End If
Next
If Not find Then
For Each subkey In arrSubKeys
If subkey = "Adobe Acrobat" Then
find = True
Path_reg = strKeyPath & "\" & subkey
Exit For
End If
Next
End If
If Not find Then
execute_programm_path = ""
Exit Function
Else
objReg.EnumKey HKEY_LOCAL_MACHINE, Path_reg, arrSubKeys
For Each subkey In arrSubKeys
Version_Acr = subkey
Next
End If
objReg.GetStringValue HKEY_LOCAL_MACHINE, Path_reg & "\" & Version_Acr & "\InstallPath\", "", dwValue
execute_programm_path = dwValue
(ругается на exit и еще что-то...)
2) как потом его положить в скрипт, в котором написано копирование:
Set fileFSO = CreateObject("Scripting.FileSystemObject")
source_file = "\\Apu18s\Shell\civil3D_2007_net\acad2004.lsp"
dest_file = "C:\Program Files\Autodesk Civil 3D 2007\Graph\acad.lsp"
fileFSO.CopyFile source_file, dest_file , true
(примерный скрипт копирования vbs, только dest_file не работает).

аа...наврала,
будет: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R 17.0\ACAD-5000:419

Petya V4sechkin 04-04-2008 11:11 774397

Цитата:

Цитата la_vanille_ciel
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R 17.0\ACAD-5000:419

Какое значение AcadLocation?

la_vanille_ciel 07-04-2008 07:14 776374

HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R 17.0\ACAD-5000:419 - такое у 2007

la_vanille_ciel 07-04-2008 08:05 776384

AcadLocation = C\ProgramFiles\Autodesk Civil 3D 2007

Petya V4sechkin 07-04-2008 09:16 776410

la_vanille_ciel, примерно так (у меня работает, во всяком случае):
Код:

On Error Resume Next
Dim WSh, FSO, P

Set WSh = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

P = ""
P = WSh.RegRead("HKLM\SOFTWARE\Autodesk\AutoCAD\R 17.0\ACAD-5000:419\AcadLocation")
If FSO.FolderExists(P) Then FSO.CopyFile "\\Apu18s\Shell\civil3D_2007_net\acad2004.lsp", P & "\Graph\acad.lsp", True

Кстати, странное имя acad2004.lsp (в смысле, у вас же 2007).

la_vanille_ciel 07-04-2008 09:32 776416

((((((((((((((((((((((((((( не работает, может у меня с компом что-то не так......
я убрала строчку, которая не повзволяет ошибке выводиться (если я правильно поняла):On Error Resume Next
и тогда он сообщает: ошибка: строка 8 символ 1, неверная ссылка на корень в разделе реестра, источник WshShell.RegRead ...

Petya V4sechkin 07-04-2008 09:35 776418

la_vanille_ciel, значит, раздел реестра HKLM\SOFTWARE\Autodesk\AutoCAD\R 17.0\ACAD-5000:419 не существует.

la_vanille_ciel 07-04-2008 09:39 776422

как это???? я же его своими глазами вижу!!!!
я даже поменяла на HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R 17.0\ACAD-5000:419
чтобы точно уж....а оно не работает...что делать?????

Petya V4sechkin 07-04-2008 09:40 776423

la_vanille_ciel, уверены, что в \R 17.0\ пробел?

la_vanille_ciel 07-04-2008 09:42 776424

для всех остальных автокадов тоже не работает (((((((((((((((( такого не может быть...они же все у меня стоят!!

да, я уже и без пробела попробовала...то же самое ((((

la_vanille_ciel 07-04-2008 09:58 776432

пожалуйста...не бросайте меня ((((((((((((

АААААААААААААААААААААААА Сработало!!!!!! Но только для 2008, который стоит в Programs, для 2004 и 2007 не работает, разница - они стоят в Program Files.....почему так?

la_vanille_ciel 07-04-2008 10:13 776444

УРА!!!!!!!!!!!!!!!!!!!!!!! ОНИ ВСЕ РАБОТАЮТ!!!!!! Я просто перепечатала эти строки для реестра ручками и убрала пробел везде после R.
Petya V4sechkin - Вы супер!!!! СПАСИБО Вам большое!!!!!!

Petya V4sechkin 07-04-2008 10:22 776453

Цитата:

Цитата la_vanille_ciel
ОНИ ВСЕ РАБОТАЮТ!!!!!! Я просто перепечатала эти строки для реестра ручками и убрала пробел везде после R

Чудеса :)

Рад, что смог помочь.

la_vanille_ciel 08-04-2008 11:11 777258

теперь оказывается, надо еще этот скрипт в автозагрузку сделать.... :(
млин, я вообще в Vbs никак, хоть он и для начинающих... :(

Petya V4sechkin 08-04-2008 11:22 777263

Цитата:

Цитата la_vanille_ciel
теперь оказывается, надо еще этот скрипт в автозагрузку сделать...

А в чем проблема?
У вас в организации сеть с доменом?

la_vanille_ciel 08-04-2008 12:06 777295

а еще как проверить, существует такая ветка или нет, а то надо один скрипт только.....

Petya V4sechkin 08-04-2008 13:06 777345

Цитата:

Цитата la_vanille_ciel
а еще как проверить, существует такая ветка или нет

Я предлагал вариант в 11-м посту.
Первая строчка On Error Resume Next означает, что мы берем на себя контроль ошибок.

Дальше:
Код:

P = ""
P = WSh.RegRead( ...
If FSO.FolderExists(P) Then ...

Если раздел реестра (или параметр в нем) не существует, RegRead не выполняется (из-за ошибки) и значение переменной P остается равным предыдущему "". В этом случае FSO.FolderExists(P) возвращает False (и если папка не существует, тоже).

Таким образом, для разных версий автокада достаточно размножить эти фрагменты:
Код:

P = ""
P = WSh.RegRead( ...
If FSO.FolderExists(P) Then ...

P = ""
P = WSh.RegRead( ...
If FSO.FolderExists(P) Then ...

(и т. д.).


la_vanille_ciel 08-04-2008 19:03 777621

Да, я так и сделала! То есть один файл vbs, в котором эти строки размножены для всех автокадов...НО проблема в том, что там все автокады собраны, а у пользователя может стоит два из них или три, например, 4й и 7й...и когда скрипт доходит до ветки реестра, например, 5го автокада, он пишет, что не найден путь (ну его же нет на самом деле) и все ...типа ошибка, а дальше не пойму, он же после ошибки дальше не будет выполняться, так? Вот типа надо проверять наличие ветки до ее чтения.... :dont-know :help:

Я написала RegExists :biggrin: и оно конечно не работает, потому что не знаю какой метод надо... :(

Petya V4sechkin 08-04-2008 21:31 777702

Цитата:

Цитата la_vanille_ciel
он пишет, что не найден путь

Цитата:

Цитата Petya V4sechkin
Первая строчка On Error Resume Next означает, что мы берем на себя контроль ошибок.

Еще раз.
После On Error Resume Next никаких сообщений об ошибках не будет, при ошибке выполнение скрипта продолжится со следующей команды.

la_vanille_ciel 09-04-2008 05:53 777897

Я понимаю, но у меня не принимают, требует, чтобы не было этой строки и чтобы перед чтением проверялось, есть ли такая ветка.... :cry:
а если настаивать на On Error Resume Next, то вот например, дошел скрипт до 4го автокада, ветка есть, у пользователя стоит, далее идет до пятого, такого у него нет, ошибки не выдастся, но пойдет он дальше до 6го 7го 8го??
А еще можно спросить, P="" это для обнуления какого-то?

la_vanille_ciel 09-04-2008 08:35 777931

Уже вроде принимают и так, но теперь надо вывести значение PP1 в сообщение (эхо что ли.. :dont-know ) в коде:

On Error Resume Next
Dim WSh, FSO, P, P1, P2, P3, P4

Set WSh = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")


P = WSh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R16.0\ACAD-201:419\AcadLocation")
PP = P & "\Graph\Support"
If FSO.FolderExists(PP) Then FSO.CopyFolder "\\Uzdp-files\share_shell\New_Stamps_CAD\NewShortName2004", PP, True


P1 = WSh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R16.1\ACAD-301:419")
PP1 = P1 & "\Graph\Support"
If FSO.FolderExists(PP1) Then FSO.CopyFolder "\\Uzdp-files\share_shell\New_Stamps_CAD\NewShortName", PP1, True


P2 = WSh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R16.2\ACAD-4001:419")
PP2 = P2 & "\Graph\Support"
If FSO.FolderExists(PP2) Then FSO.CopyFolder "\\Uzdp-files\share_shell\New_Stamps_CAD\NewShortName", PP2, True


P3 = WSh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R17.0\ACAD-5000:419\AcadLocation")
PP3 = P3 & "\Graph\Support"
If FSO.FolderExists(PP3) Then FSO.CopyFolder "\\Uzdp-files\share_shell\New_Stamps_CAD\NewShortName", PP3, True


P4 = WSh.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R17.1\ACAD-6000:419\AcadLocation")
PP4 = P4 & "\Graph\Support"
If FSO.FolderExists(PP4) Then FSO.CopyFolder "\\Uzdp-files\share_shell\New_Stamps_CAD\NewShortName", PP4, True

:help:

la_vanille_ciel 09-04-2008 11:53 778054

:) Все отлично, все работает =)


Время: 16:29.

Время: 16:29.
© OSzone.net 2001-