Создание пустого файла

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

sEXEcutor
Сообщения: 24
Зарегистрирован: Вс июл 09, 2006 04:21

Создание пустого файла

Сообщение sEXEcutor »

Уже были вариации на эту тему, предлагаю свой вариант.

Код: Выделить всё

'============================================================================================
' Создание пустого файла
' В параметрах укажите параметры
' "%P" {расширение} {редактор (в кавычках)}
' Если не указано расширение, файлу будет присвоено расширение .txt.
' Если вы пишете имя создаваемого файла вместе в расширением, второй параметр игнорируется.
' Редактор можно указывать, только если указано расширение.
' Созданный файл сразу открывается в редакторе, указанном в переменной Editor.
'============================================================================================

Dim FSO, WS
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WS = WScript.CreateObject("WScript.Shell")

if WScript.Arguments.Count = 2 then
Ext = "." & WScript.Arguments(1)
else
Ext = ".txt"
end if

if WScript.Arguments.Count = 3 then
Editor = WScript.Arguments(2)
else
Editor = "C:\Windows\Notepad.exe"
end if

FileName = InputBox("Введите имя создаваемого файла" & Ext & ":", "Создание файла", "")

if Len(FileName) = 0 then
MB = MsgBox("Не задано имя файла!", vbOKOnly + vbExclamation, "Создание файла")
WScript.Quit
end if

if Len(FSO.GetExtensionName(FileName)) > 0 then
Ext = ""
end if

FilePath = WScript.Arguments(0) & FileName & Ext

if not FSO.FileExists(FilePath) then
FSO.CreateTextFile(FilePath)
end if

'WS.Run FilePath
WS.Run """" & Editor & """ " & FilePath

Set FSO = Nothing
Set WS = Nothing
WScript.Quit
Я вообще-то PHP-программер, а это методом тыка написал :)
Ниче такой язык, понятный.
Последний раз редактировалось sEXEcutor Пн июл 10, 2006 19:56, всего редактировалось 5 раз.
Аватара пользователя
funduk
Сообщения: 1515
Зарегистрирован: Вт авг 16, 2005 16:00
Откуда: Санкт-Петербург

Сообщение funduk »

Этааа.... а shift+F4 чем плох?
sEXEcutor
Сообщения: 24
Зарегистрирован: Вс июл 09, 2006 04:21

Сообщение sEXEcutor »

funduk писал(а):Этааа.... а shift+F4 чем плох?
После сотни созданий файла мне просто надоело дописывать точку и расширение к названию файла, вот и решил обойтись без этого.
Плюс можно указывать редактор для открытия (например, указать расширение jpg и редактор Photoshop).
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Re: Создание пустого файла

Сообщение Volniy »

sEXEcutor писал(а):Я вообще-то PHP-программер, а это методом тыка написал :)
Ниче такой язык, понятный.
Понятный, это факт, но все равно лучше Set WC = Nothing заменить на Set WS = Nothing. Если вначале скрипта писать Option Explicit, такие ошибки будут отлавливаться.
Lamer
Сообщения: 522
Зарегистрирован: Пн мар 20, 2006 03:55

Re: Создание пустого файла

Сообщение Lamer »

Volniy писал(а):лучше Set WC = Nothing заменить на Set WS = Nothing.
А раэница то в чём? Апичатка? :)
Аватара пользователя
LocKtaR-o-DarK
Сообщения: 349
Зарегистрирован: Пт авг 12, 2005 04:20
Откуда: Москва
Контактная информация:

Сообщение LocKtaR-o-DarK »

2Lamer у Volniy хорошо намётан глаз, скрипт написан немного невнимательно, ошибка в предпоследней строке
2sEXEcutor
wincmd.ini
[Configuration]
RenameSelOnlyName=1
позволит легко работать, как указал funduk, по S+F4 и перименованием с копированием по S+F5, ну а S+F6 для шлифовки
хотя о вкусах не спорят...
Изображение    Изображение    Изображение
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Гм...
Я так понимаю, что опечатка тянется отсюда :)
А еще определять расширение через точку в имени не очень красиво. Это я в старых скриптах так делал (как же давно я уже не писал переменной с именем DotInName :roll: ). Для определения расширения есть функция FSO.GetExtensionName.
sEXEcutor
Сообщения: 24
Зарегистрирован: Вс июл 09, 2006 04:21

Сообщение sEXEcutor »

LocKtaR-o-DarK писал(а):wincmd.ini
[Configuration]
RenameSelOnlyName=1
позволит легко работать, как указал funduk, по S+F4 и перименованием с копированием по S+F5, ну а S+F6 для шлифовки
хотя о вкусах не спорят...
Это ж сколько движений нужно сделать.. :)

Скрипт переписал.
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Этот пост меня вдохновил, наконец то. Искал реализацию автосоздания txt'шника по имени, но как обычно свои мысли, свои задумки по функционалу. Может кому-нибудь пригодится.

Код: Выделить всё

Option Explicit
Dim Dict : Set Dict = CreateObject("Scripting.Dictionary") : Dict.CompareMode = vbTextCompare
Dim Editor, Ext, ShowMemo, DefaultNoname, WinAssociation, OpenNewFile, Divider, DontOpen
'============================================================================================ 
' Имя: Новый файл по SHIFT+F4
' Параметры: ""%P%N""
'
'Использование (ввод в InputBox):
'[имя файла][пробел][?сокращение редактора]
'
'РЕДАКТОРЫ:
'первый параметр - сокращение редактора
'второй параметр - путь к редактору[[пробел]/расширение]
'	здесь расширение создаваемого файла
'	т.е, если в InputBox ввести "filename ?сокращение редактора", то получим
'	файл "filename.расширение
'
'Так же работет явное указание расширения (условие - неравенство имени
'файла/папки под курсором и введенного имени до ?, не зависит от регистра)
'
'Знак вопроса можно заменить на другой разделитель в конфигурации (параметр Divider)
'============================================================================================ 

'=========Конфигурация========
'РЕДАКТОРЫ
Dict.Add "default", ""
'--------
Dict.Add "np", "%SystemRoot%\Notepad.exe"
Dict.Add "em", "%COMMANDER_PATH%\PROGS\OFFICE\emed32 10.0.0\EmEditor.exe"
Dict.Add "++", "%COMMANDER_PATH%\PROGS\OFFICE\notepadpp\notepad+1+.exe"
Dict.Add "ps", "%ProgramFiles%\Adobe\Photoshop CS\Photoshop.exe /psd"
Dict.Add "aud", "%ProgramFiles%\Adobe\Adobe Audition 3.0\Audition.exe /wav"
'Dict.Add
'Dict.Add

'Редактор по умолчанию
Editor = "em"
'Расширение по умочланию
Ext = "txt"
'Показывать памятку
ShowMemo = False
'Имя файла при пустом вводе
DefaultNoname = "Untitled"
'использовать системные ассоциации (не учитывать расширения в Dict)
WinAssociation = False
'Открывать созданный файл
OpenNewFile = True
'Управляющий символ
Divider = "/"
DontOpen = "-" 'если ввести последним, то файл только создается
'================================

Dim FSO, WS, Memo, arg1, FilePath, FileName, Resp, STR

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set WS = WScript.CreateObject("WScript.Shell") 

Dim i, DictKeys : DictKeys = Dict.Keys
If Dict.Count < 2 Then
	WinAssociation = True
Else
	If Dict.Count = 2 Then
		Dict.Item("default") = Trim(Split(Dict.Item(DictKeys(1)),"/")(0))
	ElseIf Dict.Exists(Editor) Then 
		Dict.Item("default") = Trim(Split(Dict.Item(Editor),"/")(0))
	End If
	Editor = Dict.Item("default")
End If

If ShowMemo Then
	AssembleMemo()
Else
	If Dict.Count > 1 Then Memo = vbCrLf & "для справки введите " & Divider & "memo" & vbCrLf
End If

'определяем путь и имя без расширения от файла/папки под курсором
If WScript.Arguments.Count = 1 Then
	arg1 = WScript.Arguments(0)
Else
	MsgBox "Неверно количество аргументов", vbExclamation, "Создание файла"
	Quit
End If

If Right(arg1,1) = "\" Then
	FileName = ""
	FilePath = arg1
Else
	FileName = FSO.GetBaseName(arg1)
	FilePath = FSO.GetParentFolderName(arg1)
	If Not Right(FilePath, 1) = "\" Then FilePath = FilePath & "\"
End If

'ввод пользователя (если используется разделитель(напрмер ?) и указано несуществующее
'сокращение редактора то цикл
STR = FileName
Dim str1, str2, editor1, str3, str4
str3 = "системная ассоциация"
arg1 = True 'как флаг
Do Until UserInput(STR) : : Loop
If OpenNewFile Then
	On Error Resume Next
	If WinAssociation Then
		WS.Run Chr(34) & Resp & Chr(34)
		If err Then	MsgBox "Нет программы" & vbCrLf & _
		"ассоциированной с расширением:" & vbCrLf & _
		str2, vbExclamation, "Cоздание файла"
	ElseIf FSO.FileExists(WS.ExpandEnvironmentStrings(Editor)) Then
		WS.Run Chr(34) & Editor & Chr(34) & " " & Chr(34) & Resp & Chr(34)
		If err Then	MsgBox "Неизвестная ошибка" , vbExclamation, "Cоздание файла"
	Else
		MsgBox "Не найден редактор:" & vbCrLf & _
		Editor, _
		vbExclamation, _
		"Создание файла"
	End If
	On Error Goto 0
End If
Quit

Sub AssembleMemo
	''собираем памятку-таблицу для InputBox (сокращение	exe'шник редактора) 
	If Dict.Count > 1 Then
		For i = 1 To Dict.Count -1 
			Memo = Memo & DictKeys(i) & Chr(9) & FSO.GetBaseName(Dict.Item(DictKeys(i))) & vbCrLf
		Next
		Memo = vbCrLf & "(filename.ext " & Divider & "alias)" & vbCrLf & Memo
	End If
End Sub

Function UserInput(Byref def_)
	UserInput = False
	If Not WinAssociation AND Dict.Count > 1 Then str3 = FSO.GetBaseName(Dict.Item("default"))
	Resp = InputBox(	"Введите имя создаваемого файла ." & Ext & ":" & vbCrlf & _
						"редактор: " & str3 & vbCrlf & _
						Memo, _
						"Создание файла", _
						def_)
	If IsEmpty(Resp) Then Quit
	
	If LCase(Resp) = Divider & "memo" Then
		Memo = ""
		AssembleMemo()
		WinAssociation = False
		Exit Function
	End If
	If Right(Resp, 1) = DontOpen Then
		OpenNewFile = False
		Resp = Left(Resp,Len(Resp)-1)
	End If
	If InStr(Resp, Divider) Then
			Dim resp1
			str1 = Split(Resp, Divider, 2)
			resp1 = Trim(str1(0))
			If (Dict.Count > 1) Then
				WinAssociation = False
				editor1 = Trim(str1(1))
				If Dict.Exists(editor1) Then 
					str2 = Dict.Item(editor1)
					If InStr(str2, Divider) Then
						str1 = Split(str2, "/", 2)
						Editor = Trim(str1(0))
						Ext = LCase(str1(1))
					Else
						Editor = str2
					End If
					arg1 = False
				Else
					STR = Resp
					Exit Function
				End If
			Else
				Exit Function
			End If
			Resp = resp1
	End If
	
	If Len(Resp) = 0 Then
		'FilePath = WS.SpecialFolders("MyDocuments") & "\"
		FileName = DefaultNoname
	ElseIf Resp = FileName Then
		'do nothing
	Else
		If Not LCase(Resp) = LCase(FileName) Then
			str2 = FSO.GetExtensionName(Resp)
			If Not Len(str2) = 0 Then 
				Ext = ""
				If (Not WinAssociation) AND arg1 AND (Dict.Count > 1) Then
					Dim i, DictKeys
					DictKeys = Dict.Keys
					For i = 1 To Dict.Count -1 
						editor1 = Dict.Item(DictKeys(i))
						If InStr(editor1, Divider) Then
							str1 = Split(editor1, "/", 2)
							If LCase(str2) = Trim(LCase(str1(1))) Then
								Editor = Trim(str1(0))
								Exit For
							End If
						End If	
					Next
				End If
			End If
		End If
		FileName = Resp
	End If
	If Not Len(Ext) = 0 Then Ext = "." & Ext
	str4 = Resp
	Resp = FilePath & FileName & Ext
	If Not FSO.FileExists(Resp) Then 
		On Error Resume Next
			FSO.CreateTextFile(Resp) 
			If err Then	
				MsgBox "Ошибка создания файла", _
				vbExclamation, _
				"Cоздание файла"
				UserInput = False
				STR = str4
				Exit Function
			End If
		On Error Goto 0
	End If
	UserInput = True
End Function

Sub Quit
	Set FSO = Nothing 
	Set WS = Nothing 
	Set Dict = Nothing
	WScript.Quit
End Sub
Только не пойму, диалог нового файла в Photoshop CS всплывает, но при нажатии на Ok выдает Could not complete your request because of a program error.
Audition новый файл создает нормально.
Последний раз редактировалось _Johm Ср сен 22, 2010 21:01, всего редактировалось 14 раз.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

_Johm писал(а):Только не пойму, диалог нового файла в Photoshop CS всплывает, но при нажатии на Ok выдает Could not complete your request because of a program error.
Может Photoshop CS ругается на пустой файл, созданный по CreateTextFile? Если просто открыть этот файл из программы, не ругается?
Или может быть синтаксис командной строки для открытия существующего файла требует какого-нибудь ключа?
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

funduk писал(а):Этааа.... а shift+F4 чем плох?
sEXEcutor писал(а):После сотни созданий файла мне просто надоело дописывать точку и расширение к названию файла, вот и решил обойтись без этого.
Плюс можно указывать редактор для открытия (например, указать расширение jpg и редактор Photoshop).
А можно я пять копеек суну в дискуссию?
При нажатии shift+F4 предлагается по умолчанию имя текущего файла (включая расширение). Таким образом, чем "похожее" новое имя на текущее, тем меньше работы - можно свести дело к исправлению (добавлению, кому как удобнее) одного-единственного символа.
Теперь о редакторе. Простите, а ассоциации (внутренние или внешние) - это разве что-то другое?
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Batya
Да забыл сказать, 0 байтный файл потом Photoshop открывает без проблем, то есть, предлагает диалог нового файла и по Ok, всё ок.

+Точно, все дело в открытии текстового файла.
Поправил скрипт, использовал ADODB.Stream

Вахмурка
А ассоциации наверно то же самое, я ими не пользуюсь, с ними новый файл создается?

+тут ни одного символа менять не надо, чтобы получить txt-файл.

Поправил скрип, команда ?memo показывает памятку, по умолчанию её убрал.
Ну вроде всё. Не знаю, окупятся ли 1,5 часа написания сего скрипта, экономией времени на смену расширения на txt (за жизнь)...
Последний раз редактировалось _Johm Вт сен 21, 2010 19:33, всего редактировалось 2 раза.
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

Вахмурка писал(а):Простите, а ассоциации (внутренние или внешние) - это разве что-то другое?
Пост писался в 2006 году, тогда внутренних ассоциаций в тотале ещё не было.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

2_Johm
Нет, дело в другом. Если у меня расширение jpg ассоциировано с PhotoShоp'ом, то после создания jpg-файла он будет ассоциирован точно так же, и для этого незачем ваять отдельный скрипт.

2Samwatas
А внешние (системные)?
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
_Johm
Сообщения: 119
Зарегистрирован: Вс май 14, 2006 20:03

Сообщение _Johm »

Вахмурка
Да согласен. Добавлю флаг - не открывать файл автоматически, а только его создавать :)

+
Исправил скрипт. Все работает и с CreateTextFile. Ошибка была в двойном слэше, на который ругался Photoshop (но которые понимали EmEditor и notepad(++)): Метод GetParentFolderName возвращает папку без слэша на конце, но только не в случае когда находимся в корневом каталоге (тогда он возвращает D:\

Добавил определение РЕДАКТОРА по вводимому расширению и
параметр в конфиге для системных ассоциаций.
Ответить