2011-02-15 1 views
1

Я создаю функцию в pure-Lua для сканирования файлов из каталога и помещаю их в другой файл.Lua programming - os.execute() не работает в Windows

Команда I судимое был:

os.execute("dir /B C:\\Users\\Fernando\\workspace\\Organizator2\\s1 > 
C:\\Users\\Fernando\\workspace\\Organizator2\\temp.txt") 

но ... Dont работы! Я провел много тестов с другими более простыми командами, такими как «запустить блокнот» или «mkdir C: \ test», и они тоже не работали! Хуже всего то, что я пробовал эти же команды непосредственно в подсказке, и все правильно.

Я попытался использовать tooo io.popen(), но система вернула «незаконную операцию» для любой переданной мной команды (даже пустую строку!).

вот весь код:

function ScanDirectory(source, str) 
    local str = str or "temp.txt" 
    os.execute("dir /B "..source.." > "..str) 
    directory = io.open(str,"r") 
    return directory 
end 

-- main script 

do 
    local source = "C:\\Users\\Fernando\\workspace\\Organizator2\\s1" 
    local directory = ScanDirectory(source, "C:\\Users\\Fernando\ 
\workspace\\Organizator2\\temp.txt") 
end 

Я использую окна 7 и Luaforwindows, 5.1 и LuaEclipse

ли кто-нибудь когда-нибудь видел проблему, как это?

+1

Trick: либо использовать косые черты, работая хорошо и в Windows, либо в виде длинной строки: [[C: \ Users \ Fernado \ etc.]]. Оба лучше (и легче набирать/использовать), чем эти удвоенные обратные косые черты. – PhiLho

ответ

0

Я только что проверил ваш код на своем компьютере, и он работает правильно (с моими каталогами, конечно). Может быть, вы не получаете ожидаемый результат, потому что ваша directory строки разбиваются с новой строкой полукоксом, в результате чего:

dir /B C:\Users\Fernando\workspace\Organizator2\s1 > C:\Users\Fernando\ 
workspace\Organizator2\temp.txt 

Правильный должен быть:

dir /B C:\Users\Fernando\workspace\Organizator2\s1 > C:\Users\Fernando\workspace\Organizator2\temp.txt 

Пожалуйста, попробуйте изменить заканчивается сделать, чтобы:

local source = "C:\\Users\\Fernando\\workspace\\Organizator2\\s1" 
local directory = ScanDirectory(source, "C:\\Users\\Fernando\\workspace\\Organizator2\\temp.txt") 
+0

На самом деле, он был сломан только здесь, в SO, а не в моей программе. но .. это магически работает! Что за колдовство? Спасибо. – FernandoP

1

Пожалуйста, попробуйте с этим синтаксисом:

os.execute [["dir /B C:\Users\Fernando\workspace\Organizator2\s1 > C:\Users\Fernando\workspace\Organizator2\temp.txt"]]

Пожалуйста, обратите внимание, что обратная косая черта (\) не является специальным символом в этом случае. (Lua использует cstrings внутри, иногда это приводит к некоторым странным и удивительным результатам: P)

+1

Вам нужны двойные кавычки? Без двойных кавычек это точно то, что имел OP, хотя это легче для глаз. Кроме того, см. Http://www.lua.org/about.html#name – lhf

+0

Спасибо за отзыв, но он не решен ... эта же проблема продолжается, я уже пробовал использовать [[]] нотацию, но я не знал что я тоже должен использовать «». Полезно знать:] – FernandoP

1

Большинство команд, которые вы указали, являются командами оболочки, которые работают только в командной строке. Попробуйте запустить cmd.exe напрямую, чтобы узнать, получаете ли вы приглашение, и если да, попробуйте передать команды cmd.exe с помощью опции/c. Вы также можете попробовать блокнот без начала, чтобы узнать, работает ли это.

+0

Спасибо, что ответили, но он тоже не работал ... через cmd все команды работают хорошо, с/c или без него, но через функцию нет. если бы я был в Linux, я бы подумал, что это проблемы с разрешением, но я в Windows как администратор, поэтому я не знаю, что может быть! – FernandoP

+0

С вашего комментария, я не уверен, что вы понимаете часть/c. В windows, о котором я знаю, нет dir.exe, поэтому «dir.exe c: \» не будет работать, если команда не найдена. Но «cmd.exe/c dir c: \» будет работать, потому что dir - это команда оболочки в окнах. У меня нет среды Lua для тестирования, но если это похоже на любое другое программирование окон, которое я сделал, вам нужно запустить исполняемые файлы, а не команды оболочки. – BMitch

+0

Вы также можете проверить в Lua, запустив «cmd.exe» в качестве исполняемого файла из Lua, чтобы узнать, работает ли это, или просто «notepad.exe», а не «start notepad.exe». – BMitch

1
os.execute('cmd.exe /c dir /B C:\\> C:\\test.txt') 

Это работает. Использование команд в стиле Linux в выигрыше - плохая идея вообще =)