вставить переменную VBS в запрос WMI в одинарных кавычках - PullRequest
0 голосов
/ 15 июня 2010

Я действительно разочарован фрагментом ниже:

Dim objFSO, varSrc, varDest, varExt

Set objFSO = CreateObject("Scripting.FileSystemObject")

varSrc = WScript.Arguments(0)
varDest = WScript.Arguments(1)
varExt = WScript.Arguments(2)

If objFSO.FolderExists(varSrc) Then
    WScript.Echo varSrc
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
        ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' AND " _
                & "TargetInstance.GroupComponent= " _
                    & "'Win32_Directory.Name=""c:\\\\kk ""'")
    Do
        Set objLatestEvent = colMonitoredEvents.NextEvent
        WScript.Echo objLatestEvent.TargetInstance.PartComponent
    Loop
Else
    WScript.Echo "Bazinga"
End If

Я попытался заменить c: \\ kk на varSrc, однако WSH кажется невозможным распознать его в запросе WMI - не говоря уже о том, чтов пределах одной цитаты!

Я пробовал chr (34), и это не сработало.Пожалуйста, помогите, если это возможно.Очень признателен!

ОБНОВЛЕНИЕ:

Большое спасибо за ответ и извинения за неясности.

varSrc предполагается ""1015 *».и запрос WMI не смог его распознать.Позвольте мне объяснить на примере:

Запрос должен быть разобран так:

SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' AND TargetInstance.GroupComponent= 'Win32_Directory.Name= ""c:\\\\KK""'

Я протестировал запрос выше, и он работает!Однако мне нужно заменить c:\\\\kk аргументом, взятым из пользовательского ввода, который в данном случае равен varSrc.Проблема, с которой я столкнулся, заключается либо в том, что синтаксис правильный, но WMI Query воспринимал бы varSrc буквально как 'Directory.Name';Или другой способ - синтаксическая ошибка или не разбираемый запрос.

Если запрос:

("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' AND " _
                & "TargetInstance.GroupComponent= " _
                    & "'Win32_Directory.Name=""varSrc""'")

Сценарий будет работать без ошибок, однако он не выполняет свою работу по отслеживанию вновь созданных файлов.,Потому что он анализирует «Directory.Name» как литерал «varSrc» вместо пользовательского аргумента.

Если запрос:

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' AND " _
            & "TargetInstance.GroupComponent= " _
                & "'Win32_Directory.Name="""""&varSrc&"""""'")

Будет выдано сообщение об ошибке:

vmove.vbs(15, 2) SWbemServicesEx: Invalid query

Ответы [ 2 ]

1 голос
/ 23 октября 2012

Pls. Сценарий ниже,

varSrc = Replace(varSrc, "\", "\\")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _
    & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
        & "TargetInstance.GroupComponent= " _
            & "Win32_Directory.Name=" & "'" & varSrc & "'")
1 голос
/ 15 июня 2010

Скорее всего, varSrc содержит путь к папке с одиночной обратной косой чертой, в то время как ваш запрос WMI требует четырех обратных косых черт в качестве разделителя пути.Попробуйте выполнить замену \ на \\\\ в varSrc перед тем, как вставить его в запрос, например:

varSrc = Replace(varSrc, "\", "\\")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
            & "TargetInstance.GroupComponent= " _
                & "'Win32_Directory.Name=""" & varSrc & """'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...