Есть ли способ заставить специальные символы работать при использовании InStr в VBScript?

#vbscript #path #environment-variables

#vbscript #путь #переменные среды

Вопрос:

VBScript используется для сокращения системного пути путем замены записей версиями 8.3, поскольку он загроможден количеством программного обеспечения, установленного в наших сборках. В настоящее время я добавляю возможность удаления дубликатов, но она работает некорректно.

Вот соответствующая часть кода:

 original = "apple;orange;apple;lemonbanana;lemonbanana" 
shortArray=Split(original, ";")

shortened = shortArray(1) amp; ";"
For n=2 to Ubound(shortArray)
    'If the shortArray element is not in in the shortened string, add it
    If NOT (InStr(1, shortened, shortArray(n), 1)) THEN
        shortened = shortened amp; ";" amp; shortArray(n)
    ELSE
    'If it already exists in the string, ignore the element
        shortened=shortened
    End If
Next
  

(Обычно «original» — это системный путь, я просто использую названия фруктов для тестирования …)

Вывод должен быть примерно таким

 apple;orange;lemonbanana
  

Проблема в том, что записи с пунктуацией, такие как lemon banana, похоже, пропущены (?). Я тестировал его с другими знаками препинания, все еще пропускает его. Что является проблемой, учитывая, что системный путь имеет знаки препинания в каждой записи.

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

 apple;orange;lemonbanana;lemonbanana
  

Я подумал, может быть, это просто проблема с экранированием символов. Но нет. Он по-прежнему ничего не будет делать с записями, содержащими знаки препинания.

Я что-то делаю не так, или это просто «особенность» VBScript?

Заранее спасибо.

Комментарии:

1. Точно такой же код должен работать в Excel или аналогичном, где вы могли бы отлаживать. Сначала я бы посмотрел вывод split. Кстати: очень хорошо написанный вопрос.

Ответ №1:

Этот код:

 original = "apple;orange;apple;lemonbanana;lemonbanana"
shortArray = Split(original, ";")

shortened = shortArray(0) ' array indices start with 0;  amp; ";" not here
For n=1 to Ubound(shortArray)
    'If the shortArray element is not in in the shortened string, add it
    'i.e. If InStr() returns *number* 0; Not applied to a number will negate bitwise
'   If 0 = InStr(1, shortened, shortArray(n), 1) THEN
    If Not CBool(InStr(1, shortened, shortArray(n), 1)) THEN ' if you insist on Not
        WScript.Echo "A", shortArray(n), shortened, InStr(1, shortened, shortArray(n), vbTextCompare)
        shortened = shortened amp; ";" amp; shortArray(n)
    End If
Next
WScript.Echo 0, original
WScript.Echo 1, shortened

WScript.Echo 2, Join(unique(shortArray), ";")

Function unique(a)
  Dim d : Set d = CreateObject("Scripting.Dictionary")
  Dim e
  For Each e In a
      d(e) = Empty
  Next
  unique = d.Keys()
End Function
  

вывод:

 0 apple;orange;apple;lemonbanana;lemonbanana
1 apple;orange;lemonbanana
2 apple;orange;lemonbanana
  

демонстрирует / объясняет ваши ошибки (индексы, а не) и показывает, как использовать правильный инструмент для уникальности (словарь).

Комментарии:

1. Спасибо за вашу помощь! Незадолго до того, как был опубликован ваш ответ, я понял, что мое понимание InStr было неправильным (я все это время думал, что он возвращает логическое значение …). Я также исправил индексы, не совсем уверен, какова была моя логика в этом, хех. Я новичок в VBScript, поэтому мне придется изучить использование словарей. Еще раз спасибо!