Что нового

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

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

Black_Hole

Знающий
Сообщения
126
Репутация
11
Создается файл через fileopen и filewrite 01.bat, после создания файл закрывается через fileclose но при запуске вылазит сообщение с ошибкой(Файл занят другой программой.) логика рушится!!!

Код:
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")


Уточнение: Пока висит скрипт, если запустить отдельный скрипт 'ShellExecute("c:\01.bat")' появится такая же ошибка, но после закрытия скрипта, ShellExecute("c:\01.bat") работает как нужно.

Вопрос: Где ошибка, как исправить?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Black_Hole,
Прочитайте внимательно в справке про функции
Код:
FileOpen()
FileClose()
и найдите сами свою ошибку. ;)
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Код:
Global $a, $b, $c, $d, $e, $f1, $f2, $f3, $f4, $f5, $z, $Open

$f1="c:\01.bat"
$Open = fileopen($f1,16+2)
filewrite($Open, '@echo off')
sleep(1000)
fileclose($Open)
sleep(1000)
ShellExecute("c:\01.bat")


Пробуйте так...
Если снова выдаст ошибку, то что мешает использовать запуск вместо ShellExecute так:
Код:
Run (@ComSpec&' /c "'&$f1&'"')
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
Astel064
Через Run работает, но все-таки хотелось бы выяснить почему через ShellExecute не работает.
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Занят по причине того, что Вы его не закрыли.

Посмотрите пример Astel064 с ShellExecute. Там все понятно.


Вы записываете данные в открытый для записи файл, а закрываете при этом вновь открытый для чтения файл.
Не закрыли файл, открытый для записи.
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Подробно опишу:

Открытие файла:
Код:
$Open] = fileopen($f1,16+2)


После чего - запись:
Код:
filewrite($Open, '@echo off')


После чего - закрытие (с помощью возвращаемого значения функции fileopen, в нашем случае - это $Open):
Код:
fileclose($Open)


Выходит, что даже паузы не нудны:
Код:
Global $a, $b, $c, $d, $e, $f1, $f2, $f3, $f4, $f5, $z, $Open

$f1="c:\01.bat"
$Open = fileopen( $f1, 16+2 )
filewrite( $Open, '@echo off' )
fileclose( $Open )
ShellExecute( "c:\01.bat" )
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
Astel064, mef-t, madmasles
С какими ключами закрыть, этот код чтобы он заработал?

Код:
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")



С Run он запускается а с ShellExecute нет, так где же ошибка?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Black_Hole
ты прям номинант на премию тупица месяца.
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
inververs
ты часом не родственник петросяна?
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Black_Hole
Вот с комментариями.
Код:
Global  $f1, $Open

$f1 = @ScriptDir&"\cmd.bat"	; Задаем путь к будущему "батнику"
$Open = fileopen( $f1, 2 )	; Открываем "батник" с параметрами "2 = Открыть только для записи в конец файла, удалив предыдущее содержание"
filewrite( $Open, '@echo off'&@LF&'pause'&@LF&'goto begin'&@LF&'goto exit' )	; Записываем нужные строки, для переноса используем макрос @LF
fileclose( $Open )	;Закрываем файл (освобождаем для других приложений и процессов этот ресурс)
ShellExecute(@ScriptDir&"\cmd.bat")	;Запускаем созданный cmd.bat файл
 
Автор
B

Black_Hole

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

BIOS

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

Комментирую твой код

Код:
Global $a="c:\01.bat"
filewrite(fileopen($a,16+2),"") ;Открыть файл, записать в него пустоту
filewrite(fileopen($a,16+1),"pause") ;Открыть файл, записать в него "pause"

fileclose(fileopen($a,16+2)) ;Открыть файл и тут же его закрыть
fileclose(fileopen($a,16+1)) ;Открыть файл и тут же его закрыть
ShellExecute("c:\01.bat")


Я насчитал 4 "открыть" и только 2 "закрыть". Дальше сообразишь?
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
BIOS

у их
Код:
$Open
Тоже равно 4 или переменная становится равнее объявленного явно, не смешно :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Что за изврат писать вызовы в параметах? Вы наивно полагаете что это оптимизирует код?

Black_Hole,
Тебе Astel064 и ivsatel написали корректные, аккуратные скрипты.
Что ещё надо?!
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Black_Hole
У "их" FileOpen вызывается только 1 раз, и потом 1 раз FileClose
Т.е. файл один раз открылся и один раз закрылся
А количество $Open хоть 40 пусть будет
 
Автор
B

Black_Hole

Знающий
Сообщения
126
Репутация
11
C2H5OH, BIOS
В итоге: файл открытый как на примере ниже, закрыть нельзя и это не баг это фишка :smile:

Код:
filewrite(fileopen("c:\01.bat",16+2),"pause")
 

BIOS

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

P.S. Освоишь программирование, сообразишь что и "такое можно закрыть"
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Black_Hole
Код:
Global $c=@ScriptDir&"\cmd.bat"

$a = filewrite(fileopen($c,2),"1")

MsgBox('','FileOpen', $a)

$b = FileClose($a)

MsgBox('','FileClose', $b)

ShellExecute(@ScriptDir&"\cmd.bat")
 
Статус
Закрыто для дальнейших ответов.
Верх