Страница 23 из 42

Добавлено: Сб фев 04, 2012 11:08
HEXFIX
Всем доброго времени суток.
Если уже было, сильно не ругайте - честно искал, но не нашёл. :D
Есть скрипт, по-моему от Batya, который создаёт файл с заданным именем с содержимым буфера обмена.
Можно ли его модифицировать таким образом, чтобы после создания файл сразу же открывался в редакторе (я использую AkelPad)?

Добавлено: Сб фев 04, 2012 11:20
Avada
HEXFIX
Безотносительно к технической стороне вопроса: уже много раз говорено (в том числе в правилах и памятке), что оверквотинг на форуме запрещён. На существующие скрипты надо давать ссылки. Выносится замечание, код заменяется ссылкой.

Добавлено: Чт фев 09, 2012 01:30
Flasher
HEXFIX
Забыл про просьбу. Правильней было бы использовать этот скрипт. Но я пользуюсь своим:

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

' Создать файл с текстом буфера обмена (при наличии) и открыть его в редакторе
' Параметры: "%P" "<путь к редактору>"
'===================================================================================
P = WScript.Arguments(0) : Ed = WScript.Arguments(1)
Set FSO  = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH  = CreateObject("WScript.Shell")
R = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1407"
A = WSH.RegRead(R)
If A > 0 Then WSH.RegWrite R, 0, "REG_DWORD"
Clip = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
If A > 0 Then WSH.RegWrite R, A, "REG_DWORD"
If Trim(Clip) = "" Then Quit
File = FSO.GetBaseName(FSO.GetTempName) & ".txt"
FSO.OpenTextFile(P & File, 2, True).Write Clip : WSH.Exec(Ed & " " & File) : Quit
Function Quit : Set WSH = Nothing : Set FSO = Nothing : WScript.Quit : End Function

Добавлено: Чт фев 09, 2012 02:08
Tol!k

Добавлено: Чт фев 09, 2012 02:12
Flasher
:) Улыбнуло. Я сперва хотел тоже предложить эту кнопку, потом, увидев утилиту, подклейку даты и отсутствие указания нужного редактора, передумал..

Добавлено: Пт фев 10, 2012 17:15
Victor_Dobrov
Предлагаю скрипт переключения x32 <> x64 версий TC по клику на тексте 32 (или 64) за пунктом "Справка" (или последним в меню)

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

' Перезапуск x32 <> x64. Закрыть 32-битный и запустить TC x64 (и наоборот). Для x86 только рестарт TC
' сохраните код в файл (напр. 1.vbs), скопируйте в папку (напр. %commander_path%\scripts) и запустите
' скрипт переименуется в SwitchTC32or64.vbs (можно изменить), в UserCmd.ini добавится эта команда,
' в меню добавляется последний пункт (32/64), который перезапускает TC с другой разрядностью

em_cmd = "SwitchTC32or64"	'имя скрипта и em_команды, можно изменить
Set WshShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
commander_PATH = ExpStr("%COMMANDER_PATH%",0) : commander_INI = ExpStr("%COMMANDER_INI%",0)

Set TCS = CreateObject("TCScript.Helper")
	If not IsObject(TCS) Then MsgBox "Script Helper ActiveX for Total Commander" & vbTab & VbCr & VbCr & "для регистрации в системе выполните:" & VbCr & "TCWSHelp.exe /REGSERVER",vbSystemModal + vbInformation,"Отсутствует компонент ActiveX" : WScript.Quit
If not TCS.IsRunningTC Then WScript.Quit	'скрипт запущен не из ТС
	Set File = FSO.GetFile(WScript.ScriptFullName)
	if FSO.GetBaseName(File) <> em_cmd then File.Name = em_cmd & ".vbs"
UserCmd = ExpStr(commander_INI,1) & "UserCmd.ini"
	if FSO.FileExists(UserCmd) then txt = CleanLF(FSO.OpenTextFile(UserCmd,1).ReadAll) & vbNewLine else txt = ""
	If InStr(txt, "em_" & em_cmd) = 0 Then FSO.OpenTextFile(UserCmd, 2,1).Write txt & "[em_" & em_cmd & "]" & vbNewLine & "cmd=" & ExpStr(WScript.ScriptFullName,1) & em_cmd & ".vbs"

Menu = commander_PATH & "\Language\" & TCS.INIRead(commander_INI,"Configuration","Mainmenu","wcmd_eng.mnu")
x64 = (ExpStr("%PROCESSOR_ARCHITEW6432%",0) = "AMD64" or ExpStr("%PROCESSOR_ARCHITECTURE%",0) = "AMD64")
str32 = "MENUITEM ""32"", em_" & em_cmd : str64 = "MENUITEM ""64"", em_" & em_cmd : exe = commander_PATH & "\totalcmd.exe"
if LCase(ExpStr(ExpStr("%COMMANDER_EXE%",0),2)) = "totalcmd64.exe" Then Mode = 64 Else Mode = 32
If Mode = 32 then if x64 then exe = commander_PATH & "\totalcmd64.exe" else str64 = str32

txt = CleanLF(FSO.OpenTextFile(Menu, 1).ReadAll) : res = txt
If InStr(txt, "em_" & em_cmd) > 0 Then
	if Mode = 32 Then
		If not InStr(txt, str64) > 0 Then res = Replace(txt, str32, str64,1,-1,1)
	else
		If not InStr(txt, str32) > 0 Then res = Replace(txt, str64, str32,1,-1,1)
	end If
Else
	If Mode = 32 Then res = txt & vbNewLine & str64 Else res = txt & vbNewLine & str32
End If
if res <> txt Then FSO.OpenTextFile(Menu, 2).Write res

Do While TCS.IsRunningTC
	TCS.SendCommand "cm_Exit": WScript.Sleep 100 : n = n + 1
	If n > 200 Then Exit Do
Loop

WshShell.Run (exe & " /i=" & commander_INI)
WScript.Quit

Function ExpStr(str, n)	'Раскрыть системные переменные, выделить имя файла или папки
	if n = 1 then ExpStr = FSO.GetParentFolderName(str) & "\" else if n = 2 then ExpStr = FSO.GetFileName(str) else if n = 3 then ExpStr = FSO.GetBaseName(str) else ExpStr = WshShell.ExpandEnvironmentStrings(str)
End Function

Function CleanLF(AllText)	'Удаление лишних пустых строк в конце текста
	Do While (Right(AllText, Len(vbNewLine)) = vbNewLine)
		AllText = Left(AllText, Len(AllText) - Len(vbNewLine))
	Loop
	CleanLF = AllText
End Function

Добавлено: Сб фев 11, 2012 03:54
Flasher
Victor_Dobrov
Что-то наворочено много и не по делу. Хелпер с регистрацией тут вообще не нужен. Меню почему-то берётся именно английское (русскому пользователю автор об этом сообщить не захотел почему-то), а по логике должно читаться из ключа Mainmenu. Проверку запущенности TC вполне можно опустить при замене.
Строчку с %PROCESSOR_ARCHITEW6432% я вообще не понял. Я обычно разрядность через WMI определяю. Почему сравнивается имя exe-шника именно в верхнем регистре мне совсем непонятно, как и то, почему не учтён исключение с другим именем. Я пришёл к выводу, что проверку нужно делать только по размеру (InternalName не берём). Функция Quote бесполезная. Зачем вообще проверять, есть кавычки или нет, если можно сразу их ставить? Навязывание расположения файла(ов) быть не должно. Лучше просто сделать подписи, где и что менять, этого как правило достаточно. Зачем для переменной em_Name писать отдельно функцию не уловил. Почему написано, что пункт добавляется после меню "Справка" (которой может и не быть), когда оно там совсем никак не идентифицируется?
Скрипт больше тянет на сборочный или для себя. Выкладывание его в паблик преждевременное.

Добавлено: Сб фев 11, 2012 04:17
Victor_Dobrov
Flasher писал(а):Victor_Dobrov
Меню почему-то берётся именно английское, а по логике должно читаться из ключа Mainmenu. Строчку с %PROCESSOR_ARCHITEW6432% я вообще не понял.
TCS.INIRead(COMMANDER_INI,"Configuration","Mainmenu") - эту строку не заметили?
%PROCESSOR_ARCHITEW6432% - при запуске из под TC x32 определяет, что система - x64.

Не нравится Helper, посоветуйте, как использовать TCFS2
Скрипт делал на случай, если заголовок окна скрыт. Лучше бы ответили, работает ли скрипт, пункт "32" появляется в конце меню?
Выкладывание его в паблик преждевременное.
С таким подходом здесь половину скриптов убрать надо.

Добавлено: Сб фев 11, 2012 04:32
Flasher
Victor_Dobrov писал(а):TCS.INIRead(COMMANDER_INI,"Configuration","Mainmenu") - эту строку не заметили?
В этой строке как раз и стоит wcmd_eng.mnu.
Victor_Dobrov писал(а):%PROCESSOR_ARCHITEW6432% - при запуске из под TC x32 определяет, что система - x64.
Там есть некоторые аспекты, касаемые этой переменной, которые не всегда показывают верный результат. Мы их тут разбирали. К тому же переменная может существовать не по желанию системы, а по желанию пользователя, что и вызовит проблемы. Если надо, могу подсказать как легко получать архитектуру через WMI.
Victor_Dobrov писал(а):Не нравится Helper, посоветуйте, как использовать TCFS2
В TCFS2 есть функции для работы с ini-файлами. Они описаны в справке.
Victor_Dobrov писал(а):С таким подходом здесь половину скриптов убрать надо.
Не согласен. Половиной никак не пахнет. Да и если скрипт пишется кому-то, то проблемы решаются по ходу поступления и тестирования, а если скрипт выкладывается самостоятельно как окончательный (без предупреждения о возможных багах), то это не есть хорошо. Я, например, скрипт обновления ТС сразу выкладывать побоялся, понимая, что могут быть подводные камни. Добрые люди помогли в тестах и работе над исключениями, за что я им благодарен. Если бы я скрипт выложил раньше времени, то тут многим нервы точно подпортил.

Добавлено: Сб фев 11, 2012 04:44
Victor_Dobrov
В этой строке как раз и стоит wcmd_eng.mnu.
но это значение по-умолчанию, читается именно то, что установил пользователь.
Если надо, могу подскать как легко получать архитектуру через WMI
не надо, также работает не всегда и слишком тормозит.

Я не совсем понял, вы просите убрать скрипт? Если да, я это сделаю.

Добавлено: Сб фев 11, 2012 04:48
Flasher
Victor_Dobrov писал(а):но это значение по-умолчанию, читается именно то, что установил пользователь.
По умолчанию, если на этапе установки был выбран английский.
Victor_Dobrov писал(а):не надо, также работает не всегда и слишком тормозит.
Т.е. "не всегда"? У меня нигде проблем не было (и не только у меня). Да, скорость несколько ниже (тормоза в основном возникают при использовании общей маски (*), что легко обходится), но зато сам способ точно надёжнее. А когда речь о перезапуске, то там вообще этот момент незаметен.
Victor_Dobrov писал(а):Я не совсем понял, вы просите убрать скрипт? Если да, я это сделаю.
Ни в коем случае. Раз обсуждение завелось, то удаление скрипта будет относиться к случаям форумного дурнотония. По крайней мере другим будет ясно, с чем они смогут столкнуться. Мой посыл не охарактеризован призывом к удалению полезной (для кого-то) информации, а исключительно к допиливанию имеющейся.

Добавлено: Сб фев 11, 2012 07:45
Victor_Dobrov
Flasher

Исправил некоторые замечания в SwitchTC32or64.vbs, ссылка на скрипт та же: http://forum.wincmd.ru/viewpost.php?p=89213

Добавлено: Вт фев 21, 2012 20:25
skole
Еще в тему, может кому понадобится... если Batya доработает, то хорошо :)

Создание шары из текущего каталога

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

' ===================================================================
'  Автор:		SkOle, Оренбург
'  Описание:	Предоставляет текущему каталогу общий доступ
'  Параметры:	%P%N
' ===================================================================

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

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "
ootcimv2")
Set objNewShare = objWMIService.Get("Win32_Share")

DESCRIPTION = InputBox("Укажите описание для создаваемого ресурса", "Создание общего ресурса")

errReturn = objNewShare.Create(WSH.CurrentDirectory, FSO.GetFolder(WSH.CurrentDirectory).Name, 0, TRUE, DESCRIPTION)

If errReturn = 0 Then
	MsgBox "Общий ресурс для каталога " & WSH.CurrentDirectory & " успешно создан", vbInformation, "Уведомление"
End If

Set FSO = Nothing
Set WSH = Nothing

Wscript.Quit
Удаление шары, если текущий каталог таким является

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

' ===================================================================
'  Автор:		SkOle, Оренбург
'  Описание:	Убирает у текущего каталога общий доступ,
                                если таковой имеется
'  Параметры:	%P%N
' ===================================================================

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

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "
ootcimv2")
Set colShares = objWMIService.ExecQuery ("Select * from Win32_Share Where Name = '" & FSO.GetFolder(WSH.CurrentDirectory).Name & "'")

For Each objShare in colShares
    errReturn = objShare.Delete
Next

If errReturn = 0 Then
	MsgBox "Общий ресурс для каталога " & WSH.CurrentDirectory & " успешно удален", vbInformation, "Уведомление"
End If

Set FSO = Nothing
Set WSH = Nothing

WScript.Quit
Установка шрифта

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

' ==============================================================
'  Автор:		SkOle, Оренбург
'  Описание:	Устанавливает текущий шрифт в систему
'  Параметры:	%P%N
' ==============================================================

Option Explicit 
Dim FSO 
Set FSO = CreateObject("Scripting.FileSystemObject") 
  
If WScript.Arguments.Count > 0 Then
	If FSO.FileExists(WScript.Arguments(0)) Then 
		If (LCase(FSO.GetExtensionName(WScript.Arguments(0))) = "ttf") or (LCase(FSO.GetExtensionName(WScript.Arguments(0))) = "fon") or (LCase(FSO.GetExtensionName(WScript.Arguments(0))) = "otf") Then
			Dim WSH 
			Set WSH = CreateObject("WScript.Shell") 
			
			FSO.CopyFile WScript.Arguments(0), WSH.SpecialFolders("Fonts") & "" 
			WSH.Run "RunDll32.exe gdi32.dll,AddFontResourceA " & FSO.GetBaseName(WScript.Arguments(0)) 
			
			Set WSH = Nothing
		Else
			MsgBox "Данный файл не является шрифтом", vbCritical, "Ошибка"
		End If
	End If
End If 

Set FSO = Nothing
WScript.Quit
Аналог ChoiseEditor и пр. вешается на F4

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

' ===================================================================
'  Автор:		SkOle, Оренбург
'  Описание:	Выбирает, через какую программу открыть текущий файл
'				Выбор издет из списка в wincmd.ini
'  Параметры:	%P%N
' ===================================================================

Const Section = "ExternalApplication"

If WScript.Arguments.Count > 0 Then
        Dim WSH, FSO, Ext
        
        Set WSH = CreateObject("WScript.Shell") 
        Set FSO = CreateObject("Scripting.FileSystemObject") 
        
        Commander_Path = WSH.ExpandEnvironmentStrings("%COMMANDER_PATH%")
        Ext = FSO.GetExtensionName(WScript.Arguments(0))
        Ini = ReadIni (Commander_Path & "wincmd.ini", Section, Ext)
        If Ini <> "" Then
                Exe = Replace(Ini, "%COMMANDER_PATH%", Commander_Path)
                Ext =  Trim(Left(FSO.GetExtensionName(Exe), 3))
                If LCase(Ext) = "vbs" Then
                        WSH.Run Exe & " " & chr(34) & WScript.Arguments(0) & chr(34) 
                Else
                        WSH.Run chr(34) & Exe & chr(34) & " " & chr(34) & WScript.Arguments(0) & chr(34) 
                End If       
        Else
                Ini = ReadIni (Commander_Path & "wincmd.ini", Section, "default")
                Exe = Replace(Ini, "%COMMANDER_PATH%", Commander_Path)
                WSH.Run chr(34) & Exe & chr(34) & " " & chr(34) & WScript.Arguments(0) & chr(34) 
        End If
                
        Set WSH = Nothing
        Set FSO = Nothing
End If

' Функция чтения INI-файла была взята с форума wincmd.ru

Function ReadIni( myFilePath, mySection, myKey )
        Const ForReading   = 1
        Const ForWriting   = 2
        Const ForAppending = 8

        Dim intEqualPos
        Dim objFSO, objIniFile
        Dim strFilePath, strKey, strLeftString, strLine, strSection

        Set objFSO = CreateObject( "Scripting.FileSystemObject" )

        ReadIni = ""
        strFilePath = Trim( myFilePath )
        strSection  = Trim( mySection )
        strKey = Trim( myKey )

        If objFSO.FileExists( strFilePath ) Then
                Set objIniFile = objFSO.OpenTextFile( strFilePath, ForReading, False )
                Do While objIniFile.AtEndOfStream = False
                strLine = Trim( objIniFile.ReadLine )

                If LCase( strLine ) = "[" & LCase( strSection ) & "]" Then
                        strLine = Trim( objIniFile.ReadLine )

                Do While Left( strLine, 1 ) <> "["
                        intEqualPos = InStr( 1, strLine, "=", 1 )
                        If intEqualPos > 0 Then
                                strLeftString = Trim( Left( strLine, intEqualPos - 1 ) )
                        If LCase( strLeftString ) = LCase( strKey ) Then
                                ReadIni = Trim( Mid( strLine, intEqualPos + 1 ) )
                                If ReadIni = "" Then
                                        ReadIni = " "
                                End If
                                Exit Do
                        End If
                End If

                If objIniFile.AtEndOfStream Then Exit Do
                        strLine = Trim( objIniFile.ReadLine )
                        Loop
                        Exit Do
                End If
                Loop
                objIniFile.Close
        Else
		MsgBox strFilePath & " не найден", vbCritical, "Ошибка"
        Wscript.Quit 1
    End If
End Function
ну и пример использования... необходимая секция из wincmd.ini

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

[ExternalApplication]
; По умолчанию
default=%COMMANDER_PATH%	oolswin32
otepad++
otepad++.exe
; Внешние утилиты
exe=wscript "%COMMANDER_PATH%	oolswin32
estorator
estorator.vbs"
iso=wscript "%COMMANDER_PATH%	oolswin32ultraisoultraiso.vbs"
ico=%COMMANDER_PATH%	oolswin32icofxicofx.exe
psd=%COMMANDER_PATH%	oolswin32photoshopphotoshop.exe

Добавлено: Ср фев 22, 2012 12:27
Avada
skole
По прежнему расположению в "Обмене кнопками" — нет, не в тему. Эта часть поста перенесена в более подходящее место.
Кстати, описания первых двух скриптов тоже следовало бы указывать как комментарии в самих скриптах.

Добавлено: Вс фев 26, 2012 09:39
skole
Avada
ну я из своей сборки просто скопировал... описание скрипта жирным выделено :)