Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Использование имени файла для правки в теле файла.

Ответить
Настройки темы
CMD/BAT - Использование имени файла для правки в теле файла.

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:40, 15-07-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата xkafkax:
Как заставить сверять имя файла со строкой в конфиге »
Зависит от кодировки файла, от вида строки со «ссылкой на папку профайла».

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

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

Отправлено: 11:53, 15-07-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать



Пожалуйста...user1.zip
Собственно , ASCII DOS

Отправлено: 14:55, 15-07-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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
'=============================================================================

Можете просто перетаскивать файл конфигурации на скрипт.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:11, 16-07-2013 | #4


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось xkafkax, 16-07-2013 в 11:07.


Отправлено: 10:56, 16-07-2013 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата xkafkax:
Там проблема в том, что этих файлов не один и не два.. »
Сколько? Известны их имена/пути?

Отправлено: 19:00, 16-07-2013 | #6


Аватара для sunnykey

Пользователь


Сообщения: 124
Благодарности: 47

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
#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:, проверяет все конфиги и перезаписывает

-------
cmd умри, powershell живи=)
Powershel 4.0 microsoft.com/ru-ru/download/details.aspx?id=40855


Отправлено: 18:57, 19-07-2013 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата sunnykey:
Ковыряет диск C:, проверяет все конфиги и перезаписывает »
И Вам скажу: не делайте так.

Отправлено: 20:52, 19-07-2013 | #8


Аватара для sunnykey

Пользователь


Сообщения: 124
Благодарности: 47

Профиль | Отправить PM | Цитировать


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

-------
cmd умри, powershell живи=)
Powershel 4.0 microsoft.com/ru-ru/download/details.aspx?id=40855


Отправлено: 11:06, 20-07-2013 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Использование имени файла для правки в теле файла.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Запуск bat-файла от имени админа.Как сделать каталог этого bat-файла текущим?? axmed0207 Скриптовые языки администрирования Windows 1 19-01-2012 06:14
CMD/BAT - [решено] Созд.*.txt по имени файла, с перемещением *.txt и файла в папку с именем файла. OSArev Скриптовые языки администрирования Windows 2 30-01-2011 11:58
Запуск командного файла с переменной в теле saavaage AutoIt 1 27-08-2010 13:21
Как получить имя текущего пользователя для использования его в имени файла Denchik Автоматическая установка Windows 2000/XP/2003 1 25-01-2006 22:33




 
Переход