Lua io.popen() — доступ к общему диску в Windows

#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 для запуска от имени моего конкретного пользователя, и это решило проблему.