#windows #lua #popen
#Windows #lua #popen
Вопрос:
Я запускаю программу Lua на компьютере с Windows 10. Этот компьютер с Windows 10 подключен по сети к другому компьютеру с Windows 10, и этот другой компьютер совместно использует свой диск D: с моим компьютером. Общий диск на моем компьютере называется диском O:.
Когда я открываю окно cmd на своем компьютере и набираю:
type "O:Dataconfigfile.xml"
Я получаю содержимое file.xml в моем окне cmd. Однако, если я выполню эту же команду через Lua:
f = io.popen([["type O:Dataconfigfile.xml"]])
output = f:read("*l")
Затем output
возвращается как nil
.
Это поведение справедливо для любой команды, включающей общий диск O:, а не только type
. Аналогично, у меня есть несколько сценариев bat, которые ссылаются на диск O:, и я вызываю их с помощью os.execute
, но они не могут выполнить свою задачу (я вижу, что они на самом деле выполняются, просто неправильно). Однако, если я выполняю аналогичные команды или сценарии с локальными дисками D: или C:, у меня нет этой проблемы.
Есть идеи относительно того, что может отличаться между этими двумя вызовами? Есть ли другой способ, которым я могу вызвать диск O:?
Комментарии:
1.
output = f:read("*1")
*1
Недопустимый формат.2. Каков результат
io.popen[[net use O:]]:read"a"
?3.
io.popen([[net use O:]]):read("*a")
возвращает пустой вывод. Я также пыталсяnet use \IASo
, поскольку это удаленное имя диска, и это также вернуло пустой вывод. Если я простоread("*l")
на любом из них, я получаюnil
4. Есть ли какой-нибудь способ получить командную ошибку от popen, чтобы я мог понять, почему она не возвращается?
5. Я думал
out, err = io.popen( cmd )
, но нада… Возможно, придется передавать stderr в temp.txt , затем прочитайте его оттуда.out = io.popen( cmd 2> temp.txt )
Ответ №1:
Мое приложение Lua работало как служба, и я определил, что когда оно работало как служба, оно работало как «гостевой» пользователь, а не как мой системный пользователь. Следовательно, у него не было соответствующих разрешений для запуска.
Я изменил свою службу Windows для запуска от имени моего конкретного пользователя, и это решило проблему.