Что нового

[Файловая система] ShellExecute не запускает код, ошибка(Файл занят другой программой.)

Статус
Закрыто для дальнейших ответов.

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Black_Hole
За такое могу и модеру настучать

Научись проявлять уважение к тем, у кого просишь помощи
При хамском отношении проще набить морду, чем объяснять в чем не прав



Добавлено:
Сообщение автоматически объединено:

ivsatel
Или ты опечатался, или я не понял, что ты хочешь продемонстрировать....
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
BIOS
Я так понимаю, что дескриптор полученный по средствам
Код:
FileOpen
передается (или совмещается не могу точно сформулировать) в
Код:
FileWrite

И соответственно закрывать нужно по этому (новому) дескриптору.
Может и ошибаюсь.
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
BIOS
я некому не хамил, я просил обьяснить почему мой код не работает а не почему другие работают и как сделать чтобы заработал мой, если имена файлов будут браться из массива в цикле только код ivsatel решит проблему.
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Black_Hole [?]
почему мой код не работает
Я твой же код прокомментировал
У тебя файл открывается 4 раза, а закрывается только 2
Два открытия "висят в воздухе" и мешают выполниться ShellExecute

При правильной логике файл должен открываться только 1 раз и 1 раз закрыться
Даже в цикле


Добавлено:
Сообщение автоматически объединено:

Я же уточнил, при "правильной логике"
У тебя логика неверная

Тебе достаточно открыть файл один раз с флагом 16+2
Файл при этом очистится, и указать окажется в начале файла
Сразу пиши в полученный дескриптор, нету смысла открывать файл еще раз
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Black_Hole,
То что написано в твоём описании
"Коротко о себе: JS, WHS, SQL "
ну никак не совместимо с тем что ты пишешь в этой теме.

Рекомендую всё же прислушаться к совету BIOSа и заняться изучением основ программирования.
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
C2H5OH
Вы не предложили готового варианта решения, от вас один флуд не по теме.

Здесь нет еды для тролей!!!!
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Black_Hole,

До того как я зашел в тему уже были предложены исчерпывающие готовые решения:
Ответ #2
Ответ #5
Ответ #9

Кроме того я пальцем показал в чем Ваша проблема - вызов функций как параметров других функций.

Флуд - это продолжать задавать вопросы типа "почему мой код не работает?".
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
C2H5OH
Предложные первые ответы не решали так как нужно было мне. В варианте ниже fileopen находится там где нужно и как нужно, а не в виде переменой, что вам конкретно не ясно в написанном мной?

Код:
$a = filewrite(fileopen("./cmd.bat",16+2),"pause")
fileclose($a)
ShellExecute("./cmd.bat")
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
C2H5OH
Судя по ответу #28 это хроническое и не лечится
Надеюсь что не наследственное

Предлагаю ретироваться
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
BIOS
Разжую вам, мне не надо 3 переменных разбросанных по всему коду, мне надо всего одна читаемая, как ниже, в чем сложность понимания?

Код:
$a = filewrite(fileopen("./cmd.bat",16+2),"pause")
fileclose($a)
ShellExecute("./cmd.bat")
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Сложность в понимании у тебя
Ты не хочешь/не можешь понять, что участки кода, которые ты приводишь содержат ошибку
Одну и туже ошибку, которую указал C2H5OH (указываешь вызов функции в качестве аргумента другой функции)
Именно она и мешает ShellExecute
Есть несколько путей решения, с одной переменной, с двумя, или вообще без переменных
Но ты не осознашь их, пока не поймешь в чем ошибочность твоего кода
Ошибочность твоего кода - в неверной логике
Неверная логика - от незнанания/ошибке в знаниях основ программирования


Добавлено:
Сообщение автоматически объединено:

Твой код с ошибкой:
Код:
$a = filewrite(fileopen("./cmd.bat",16+2),"pause")
fileclose($a)
ShellExecute("./cmd.bat")


Твой код с исправленной ошибкой:
Код:
$a = fileopen("./cmd.bat",16+2)
filewrite($a,"pause")
fileclose($a)
ShellExecute("./cmd.bat")


Почитай что такое дескрипторы, что возвращают использованные тобой функции
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
BIOS
BIOS сказал(а):
или вообще без переменных
Да действительно, так будет ближе к требованиям ТС к скрипту и ближе к правильности написания:
Код:
filewrite( @ScriptDir&"\cmd.bat", '@echo off'&@LF&'pause Выход'&@LF&'goto begin'&@LF&'goto exit' )
ShellExecute(@ScriptDir&"\cmd.bat")
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
ivsatel
Скорее даже так
Код:
fileclose( fileopen(@ScriptDir&"\cmd.bat",16+2))
filewrite( @ScriptDir&"\cmd.bat", '@echo off'&@LF&'pause Выход'&@LF&'goto begin'&@LF&'goto exit' )
ShellExecute(@ScriptDir&"\cmd.bat")


ТС ведь нужно предварительно очистить файл, отсюда и пошли танцы с бубном

P.S. Так тоже можно:
Код:
filedelete(@ScriptDir&"\cmd.bat")
filewrite( @ScriptDir&"\cmd.bat", '@echo off'&@LF&'pause Выход'&@LF&'goto begin'&@LF&'goto exit' )
ShellExecute(@ScriptDir&"\cmd.bat")



Добавлено:
Сообщение автоматически объединено:

Правда встает вопрос, нужен ли ТС бинарный режим?
Если нужен - то без переменной не обойтись....
А то я его проигнорировал
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
BIOS
Я все отлично понимаю, я не говорил что коды предложные выше не правильные, я интересовался возможно ли закрытие файла если openfile внутри кода.
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Black_Hole [?]
закрытие файла если openfile внутри кода
Теоретически - возможно, даже практически - тоже возможно
Но это бует неправильно
Правильно - использовать дескриптор полученный от fileopen

И чтобы дальше не освершать фундоментальных ошибок - тебе нужно понять, почему именно так будет правильн
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Black_Hole [?]
где написано что код объявленный через переменную, правильнее чистого кода
Попробую объяснить, как сам понимаю...
Что значит открыть файл? Это значит создать поток ввода-вывода. Один файл можно "открыть" несколько раз, т.е. создать несколько потоков и каждый из них использовать для работы с содержимым файла (чтение, запись, добавление, удаление и т.д.). Следовательно в конце нужно закрыть все созданные потоки. Пример
Код:
$f1 = FileOpen("file.txt", 1)
FileWrite($f1, "Поток 1" & @CRLF)
$f2 = FileOpen("file.txt", 1)
FileWrite($f2, "Поток 2" & @CRLF)
$f3 = FileOpen("file.txt", 1)
FileWrite($f3, "Поток 3" & @CRLF)
ConsoleWrite($f1 & ":" & $f2 & ":" & $f3 & @CRLF)
FileClose($f1)
FileClose($f2)
FileClose($f3)
Каждая функция FileOpen() создаёт свой поток и возвращает так называемый файловый дескриптор. Другими словами - номер потока. В примере для одного файла создано три потока с номерами 1, 2 и 3. И каждый поток используется для записи. В конце все потоки закрываются. И, чтобы не запутаться в потоках, используют переменные для их хранения.

Код:
Global $a="c:\01.bat"
filewrite(fileopen($a,16+2),"")
filewrite(fileopen($a,16+1),"pause")

fileclose(fileopen($a,16+2))
fileclose(fileopen($a,16+1))
ShellExecute("c:\01.bat")
Здесь для файла создано четыре разных потока: первые два использованы для записи и НЕ закрыты, а последние два закрыты не будучи использованными.

Код:
$a = filewrite(fileopen("./cmd.bat",16+2),"pause")
fileclose($a)
ShellExecute("./cmd.bat")
Здесь дескриптор файла (единица) совпадает со значением, возвращаемым функцией записи (тоже единица). Поэтому файл закрывается.

Black_Hole, для создания командного файла не нужно открывать его в бинарном режиме (16). Достаточно использовать функцию FileWrite(), как советуют ivsatel и BIOS, с полным путём к файлу. Эта функция создаст файл, откроет его, запишет данные и закроет. Никаких проблем с дескрипторами.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Black_Hole
твой код идентичен этому
Код:
Global $a="c:\01.bat"
$h1 = fileopen($a,16+2)
$h2 = fileopen($a,16+1)
filewrite($h1,"")
filewrite($h2,"pause")

$h3 = fileopen($a,16+2)
$h4 = fileopen($a,16+1)
fileclose($h3)
fileclose($h4)
ShellExecute("c:\01.bat")

Не закрыты дескрипторы $h1 и $h2
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
Давайте рассмотрим запуск приложения как ключ, предложенный Astel064 во втором ответе #2, в его варианте закрытие файла вообще не требуется, код приведен ниже.

Код:
Global $a
$a = "c:\01.bat"
filewrite(fileopen($a,16+2),'pause')

Run(@ComSpec&' /c "'&$a&'"')


Через ShellExecute как ключ.

Код:
Global $a
$a = "c:\01.bat"
filewrite(fileopen($a,16+2),'pause')

ShellExecute(@ComSpec,' /c "'&$a&'"')
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Давайте, давайте. Только зачем это?
Код:
ShellExecute(@ComSpec,' /c "'&$a&'"')


Парень, я поддерживаю BIOS (ответ #33).
Для тебя будет легче сделать так:
Код:
filedelete(@ScriptDir&"\cmd.bat")
filewrite( @ScriptDir&"\cmd.bat", '@echo off'&@LF&'pause Выход'&@LF&'goto begin'&@LF&'goto exit' )
ShellExecute(@ScriptDir&"\cmd.bat")


По другому ты не хочешь понять, что вот это:
Код:
fileclose( fileopen(@ScriptDir&"\cmd.bat",16+2))
- ничего не дает!!!

Смотри примеры, как это делается правильно (тут их более, чем просто достаточно) и на основе примеров делай САМ свое, потому-что вбить в голову человеку то, что он НЕ хочет понять - почти невозможно.

Что тебе мешает детально прочитать справку по этим функциям???
http://autoit-script.ru/autoit3_docs/functions/FileOpen.htm
http://autoit-script.ru/autoit3_docs/functions/FileWrite.htm
http://autoit-script.ru/autoit3_docs/functions/FileClose.htm
 
Статус
Закрыто для дальнейших ответов.
Верх