Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Скрипт, меняющий значение строки в INI-файле
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
ask-rus



Joined: 10 Nov 2009
Posts: 2076
Location: Russian Federation

Post (Separately) Posted: Thu Feb 25, 2010 17:29    Post subject: Скрипт, меняющий значение строки в INI-файле Reply with quote

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

на
Code:
DSVidRen=5


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

Это мне нужно, чтобы не лезть в настройки Media Player Classic-а. (меняем рендер для запуска видео с субтитрами). Установлю скрипты как кнопки на панели.
_________________
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Feb 25, 2010 18:44    Post subject: Reply with quote

Если не париться с ini-структурой, используем vbs:
Code:
'=============================================
' Замена текста в файле
'
' Параметры:
' {файл} {текст для поиска} {текст для замены}
'=============================================
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

Пример параметров:
Code:
"C:\Путь\к\ини\файлу\mpc-hc.ini" "DSVidRen=3" "DSVidRen=5"

_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Wed Mar 03, 2010 01:33; edited 2 times in total
Back to top
View user's profile Send private message
ask-rus



Joined: 10 Nov 2009
Posts: 2076
Location: Russian Federation

Post (Separately) Posted: Thu Feb 25, 2010 20:44    Post subject: Reply with quote

Batya, спасибо, всё работает!
_________________
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Back to top
View user's profile Send private message
ask-rus



Joined: 10 Nov 2009
Posts: 2076
Location: Russian Federation

Post (Separately) Posted: Fri Feb 26, 2010 12:37    Post subject: Reply with quote

Снова прийти к портабельности. Прописал в команде и параметрах %COMMANDER_PATH%, увы ...
Quote:
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

_________________
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Feb 26, 2010 15:29    Post subject: Reply with quote

ackep wrote:
Снова прийти к портабельности.

Сделал.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
ask-rus



Joined: 10 Nov 2009
Posts: 2076
Location: Russian Federation

Post (Separately) Posted: Fri Feb 26, 2010 15:46    Post subject: Reply with quote

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

Сделал.

Code:
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

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

---------------------------
ОК
---------------------------

_________________
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Back to top
View user's profile Send private message
mf-zl



Joined: 21 Aug 2005
Posts: 71
Location: BLR

Post (Separately) Posted: Fri Feb 26, 2010 19:50    Post subject: Reply with quote

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

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

Code:
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
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Fri Feb 26, 2010 20:41    Post subject: Reply with quote

Code:
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
Back to top
View user's profile Send private message
ask-rus



Joined: 10 Nov 2009
Posts: 2076
Location: Russian Federation

Post (Separately) Posted: Fri Feb 26, 2010 20:56    Post subject: Reply with quote

Другиии! Верните Batya-ю!
2Lev, в его варианте можно одним скриптом творить, меняя лишь циферки в параметрах кнопок - очень удобно.
Quote:
[Settings]

_________________
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Feb 26, 2010 21:12    Post subject: Reply with quote

ackep
У кнопки в строке "Параметры" символ "%" нужно задваивать, т.к. он используется для спец. параметров %L, %P, %N и т.п.:
Code:
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

_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Fri Feb 26, 2010 21:52    Post subject: Reply with quote

Просто переключалка туда-обратно
Code:
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
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Mar 02, 2010 18:43    Post subject: Reply with quote

Batya wrote:
используем vbs:
Код:
'=============================================
' Замена текста в файле

Придумал полезное применение своему скрипту:
Quote:
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% вместо абсолютного пути к этой папке. Весьма удобно, на мой взгляд, если периодически нажимать эту кнопку.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2571

Post (Separately) Posted: Tue Mar 02, 2010 23:40    Post subject: Reply with quote

Batya wrote:
Придумал полезное применение своему скрипту
Спасибо, пригодилось. Сначала не получилось: скрипт пытался найти и заменить в ini-файле "C:\Wincmd", а там были строки с "C:\wincmd". После того как заменил в скрипте бинарное сравнение (vbBinaryCompare = 0) на текстовое (vbTextCompare = 1) - всё заработало как мне было надо.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Mar 03, 2010 01:35    Post subject: Reply with quote

sa wrote:
После того как заменил в скрипте бинарное сравнение (vbBinaryCompare = 0) на текстовое (vbTextCompare = 1) - всё заработало как мне было надо.

Логично. Изменил скрипт.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Den_Klimov



Joined: 03 Nov 2006
Posts: 207
Location: Ukraine.Kiev

Post (Separately) Posted: Tue May 11, 2010 13:15    Post subject: Reply with quote

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

Собственно без всяких "если". ТРЕБУЕТСЯ.
Вот кто бы помог, соорудил скриптик? Batya? Smile
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group