Как я могу открыть и распечатать документ Word, используя VBScript, вызываемый из Интернета?
Университет, в котором я работаю, позволяет студентам регистрировать свои велосипеды для хранения в зимнее время. Это делается через веб-сайт. В конце процесса принтер этикеток DYMO, подключенный к сети, должен распечатать этикетку, которая будет прикреплена к велосипеду.
Вот процесс:
- Пользователь и данные велосипеда вводятся в веб-форму сотрудником. (это работает)
- Данные о пользователях и велосипедах хранятся в базе данных Oracle. (это работает)
- PHP, работающий на веб-сервере, сохраняет данные пользователя и велосипеда в файл CSV. (это работает)
- PHP, работающий на веб-сервере, вызывает VBScript. (это работает)
- 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-файла на веб-сайт, чтобы узнать, сможете ли вы получить доступ к этому файлу с помощью сценария.