VBScript (.vbs) выдает ошибки при выполнении из 2-го .vbs - PullRequest
1 голос
/ 23 мая 2019

У нас есть поставщик, который отправляет нам файлы индекса CSV для использования с нашим программным обеспечением для импорта документов OnBase. Если файл CSV был создан с использованием одной из наших институциональных форм, OnBase принимает их без ошибки, поскольку мы настроили соответствующие типы документов, которые соответствуют 1-му значению с разделителями в файле CSV. Однако, если файл CSV был создан с использованием формы поставщика, 1-е значение с разделителями немного отличается и создает ошибки индексации OnBase. Наш поставщик использует этот формат CSV для многих своих клиентов и указал, что его нельзя настроить в соответствии с нашими текущими типами документов OnBase (без $$$).

Мне было поручено определить обходной путь, и я нашел другое учреждение, использующее VBScript для создания файлов индекса CSV перед обработкой OnBase. После некоторого сотрудничества я смог закодировать подобный подход, используя VBScript. Однако, поскольку мы уже получаем индексные файлы, наш подход определяет, сколько CSV-файлов находится в целевой папке, с помощью цикла, открывающего каждый, идентифицирует 1-е значение с разделителями в CSV-файле, сравнивает это значение с помощью метода регистра переключателя, обновляет 1-е значение CSV с разделителями, основанное на методе регистра, затем сохраняет файл до завершения цикла (значение цикла = количество файлов в целевой папке - 1 ... для учета файла VBS). Когда я нажимаю на файл VBS, он работает как шарм!

Вот тут и начинается беда. Если я пытаюсь запустить файл VBS из другого файла VBS, сценарий выдает ошибки: Файл не найден. Я включил некоторый код отладки, и я вижу, что он правильно подсчитывает количество файлов в целевой папке и т. Д. Когда я подумал, что целевая папка не найдена, я учел это путем точного определения пути во время тестирования. Даже когда я уверен, что он находит нужную целевую папку, я получаю ту же ошибку File Not Found. Если дважды щелкнуть тот же файл VBS, он работает без ошибок, и все файлы CSV корректно обновляются.

Обновление @Ansgar Wiechers решил проблему с поиском и сохранением правильного значения пути к файлу. Но я все еще получаю сообщение об ошибке «Файл не найден» в строке 163.

Screenshot of error message.

Строка 163
Чар 1
Ошибка: файл не найден
Код: 800A0035
Источник: ошибка выполнения Microsoft VBScript

В дополнение к этому, я также заметил, что мой скрипт vbs будет запускаться только один раз, прежде чем вам придется скопировать / вставить новый экземпляр в целевую папку, прежде чем запускать его снова. Это заставляет меня думать, что мой цикл никогда не заканчивался, поэтому я включил отладку MsgBox, которая отображается после того, как цикл закончился (или думаю, что он закончился) и прямо перед командой WScript.Quit. Это две последние строки в скрипте, и окно сообщения успешно отображается. Я включу код ниже из обоих моих файлов VBS.

VBScript файл № 1 (звездочки, маскирующие личную информацию):

Dim CurrentDirectory

Set FSO = CreateObject("Scripting.FileSystemObject")
CurrentDirectory = "C:\Users\*******\Desktop\ProVerify\Testing\ERROR_FILES\"
FSO.CopyFile "C:\Users\*******\Desktop\ProVerify\Testing\Old Source Files\VBScript_PV_Form_conversion.vbs", CurrentDirectory

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\Users\*******\Desktop\ProVerify\Testing\ERROR_FILES\VBScript_PV_Form_conversion.vbs"
WshShell.Popup "VBS file will be deleted in 10 seconds...", 10
FSO.DeleteFile "C:\Users\*******\Desktop\ProVerify\Testing\ERROR_FILES\VBScript_PV_Form_conversion.vbs"

WScript.Quit

Файл VBScript # 2 (в целевой папке с CSV-файлами; удален код регистра переключателя для этого поста для экономии места):

' Declare vars
Dim intDebug, sFile, strDirectory, numFiles, sLine, aLine

intDebug = 1

' Find path of folder where script file resides & Set Object vars
Set objFSO = CreateObject("Scripting.FileSystemObject")
strDirectory = objFSO.GetParentFolderName(WScript.ScriptFullName)

Set objFolder = objFSO.GetFolder(strDirectory)  

' Count number of files in folder 
numFiles = objFolder.Files.Count - 1

If intDebug = 1 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Popup "File Count: " & numFiles, 2
    WshShell.Popup "File Path: " & strDirectory, 2
Else
End If

If numFiles <= 1 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Popup "No Files to Process", 2
    WScript.Quit
Else
End If  

'Loop through each file in folder
For Each folderIdx In objFolder.Files
    Set oStream = folderIdx.OpenAsTextStream

    'Read file and capture first delimeted value
    sLine = oStream.ReadLine
    oStream.Close
    aLine = Split(sLine, ",")

    ' Compare delimeted value & update to OnBase DocType naming convention
    Select Case aLine(0)
        [*****case method here*****]
    End Select

    ' Create replacement delimited value
    sLine = ""

    For i = LBound(aLine) To UBound(aLine)
        sLine = sLine + aLine(i) + ","
    Next

    'Open file and replace updated delimeted value
    Set oStream = objFSO.OpenTextFile(folderIdx.Name, 2)
    oStream.WriteLine Left(sLine, Len(sLine)-1) ' Remove comma from updated delimeted value
    oStream.Close
Next

'Reset Object vars
Set oStream = Nothing
Set objFSO = Nothing
Set objFolder = Nothing

If intDebug = 1 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Popup "Conversion Complete", 2
Else
End If

WScript.Quit

В итоге:

  1. Этот код работает хорошо (один раз), когда я дважды щелкаю; затем новый экземпляр необходимо скопировать / вставить в целевую папку, прежде чем двойной щелчок снова запустит файл.

  2. Код выдает ошибку при запуске через другой VBS-файл, строка 163, Файл не найден.

  3. Я почти уверен, что этого можно достичь в OnBase, но наш администратор системы OnBase настаивает, что я ошибаюсь. 51 руководство пользователя OnBase, ссылающееся на VBScipting более 1500 раз, говорит мне об обратном. Тем не менее, сейчас я поставил задачу найти решение за пределами OnBase. Не стесняйтесь комментировать и эту тему.

1 Ответ

0 голосов
/ 23 мая 2019

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

Структура вашей папки выглядит примерно так (имена сокращены для краткости):

C:\base\folder
├── ERROR_FILES
│   ├── a.csv
│   ├── b.csv
:   :
│   └── second.vbs
└── first.vbs

При двойном щелчке скрипта second.vbs рабочий каталог C:\base\folder\ERROR_FILES.Однако при двойном щелчке first.vbs рабочий каталог C:\base\folder.Вызов C:\base\folder\ERROR_FILES\second.vbs оттуда НЕ меняет рабочий каталог на second.vbs.

Теперь давайте посмотрим на код во втором скрипте:

strDirectory = objFSO.GetAbsolutePathName(".")

'***********FOR TESTING ONLY**********************
If strDirectory = "C:\Users\*******\Desktop\ProVerify\Testing" Then
    strDirectory = objFSO.GetAbsolutePathName(".") & "\ERROR_FILES"
Else
End If
'***********FOR TESTING ONLY**********************

Set objFolder = objFSO.GetFolder(strDirectory)

...

For Each folderIdx In objFolder.Files
    Set oStream = objFSO.OpenTextFile(folderIdx.Name, 1)
    ...
Next

В разделе «ТОЛЬКО ДЛЯ ТЕСТИРОВАНИЯ» делается попытка учесть разницу в рабочем каталоге, добавив «\ ERROR_FILES» в strDirectory, что позволяет перечислять содержимое этой папки.Однако при запуске objFSO.OpenTextFile(folderIdx.Name, 1) все еще предпринимается попытка открыть каждый файл из текущего рабочего каталога , который по-прежнему C:\base\folder.

Чтобы избежать этой проблемы, запустите objFSO.OpenTextFile(folderIdx.Path) или, еще лучше,используйте метод объекта OpenAsTextStream.Кроме того, когда ваш сценарий находится в той же папке, что и ваши файлы данных, лучше получить каталог из пути к сценарию, а не добавлять определенную подпапку в рабочий каталог (что может отличаться от того, что вы думаете).

Измените приведенный выше фрагмент кода на что-то вроде этого, и он будет делать то, что вы хотите:

strDirectory  = objFSO.GetParentFolderName(WScript.ScriptFullName)
Set objFolder = objFSO.GetFolder(strDirectory)

...

For Each folderIdx In objFolder.Files
    Set oStream = folderIdx.OpenAsTextStream
    ...
Next

Используйте тот же подход, когда вы открываете файл для записи:

Set oStream = folderIdx.OpenAsTextStream(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...