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 

Single Post  Topic: Скрипт, меняющий значение строки в INI-файле 
Author Message
mf-zl



PostPosted: 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
View user's profile Send private message Visit poster's website


Powered by phpBB © 2001, 2005 phpBB Group