#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, поэтому мне придется изучить использование словарей. Еще раз спасибо!