Назад | Перейти на главную страницу

Как я могу открыть и распечатать документ Word с помощью VBScript, вызываемого из Интернета?

Университет, в котором я работаю, позволяет студентам регистрировать свои велосипеды для хранения в помещении зимой. Это делается через веб-сайт. В конце процесса принтер этикеток DYMO, подключенный к сети, должен распечатать этикетку, которая будет приклеена к велосипеду.

Вот как выглядит процесс:

  1. Данные пользователя и велосипеда вводятся в веб-форму сотрудником. (это работает)
  2. Данные о пользователях и велосипедах хранятся в базе данных Oracle. (это работает)
  3. PHP, запущенный на веб-сервере, сохраняет данные пользователя и велосипеда в файл CSV. (это работает)
  4. PHP, запущенный на веб-сервере, вызывает VBScript. (это работает)
  5. VBScript открывает документ Word, который загружает данные CSV и печатает этикетку. (проблема)

Теперь VBScript работает правильно. Если я вручную запустил VBScript, он откроет Word, загрузит данные CSV, напечатает этикетку и закроет Word.

Аналогичным образом, если я добавлю немного кода в конец VBScript для записи файла .txt (для целей тестирования), текстовый файл будет записан независимо от того, запускаю ли я скрипт вручную или разрешаю его запускать на веб-сайте.

Таким образом, я подозреваю, что существует проблема с разрешениями, препятствующая доступу VBScript к Word и / или принтеру при запуске из Интернета. Есть предложения, как решить эту проблему?

Веб-сервер - это Windows Server 2003 с XAMPP.

Если это поможет, вот строка в PHP, которая вызывает VBScript:

exec('wscript "D:\CSWebHousing\wwwroot\portal2\bikes\testcode.vbs"');

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

Sub TestCode
Set ws = WScript.CreateObject("WScript.Shell")

OFFICE_PATH = "C:\path_to\Office12"

    file_to_open = CHR(34) & "D:\path_to\Label.doc" & CHR(34)

ws.Run CHR(34)& OFFICE_PATH & "\winword.exe" & CHR(34) & file_to_open, 0, false 


'These lines tab and enter past a dialog box
intTime = 3000
Wscript.Sleep(intTime)
ws.Sendkeys "{TAB}"
intTime = 500
Wscript.Sleep(intTime)
ws.Sendkeys "{TAB}"
intTime = 500
Wscript.Sleep(intTime)
ws.Sendkeys "{ENTER}"
intTime = 4000
Wscript.Sleep(intTime)
ws.Sendkeys "%fx"
End Sub

Я думаю, что это проблема с разрешениями, но любые идеи приветствуются.

Спасибо.

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

Если сценарий php запускает сценарий VB, то пользователь, запускающий веб-сервер, запустит сценарий VB. Затем этому пользователю потребуется доступ к расположению сценария и к файлу csv. Самым простым тестом было бы разрешить доступ к обоим файлам всем (который должен быть отменен после успешного тестирования!) - тогда вы узнаете, проблема ли это с разрешением.

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

  • Измените скрипт, чтобы распечатать любой текст - просто чтобы посмотреть, может ли веб-сайт вообще запустить скрипт VB.
  • Попробуйте вывести содержимое файла csv на веб-сайт, чтобы узнать, можете ли вы получить доступ к этому файлу с помощью сценария.

Выполнив большое количество сценариев установки с vbscript ...

Думаю, проблема в SendKey.

SendKey отлично подходит, если вы запускаете vbscript как человек. Иногда фокус теряется, когда вы запускаете скрипт как своего рода автоматизированный процесс.

Так получилось, что здесь есть удобный вопрос о переполнении стека о поддержании фокуса вашего окна с помощью SendKey: https://stackoverflow.com/questions/16173315/windows-batch-file-not-working-consistently

Надеюсь, это поможет.