Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странности с RUN/! с ключем /N c командой DEL/ERASE / 10 сообщений из 10, страница 1 из 1
12.05.2008, 13:18
    #35306293
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
Привет!

Возможно это очередное "открытие америки через форточку", но столкнулся с такой непоняткой:
Код: plaintext
lcCmd = 'DEL /F /S /Q ' + ADDBS(SYS( 2023 )) + '*.*'
запуск в виде
Код: plaintext
RUN &lcCmd
работает, но не нравится появление дос-окошка, а вот в виде
Код: plaintext
RUN /N2 &lcCmd
фигвам: RUN|! command failed. Не удается найти указнный файл. пробовал
Код: plaintext
1.
lcCmd = 'RUN /N2 DEL /F /S /Q ' + ADDBS(SYS( 2023 )) + '*.*'
&lcCmd
- то же самое, короче никак не получается всунуть рану ключ /N если далее следует DEL/ERASE. Пример из хелпа
Код: plaintext
1.
lccmnd = '! /N CHARMAP'
&lccmnd
- пашет на ура!
И самое интересное, что даже прямая подача команды (без МП, типа ! /N DEL) в командном окне приводит к такой же ошибке.

Это глюк или где?

ЗЫ. проблему очистки темпа решил через API WinExec, по найденному на этом форуме примеру.

вфп9сп1
...
Рейтинг: 0 / 0
12.05.2008, 13:24
    #35306308
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
Команды Delete file и Erase есть и в фоксе. Для чего эти пляски с бубном?
...
Рейтинг: 0 / 0
12.05.2008, 15:27
    #35306756
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
CTAC-KOПривет!

Возможно это очередное "открытие америки через форточку", но столкнулся с такой непоняткой:
Код: plaintext
lcCmd = 'DEL /F /S /Q ' + ADDBS(SYS( 2023 )) + '*.*'

Америку в форточках ты будешь открывать когда это заработает. SYS(2023) - это TEMP текущей пользовательской сессии, т.е. всех запущенных программ. Представь ситуацию - какая-нибудь прога создала временный файл, закрыла, после отработал твой чудокод, похерил этот файл, а та прога хочет обратно файл прочитать ...
Там же фоксового рантайма временные файлы живут. Не знаю как в VFP, а если у запущенного FPD поудалять *.tmp то он после этого почти сразу вылетает.

Я нахожу уже имеющуюся подпапку (одноименную с EXE) и делаю ее рабочей. Только пути до файлов проекта надо полностью прописывать в CONFIG.FPW
Чтобы две копии проги не работали в одной папке - создаю файл work.flg и держу открытым пока прога работает. Остальное из кода понятно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
* Установка временной папки как текущей
func SetTempFolder
local lcPath, i
if type('gnWorkFolderHandle') = 'U'
	public gnWorkFolderHandle
	if justext(sys( 16 ,  0 )) != 'exe'
		* При работе из IDE
		if right(addbs(sys( 2003 )),  5 ) != '\TMP\'
			if !directory('tmp')
				mkdir tmp
			endif
			TRY
				delete File (addbs(sys( 5 ) + sys( 2003 )) + 'tmp\*.*')
			CATCH
			ENDTRY
			set Default To (addbs(sys( 5 ) + sys( 2003 )) + 'tmp')
		endif
	else
		* При работе EXE
		lcPath = addbs(getenv("TMP"))
		if empty(lcPath)
			lcPath = addbs(fullpath(''))
		endif
		for i =  0  to  1000 
			lcDir = lcPath + GetExeName() + iif(i =  0 , '', astr(i))
			if !directory(lcDir)
				mkdir (lcDir)
			endif
			gnWorkFolderHandle = fcreate(lcDir + '\work.flg')
			if gnWorkFolderHandle >=  0 
				fclose(gnWorkFolderHandle)
				TRY
					delete File (addbs(lcDir) + '*.*')
				CATCH
				ENDTRY
				gnWorkFolderHandle = fcreate(lcDir + '\work.flg')
				if gnWorkFolderHandle >=  0 
					exit
				endif
			endif
		endfor
		if gnWorkFolderHandle <  0 
			wait 'Не удалось выбрать временную папку' window timeout  3 
			cancel
		else
			set Default To (lcDir)
		endif
	endif
endif
return

delete File (addbs(lcDir) + '*.*') удаляет до первого открытого файла, потому и TRY. Если под шаблон попало 10 файлов, из них 3-й оказался открыт, то в итоге будут удалены первые два, остальные останутся.
...
Рейтинг: 0 / 0
12.05.2008, 15:53
    #35306843
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
Ребято!

Не накидуйтесь на меня с решением данной задачи, т.е. очистки темпораря. Это не ответ по сути проблемы. Я ж не зря в ПСах написал, что задачу решил...
Все же не удержусь и для всех, кто попытается еще раз мне написать про ущербность данного решения объясняю - есть другая прога на фоксе, усиленно кидающая в темпы результаты SQL-выборок, которые я не имею представления КАК названы во время рантайма и фоксой не убиваются при выходе. Из-за них и прочих прог, работающих в схожем режиме, а так же из-за вариантов, когда открытый темп-файл удалять НЕЛЬЗЯ после создания (к примеру дока для офиса, открытая юзеру в темпе из бд для просмотра/печати) - я останусь при своем "чудокоде"!!!

Тема не раскрыта и вопрос остается в силе - ПОЧЕМУ с /N не работает?
...
Рейтинг: 0 / 0
12.05.2008, 16:15
    #35306933
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
CTAC-KOя останусь при своем "чудокоде"!!!

Тема не раскрыта и вопрос остается в силе - ПОЧЕМУ с /N не работает?

Я RUN давно уже не пользую. Из-за его ограничений по длине строки (может с этим у тебя связано), черного окна, необходимости макроподстановок, иногда надо поделать в коде что-то еще пока запущенная прога трудится или не дожидаться/убить ее если она в заданное время не уложилась.

Тут я исходник класса-обертки давал. В простейшем случае использовать так:
Код: plaintext
1.
2.
3.
4.
loWEx = NewObject('waitexec')
loWEx.lHide = .T. && если надо спрятать окно консольной проги
if loWEx.Execute('cmd.exe /c DEL /F /S /Q "' + ADDBS(SYS( 2023 )) + '*.*"') && Запускаем
   loWEx.WaitStop() && Дожидаемся завершения работы
endif
...
Рейтинг: 0 / 0
12.05.2008, 16:29
    #35306981
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
CTAC-KOя останусь при своем "чудокоде"!!!

Тема не раскрыта и вопрос остается в силе - ПОЧЕМУ с /N не работает?

VFP9 Help/N
Specifies NOWAIT. Include /N to execute another Windows-based application.

Т.е. без /N запускается консоль (дос-эмулятор cmd.exe, отсюда и черное окно) и ей передается команда, а с /N сразу приложение, т.е. скорее всего вызывается WinAPI функция CreateProcess().
DEL - внутренняя команда CMD.EXE, DEL.EXE не существует, о чем тебе фокс и говорит. Поэтому с /N надо запускать CMD.EXE явно

Так должно работать:
Код: plaintext
1.
lcCmd = 'RUN /N2 CMD.EXE /C DEL /F /S /Q ' + ADDBS(SYS( 2023 )) + '*.*'
&lcCmd
...
Рейтинг: 0 / 0
12.05.2008, 16:33
    #35307003
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
Забыл добавить (и поправить) - пути всегда в двойные кавычки бери в командной строке, а то если имя попадется с пробелом - не сработает или не так как надо сработает.
Окончательный вариант:
Код: plaintext
1.
lcCmd = 'RUN /N2 CMD.EXE /C DEL /F /S /Q "' + ADDBS(SYS( 2023 )) + '*.*"'
&lcCmd
...
Рейтинг: 0 / 0
12.05.2008, 20:11
    #35307539
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
Dima Tбез /N запускается консоль (дос-эмулятор cmd.exe, отсюда и черное окно) и ей передается команда, а с /N сразу приложение, т.е. скорее всего вызывается WinAPI функция CreateProcess().
DEL - внутренняя команда CMD.EXE, DEL.EXE не существует, о чем тебе фокс и говорит. Поэтому с /N надо запускать CMD.EXE явно
Вот! Спасибо! Вот наконец-то реальный ответ на мой вопрос, теперь мне все понятно. Потому и хелповый пример с /N работал, т.к. такой ЕХЕ-шнег (CHARMAP.ЕХЕ) в отдельности существует.
...
Рейтинг: 0 / 0
12.05.2008, 20:45
    #35307576
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
CTAC-KOВот наконец-то реальный ответ на мой вопрос, теперь мне все понятно.
Только папку TEMP все равно чистить нехорошо целиком. Сделай хотя бы шаблон *.dbf, *.cdx вместо *.*
...
Рейтинг: 0 / 0
13.05.2008, 00:41
    #35307779
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с RUN/! с ключем /N c командой DEL/ERASE
CTAC-KO...есть другая прога на фоксе, усиленно кидающая в темпы результаты SQL-выборок, которые я не имею представления КАК названы во время рантайма и фоксой не убиваются при выходе...и сии филезы рождаюццо с экстеншнами отнюдь не dbf/cdx/idx, не говоря о доках, которые могут создаваться и вовсе без расширения...
Самое плачевное в том, что та самая прога, плодящая массу темпов от SQL-выборок так засирает системные диски на некоторых очень неновых машинах, что моя прога там уже падала из-за отсутствия свободного места! Это еще что: вот ежели в таких условиях ХРю ресетнуть (ибо по указанной причине входит оная в жуткий ступор, отчего рукочесание к ресету и приводит) - то смерть ей, окаянной, на месте! Не загрузиццо она боле, ибо не сможет создавать необходимые ей во время загрузки файлы - места-то нету - на сии грабли уж больно наступил однажды !!! Поэтому буду нещадно рубать все что там, в темпорарях, только есть!!! А кто не застолбил свое - путь падает!
фпд-проги там не юзают, а все остальные "умные Маши" необходимые темпфайлы удалять и так не дают, ибо открыты они.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странности с RUN/! с ключем /N c командой DEL/ERASE / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]