Страница 1 из 2

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

Добавлено: Вс июл 09, 2006 04:30
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-программер, а это методом тыка написал :)
Ниче такой язык, понятный.

Добавлено: Вс июл 09, 2006 13:58
funduk
Этааа.... а shift+F4 чем плох?

Добавлено: Вс июл 09, 2006 14:20
sEXEcutor
funduk писал(а):Этааа.... а shift+F4 чем плох?
После сотни созданий файла мне просто надоело дописывать точку и расширение к названию файла, вот и решил обойтись без этого.
Плюс можно указывать редактор для открытия (например, указать расширение jpg и редактор Photoshop).

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

Добавлено: Пн июл 10, 2006 01:47
Volniy
sEXEcutor писал(а):Я вообще-то PHP-программер, а это методом тыка написал :)
Ниче такой язык, понятный.
Понятный, это факт, но все равно лучше Set WC = Nothing заменить на Set WS = Nothing. Если вначале скрипта писать Option Explicit, такие ошибки будут отлавливаться.

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

Добавлено: Пн июл 10, 2006 01:55
Lamer
Volniy писал(а):лучше Set WC = Nothing заменить на Set WS = Nothing.
А раэница то в чём? Апичатка? :)

Добавлено: Пн июл 10, 2006 08:13
LocKtaR-o-DarK
2Lamer у Volniy хорошо намётан глаз, скрипт написан немного невнимательно, ошибка в предпоследней строке
2sEXEcutor
wincmd.ini
[Configuration]
RenameSelOnlyName=1
позволит легко работать, как указал funduk, по S+F4 и перименованием с копированием по S+F5, ну а S+F6 для шлифовки
хотя о вкусах не спорят...

Добавлено: Пн июл 10, 2006 11:46
Batya
Гм...
Я так понимаю, что опечатка тянется отсюда :)
А еще определять расширение через точку в имени не очень красиво. Это я в старых скриптах так делал (как же давно я уже не писал переменной с именем DotInName :roll: ). Для определения расширения есть функция FSO.GetExtensionName.

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

Скрипт переписал.

Добавлено: Вт сен 21, 2010 16:39
_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 новый файл создает нормально.

Добавлено: Вт сен 21, 2010 17:16
Batya
_Johm писал(а):Только не пойму, диалог нового файла в Photoshop CS всплывает, но при нажатии на Ok выдает Could not complete your request because of a program error.
Может Photoshop CS ругается на пустой файл, созданный по CreateTextFile? Если просто открыть этот файл из программы, не ругается?
Или может быть синтаксис командной строки для открытия существующего файла требует какого-нибудь ключа?

Добавлено: Вт сен 21, 2010 17:17
Вахмурка
funduk писал(а):Этааа.... а shift+F4 чем плох?
sEXEcutor писал(а):После сотни созданий файла мне просто надоело дописывать точку и расширение к названию файла, вот и решил обойтись без этого.
Плюс можно указывать редактор для открытия (например, указать расширение jpg и редактор Photoshop).
А можно я пять копеек суну в дискуссию?
При нажатии shift+F4 предлагается по умолчанию имя текущего файла (включая расширение). Таким образом, чем "похожее" новое имя на текущее, тем меньше работы - можно свести дело к исправлению (добавлению, кому как удобнее) одного-единственного символа.
Теперь о редакторе. Простите, а ассоциации (внутренние или внешние) - это разве что-то другое?

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

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

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

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

Поправил скрип, команда ?memo показывает памятку, по умолчанию её убрал.
Ну вроде всё. Не знаю, окупятся ли 1,5 часа написания сего скрипта, экономией времени на смену расширения на txt (за жизнь)...

Добавлено: Вт сен 21, 2010 18:45
Samwatas
Вахмурка писал(а):Простите, а ассоциации (внутренние или внешние) - это разве что-то другое?
Пост писался в 2006 году, тогда внутренних ассоциаций в тотале ещё не было.

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

2Samwatas
А внешние (системные)?

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

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

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