Скрипт, меняющий значение строки в INI-файле

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

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

Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Скрипт, меняющий значение строки в INI-файле

Сообщение ask-rus »

Необходим скрипт, меняющий значение строки в INI-файле - mpc-hc.ini

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

DSVidRen=3
на

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

DSVidRen=5
И второй скрипт обратно "DSVidRen=5" на "DSVidRen=3" по аналогии.

Это мне нужно, чтобы не лезть в настройки Media Player Classic-а. (меняем рендер для запуска видео с субтитрами). Установлю скрипты как кнопки на панели.
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Если не париться с ini-структурой, используем vbs:

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

'=============================================
' Замена текста в файле
'
' Параметры:
' {файл} {текст для поиска} {текст для замены}
'=============================================
Option Explicit
Dim FSO, F, Str1, Str2, Text
Set FSO = CreateObject("Scripting.FileSystemObject")
With WScript
  F    = .Arguments(0)
  Str1 = .Arguments(1)
  Str2 = .Arguments(2)
End With
F = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F))

Text = FSO.OpenTextFile(F, 1).ReadAll
Text = Replace(Text, Str1, Str2, 1, -1, 1)
FSO.OpenTextFile(F, 2).Write Text

Set FSO = Nothing
WScript.Quit 0
Пример параметров:

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

"C:\Путь\к\ини\файлу\mpc-hc.ini" "DSVidRen=3" "DSVidRen=5"
Последний раз редактировалось Batya Ср мар 03, 2010 00:33, всего редактировалось 2 раза.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Batya, спасибо, всё работает!
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Снова прийти к портабельности. Прописал в команде и параметрах %COMMANDER_PATH%, увы ...
Cцeнapий: D:\Total Commander\PLUGINS\vbs\Subtitles.vbs
Cтpoкa: 16
Cимвoл: 1
Oшибкa: Пyть нe нaйдeн
Кoд: 800A004C
Иcтoчник: Oшибкa выпoлнeния Microsoft VBScript
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

ackep писал(а):Снова прийти к портабельности.
Сделал.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Batya писал(а):
ackep писал(а):Снова прийти к портабельности.
Сделал.

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\PLUGINS\vbs\Subtitles.vbs
"%COMMANDER_PATH%\SOFT\Media Player Classic Home Cinema\mpc-hc.ini" "DSVidRen=3" "DSVidRen=5"
%COMMANDER_PATH%\ICO\2.ico
Субтитры [VMR-7 (renderless)]

0
-1
---------------------------
Windows Script Host
---------------------------
Сценарий: D:\Total Commander\PLUGINS\vbs\Subtitles.vbs
Строка: 17
Символ: 1
Ошибка: Путь не найден
Код: 800A004C
Источник: Ошибка выполнения Microsoft VBScript

---------------------------
ОК
---------------------------
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
mf-zl
Сообщения: 71
Зарегистрирован: Вс авг 21, 2005 03:30
Откуда: BLR
Контактная информация:

Сообщение mf-zl »

Коммандная строка:
инишник секция ключ значение

Пример:
"%%commander_ini%%" Configuration Editor "notepad.exe"

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

Set ObjFSO   = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")

If WScript.Arguments.Count = 4 Then

  ini = WshShell.ExpandEnvironmentStrings(WScript.Arguments(0))
  sec = WScript.Arguments(1)
  key = WScript.Arguments(2)
  val = WScript.Arguments(3)

  If ObjFSO.FileExists(ini) Then
    WriteIni ini, sec, key, val
  End If

End If

' ------------------------------------------------------------------------------

Function ReadIni( myFilePath, mySection, myKey )
	' This function returns a value read from an INI file
	'
	' Arguments:
	' myFilePath  [string]  the (path and) file name of the INI file
	' mySection   [string]  the section in the INI file to be searched
	' myKey       [string]  the key whose value is to be returned
	'
	' Returns:
	' the [string] value for the specified key in the specified section
	'
	' CAVEAT:     Will return a space if key exists but value is blank
	'
	' Written by Keith Lacelle
	' Modified by Denis St-Pierre and Rob van der Woude

	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 )

			' Check if section is found in the current line
			If LCase( strLine ) = "[" & LCase( strSection ) & "]" Then
				strLine = Trim( objIniFile.ReadLine )

				' Parse lines until the next section is reached
				Do While Left( strLine, 1 ) <> "["
					' Find position of equal sign in the line
					intEqualPos = InStr( 1, strLine, "=", 1 )
					If intEqualPos > 0 Then
						strLeftString = Trim( Left( strLine, intEqualPos - 1 ) )
						' Check if item is found in the current line
						If LCase( strLeftString ) = LCase( strKey ) Then
							ReadIni = Trim( Mid( strLine, intEqualPos + 1 ) )
							' In case the item exists but value is blank
							If ReadIni = "" Then
								ReadIni = " "
							End If
							' Abort loop when item is found
							Exit Do
						End If
					End If

					' Abort if the end of the INI file is reached
					If objIniFile.AtEndOfStream Then Exit Do

					' Continue with next line
					strLine = Trim( objIniFile.ReadLine )
				Loop
			Exit Do
			End If
		Loop
		objIniFile.Close
	Else
		WScript.Echo strFilePath & " doesn't exists. Exiting..."
		Wscript.Quit 1
	End If
End Function


Sub WriteIni( myFilePath, mySection, myKey, myValue )
	' This subroutine writes a value to an INI file
	'
	' Arguments:
	' myFilePath  [string]  the (path and) file name of the INI file
	' mySection   [string]  the section in the INI file to be searched
	' myKey       [string]  the key whose value is to be written
	' myValue     [string]  the value to be written (myKey will be
	'                       deleted if myValue is <DELETE_THIS_VALUE>)
	'
	' Returns:
	' N/A
	'
	' CAVEAT:     WriteIni function needs ReadIni function to run
	'
	' Written by Keith Lacelle
	' Modified by Denis St-Pierre, Johan Pol and Rob van der Woude

	Const ForReading   = 1
	Const ForWriting   = 2
	Const ForAppending = 8

	Dim blnInSection, blnKeyExists, blnSectionExists, blnWritten
	Dim intEqualPos
	Dim objFSO, objNewIni, objOrgIni, wshShell
	Dim strFilePath, strFolderPath, strKey, strLeftString
	Dim strLine, strSection, strTempDir, strTempFile, strValue

	strFilePath = Trim( myFilePath )
	strSection  = Trim( mySection )
	strKey      = Trim( myKey )
	strValue    = Trim( myValue )

	Set objFSO   = CreateObject( "Scripting.FileSystemObject" )
	Set wshShell = CreateObject( "WScript.Shell" )

	strTempDir  = wshShell.ExpandEnvironmentStrings( "%TEMP%" )
	strTempFile = objFSO.BuildPath( strTempDir, objFSO.GetTempName )

	Set objOrgIni = objFSO.OpenTextFile( strFilePath, ForReading, True )
	Set objNewIni = objFSO.CreateTextFile( strTempFile, False, False )

	blnInSection     = False
	blnSectionExists = False
	' Check if the specified key already exists
	blnKeyExists     = ( ReadIni( strFilePath, strSection, strKey ) <> "" )
	blnWritten       = False

	' Check if path to INI file exists, quit if not
	strFolderPath = Mid( strFilePath, 1, InStrRev( strFilePath, "\" ) )
	If Not objFSO.FolderExists ( strFolderPath ) Then
		WScript.Echo "Error: WriteIni failed, folder path (" _
		           & strFolderPath & ") to ini file " _
		           & strFilePath & " not found!"
		Set objOrgIni = Nothing
		Set objNewIni = Nothing
		Set objFSO    = Nothing
		WScript.Quit 1
	End If

	While objOrgIni.AtEndOfStream = False
		strLine = Trim( objOrgIni.ReadLine )
		If blnWritten = False Then
			If LCase( strLine ) = "[" & LCase( strSection ) & "]" Then
				blnSectionExists = True
				blnInSection = True
			ElseIf InStr( strLine, "[" ) = 1 Then
				blnInSection = False
			End If
		End If

		If blnInSection Then
			If blnKeyExists Then
				intEqualPos = InStr( 1, strLine, "=", vbTextCompare )
				If intEqualPos > 0 Then
					strLeftString = Trim( Left( strLine, intEqualPos - 1 ) )
					If LCase( strLeftString ) = LCase( strKey ) Then
						' Only write the key if the value isn't empty
						' Modification by Johan Pol
						If strValue <> "<DELETE_THIS_VALUE>" Then
							objNewIni.WriteLine strKey & "=" & strValue
						End If
						blnWritten   = True
						blnInSection = False
					End If
				End If
				If Not blnWritten Then
					objNewIni.WriteLine strLine
				End If
			Else
				objNewIni.WriteLine strLine
					' Only write the key if the value isn't empty
					' Modification by Johan Pol
					If strValue <> "<DELETE_THIS_VALUE>" Then
						objNewIni.WriteLine strKey & "=" & strValue
					End If
				blnWritten   = True
				blnInSection = False
			End If
		Else
			objNewIni.WriteLine strLine
		End If
	Wend

	If blnSectionExists = False Then ' section doesn't exist
		objNewIni.WriteLine
		objNewIni.WriteLine "[" & strSection & "]"
			' Only write the key if the value isn't empty
			' Modification by Johan Pol
			If strValue <> "<DELETE_THIS_VALUE>" Then
				objNewIni.WriteLine strKey & "=" & strValue
			End If
	End If

	objOrgIni.Close
	objNewIni.Close

	' Delete old INI file
	objFSO.DeleteFile strFilePath, True
	' Rename new INI file
	objFSO.MoveFile strTempFile, strFilePath

	Set objOrgIni = Nothing
	Set objNewIni = Nothing
	Set objFSO    = Nothing
	Set wshShell  = Nothing
End Sub
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

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

Dim TCS
Set TCS = CreateObject("TCScript.Helper")

ini="%COMMANDER_PATH%\SOFT\Media Player Classic Home Cinema\mpc-hc.ini"
section="кто бы знал название секции?"
key="DSVidRen"
value=3

TCS.INIWrite ini, section, key, value
Set TCS = Nothing
WScript.Quit
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Другиии! Верните Batya-ю!
2Lev, в его варианте можно одним скриптом творить, меняя лишь циферки в параметрах кнопок - очень удобно.
[Settings]
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

ackep
У кнопки в строке "Параметры" символ "%" нужно задваивать, т.к. он используется для спец. параметров %L, %P, %N и т.п.:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\PLUGINS\vbs\Subtitles.vbs
"%%COMMANDER_PATH%%\SOFT\Media Player Classic Home Cinema\mpc-hc.ini" "DSVidRen=3" "DSVidRen=5"
%COMMANDER_PATH%\ICO\2.ico
Субтитры [VMR-7 (renderless)]

0
-1
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Просто переключалка туда-обратно

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

Dim TCS
Set TCS = CreateObject("TCScript.Helper")

ini="%COMMANDER_PATH%\SOFT\Media Player Classic Home Cinema\mpc-hc.ini"
section="Settings"
key="DSVidRen"

value = TCS.INIRead (ini, section, key)
If value=3 Then value=5 Else value=3
TCS.INIWrite ini, section, key, value
Set TCS = Nothing
WScript.Quit
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Batya писал(а):используем vbs:
Код:
'=============================================
' Замена текста в файле
Придумал полезное применение своему скрипту:
TOTALCMD#BAR#DATA
"%Commander_Path%\Utils\WHS\ReplaceText.vbs" "%Commander_Path%\wincmd.ini" "%Commander_Path%"
"%%Commander_Path%%"
%Commander_Path%\WCMICONS.DLL
Замена путей в wincmd.ini


-1
Путь к скрипту (зелёным цветом) указываем свой.
Приведённая кнопка в файле wincmd.ini подставляет переменную %Commander_Path% вместо абсолютного пути к этой папке. Весьма удобно, на мой взгляд, если периодически нажимать эту кнопку.
Нет, я не сплю. Я просто медленно моргаю.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Batya писал(а):Придумал полезное применение своему скрипту
Спасибо, пригодилось. Сначала не получилось: скрипт пытался найти и заменить в ini-файле "C:\Wincmd", а там были строки с "C:\wincmd". После того как заменил в скрипте бинарное сравнение (vbBinaryCompare = 0) на текстовое (vbTextCompare = 1) - всё заработало как мне было надо.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

sa писал(а):После того как заменил в скрипте бинарное сравнение (vbBinaryCompare = 0) на текстовое (vbTextCompare = 1) - всё заработало как мне было надо.
Логично. Изменил скрипт.
Нет, я не сплю. Я просто медленно моргаю.
Den_Klimov
Сообщения: 207
Зарегистрирован: Пт ноя 03, 2006 11:27
Откуда: Ukraine.Kiev

Сообщение Den_Klimov »

А если требуется зменить сразу несколько строк (чаще всего в wincmd.ini)?
А если сразу целую секцию целиком?
А если требуется по завершении изменения перезагрузить Тотал (насколько знаю он не подхватит изменения в wincmd.ini без перезагрузки?)?

Собственно без всяких "если". ТРЕБУЕТСЯ.
Вот кто бы помог, соорудил скриптик? Batya? :)
Ответить