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

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

yanus74 11-12-2015 08:07 2583643

Экранизация кавычек в передаваемом аргументе в скрипт
 
Здравствуйте! Вот такой вот скрипт, призван вызывать из контекстного меню оснастки AD "пользователи и компьютеры" программу для удаленного подключение к компьютеру пользователя, но в передаваемом аргументе есть кавычки, которые в AD экранируются с помощью символа \". А в vbs, это вызывает проблемы (
Подскажите как в этой ситуации выкрутится.
Код:

On Error Resume Next
Set WshShell = CreateObject("WScript.Shell")
set fs=createobject("Scripting.FileSystemObject")
Dim CompName
Dim RunCMD
Dim FilePath
Set objUser = GetObject(Wscript.arguments.Item(0))
CompName = objUser.Get ("wWWHomePage")
If CompName = "" Then WScript.Echo "CompName= " & Wscript.arguments.Item(0)
If CompName = "" Then WScript.quit
If MsgBox ("Подключиться к компьютеру " & CompName & "?",vbOKCancel+vbQuestion,"Серьезно?") = vbCancel Then WScript.quit
If fs.FileExists ("\\dc\NETLOGON\ultravnc\vncviewer.exe") Then FilePath = """\\dc\NETLOGON\ultravnc\vncviewer.exe"""

RunCMD = FilePath & CompName
RetCode = WshShell.Run (RunCMD,5)


Iska 11-12-2015 08:51 2583649

Цитата:

Цитата yanus74
Подскажите как в этой ситуации выкрутится. »

Как минимум, для начала убрать «On Error Resume Next» и добавить «Option Explicit» вкупе с объявлением всех используемых переменных. Затем добавить перед последней командой «WScript.Echo RunCMD», запустить, посмотреть, удивиться и добавить пробел между переданным на исполнение файлом и его параметром. Если всё ещё не заработает, нажать в окне, выведенном командой «WScript.Echo RunCMD», комбинацию клавиш «Ctrl-C» и вставить полученный текст из буфера обмена сюда.

yanus74 11-12-2015 09:12 2583651

Цитата:

Цитата Iska
Option Explicit »

Это да, но вопрос в другом. В скрипт передается DN объекта в виде: LDAP://DC.office.zmzgroup.ru/CN=Иванов Иван Иванович,OU=ООО \"Наша Контора\",OU=Пользователи,DC=office,DC=zmzgroup,DC=ru user

в результате, получается уже не два переданных аргумента, а 3:
LDAP://DC.office.zmzgroup.ru/CN=Иванов Иван Иванович,OU=ООО \Наша
Контора\,OU=Пользователи,DC=office,DC=zmzgroup,DC=ru
user

При этом пропадает символ ". Если между \" и \" еще больше пробелов, то количество аргументов становится еще больше.

получается, нужно сделать переменную, в которую циклом будут записываться все аргументы пока не встретится аргумент user.

и потом, еще нужно вставить символ " после \, и передать все это в GetObject.

Но как это все реализовать, я не знаю(

Iska 11-12-2015 11:38 2583699

yanus74, покажите, как именно у Вас вызов скрипта организован, как привязка:
Цитата:

Цитата yanus74
скрипт, призван вызывать из контекстного меню оснастки AD "пользователи и компьютеры" »

сделана — я навскидку не помню сейчас деталей реализации.

yanus74 11-12-2015 11:39 2583701

вот эта конструкция решает проблему с пробелами:
Код:

Set objArgs = WScript.Arguments
Dim LDAPPath
For i = 0 to objArgs.Count - 1
    if objArgs(i) <> "user" Then LDAPPath=LDAPPath & " " & objArgs(i)
Next

Осталось понять, как добавить в эту строковую переменную, в нужное место, символ "

Цитата:

Цитата Iska
как именно у Вас вызов скрипта организова »

по этой статье http://habrahabr.ru/post/192818/

Iska 11-12-2015 12:07 2583711

С моей колокольни, самым правильным будет заменить в свойствах объекта AD прямые кавычки на типографские («ёлочки») или апострофы:
Код:

ООО «Наша Контора»
ООО 'Наша Контора'

Ибо жёппа из-за кавычек будет не только в этом месте.

Цитата:

Цитата yanus74
по этой статье http://habrahabr.ru/post/192818/ »

Я так и думал :).

yanus74 11-12-2015 12:20 2583715

Цитата:

Цитата Iska
С моей колокольни, самым правильным будет заменить в свойствах объекта AD прямые кавычки на типографские («ёлочки») или апострофы: »

Это простое решение, я к нему пришел сразу, как столкнулся с проблемой.

А по скрипту, я так понял, нужно сделать функцию, которая посчитает количество \ ( гугление показало, что такой функции в VBS нету ), потом сделать цикл, который разложит строку, и после каждого встреченного символа \ добавит Chr(34). И потом уже вызвать функцию GetObject в которую передать переменную.

Из простого скрипта целая программа выходит)

Iska 11-12-2015 13:42 2583768

Цитата:

Цитата yanus74
А по скрипту, я так понял, нужно сделать функцию, которая »

yanus74, извращение всё это. Переданный параметр, как и положено, обрамляется кавычками, посему любые «внутренние» кавычки в аргументе будут восприняты некорректно.

Цитата:

Цитата yanus74
гугление показало, что такой функции в VBS нету »

Можно так:

Код:

WScript.Echo UBound(Split("12345\67890\qwerty\uiop\asdf", "\"))


Время: 19:02.

Время: 19:02.
© OSzone.net 2001-