Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Использование имени файла для правки в теле файла. (http://forum.oszone.net/showthread.php?t=264328)

xkafkax 15-07-2013 11:40 2184845

Использование имени файла для правки в теле файла.
 
Доброго дня, проблема следующая:
Есть конфигурационные файлы - user1.cfg , user2.cfg , user3.cfg .. и т.п.
Внутри файлов есть ссылка на папку профайла, соответственно в user1.cfg - 'c:\path\user1'.
Иногда эта ссылка не совпадает и в user1.cfg может оказаться 'c:\path\user3'.
Как заставить сверять имя файла со строкой в конфиге,и в случае отличия подставлять нужное имя, из имени файла?

Iska 15-07-2013 11:53 2184858

Цитата:

Цитата xkafkax
Как заставить сверять имя файла со строкой в конфиге »

Зависит от кодировки файла, от вида строки со «ссылкой на папку профайла».

Цитата:

Цитата xkafkax
и в случае отличия подставлять нужное имя, из имени файла? »

Ответ будет тот же, что и выше.

Упакуйте образец конфигурационного файла в архив и выложите сюда, либо на RGhost.

xkafkax 15-07-2013 14:55 2184958

Вложений: 1
Пожалуйста...Файл 101626
Собственно , ASCII DOS

Iska 16-07-2013 06:11 2185329

xkafkax, то есть мы должны заменить последний элемент пути в параметрах «OutputFilesDirectory»/«TmpFilesDirectory» на базовое имя конфигурационного файла, так?

На WSH:
читать дальше »
Код:

Option Explicit

Dim strConfigFileName

Dim objFSO
Dim strContent


If WScript.Arguments.Count = 1 Then
        strConfigFileName = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FileExists(strConfigFileName) Then
                With objFSO.OpenTextFile(strConfigFileName)
                        strContent = StrConvert(.ReadAll(), "windows-1251", "cp866")
                        .Close
                End With
               
                With WScript.CreateObject("VBScript.RegExp")
                        .IgnoreCase = True
                        .Global    = True
                        .MultiLine  = True
                        .Pattern    = "^( *)(OutputFilesDirectory|TmpFilesDirectory)(=.+\\)(.+)(\\\r)$"
                       
                        If .Test(strContent) Then
                                strContent = .Replace(strContent, "$1$2$3" & objFSO.GetBaseName(strConfigFileName) & "$5")
                        End If
                End With
               
                With objFSO.CreateTextFile(strConfigFileName)
                        .Write StrConvert(strContent, "cp866", "windows-1251")
                        .Close
                End With
        Else
                WScript.Echo "Config file [" & strConfigFileName & "] not found."
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: wscript.exe " & WScript.ScriptName & " <Config file>"
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
' HKEY_CLASSES_ROOT\MIME\Database\Charset
' cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
'=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
        Const adTypeText      = 2
        Const adModeReadWrite = 3
       
       
        With WScript.CreateObject("ADODB.Stream")
                .Type      = adTypeText
                .Mode      = adModeReadWrite
               
                .Open
               
                .Charset  = strSourceCharset
                .WriteText strText
               
                .Position  = 0
                .Charset  = strDestCharset
                StrConvert = .ReadText
               
                .Close
        End With
End Function
'=============================================================================


Можете просто перетаскивать файл конфигурации на скрипт.

xkafkax 16-07-2013 10:56 2185395

Там проблема в том, что этих файлов не один и не два..

UPD: Спасибо, щас разберусь со скриптом. просто сделаю батник,чтоб перебирал все конфиг файлы и травил на них скрипт.

Iska 16-07-2013 19:00 2185657

Цитата:

Цитата xkafkax
Там проблема в том, что этих файлов не один и не два.. »

Сколько? Известны их имена/пути?

sunnykey 19-07-2013 18:57 2187441

Код:

#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
function ConvertTo-Encoding ([string]$From, [string]$To) {
    Begin {
        $encFrom=[System.Text.Encoding]::GetEncoding($from)
        $encTo=[System.Text.Encoding]::GetEncoding($to)
    }
    Process {
        $bytes=$encTo.GetBytes($_)
        $bytes=[System.Text.Encoding]::Convert($encFrom,$encTo,$bytes)
        $encTo.GetString($bytes)
    }
}

$FileList=Get-ChildItem -Path "с:\*" -Include "*.cfg" -Recurse
foreach($el in $FileList) {
    $outFile=""
    $str=""
    $CurFile=Get-Content $el | ConvertTo-Encoding cp866 windows-1251
    $CurFile | % {
        if (($_ | Select-String -Pattern "OutputFilesDirectory","TmpFilesDirectory" -AllMatches) -eq $null) {
            $str=$_+"`n"
        } elseif ($_.ToString().SubString($_.ToString().Length-6,5) -ne $el.Name) {
            $str=$_.ToString().SubString(0,$_.ToString().Length-6)+$el.Name.TrimEnd(".cfg")+"\`n"
        } else {
            $str=$_+"`n"
        }
    $outFile+=$str
    }
    if ($CurFile -eq $outFile) {
        "файлы равны"
        Continue
    }
    if (Test-Path -Path $el) {
        Remove-Item -Path $el -Force
    }
    $file=New-Object System.IO.StreamWriter((New-Object System.IO.FileStream($el,[IO.FileMode]::OpenOrCreate)),[Text.Encoding]::GetEncoding("cp866"))
    $file.Write($outFile)
    $file.Close()
}

Ковыряет диск C:, проверяет все конфиги и перезаписывает

Iska 19-07-2013 20:52 2187533

Цитата:

Цитата sunnykey
Ковыряет диск C:, проверяет все конфиги и перезаписывает »

И Вам скажу: не делайте так.

sunnykey 20-07-2013 11:06 2187727

Цитата Iska:
И Вам скажу: не делайте так. »
Само собой;) Я же уверен, что TS конфиги хранит в отдельной папке, а не в корне системного диска


Время: 02:31.

Время: 02:31.
© OSzone.net 2001-