Как я могу открыть и распечатать документ 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

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

Спасибо.

1 ответ

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

Я думаю, что проблема в SendKey.

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

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

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

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

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

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

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