Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] Копирование текста из другога файла в определённую строчку

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


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

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


Здравствуйте.
Решила написать себе небольшой скрипт по работе с текстом, но не хватает знаний.
Код: Выделить весь код
ssed.exe -e "4,703d" "D:\compilation\template\Web Site\Site.xml" > "D:\compilation\template\Web Site\output.xml"
del "D:\compilation\template\Web Site\Site.xml"
rename "D:\compilation\template\Web Site\output.xml" Site.xml
Удалить нужные строки получается, а вот как вставить новый текст не смогла найти информацию...
Как можно вставить многострочный текст (порядка 800 строк) из другого файла в известный номер строки?
Грубо говоря, взять один файл и перенести всё что там есть в другой файл в номер строки начиная с 4, при этом сместив текст в исходном, но не удаляя его.
Пример кода текста
HTML код: Выделить весь код
<page> <name>index</name> <caption>Главная</caption> <pages /> <content> <caption>Главная</caption> <title><![CDATA[Главная страница]]></title> <position>0</position> <dateCreated>0001-01-01T00:00:00</dateCreated> <dateModified>2012-04-06T16:36:11.25+03:00</dateModified> <description>0</description> <keywords>0</keywords> <titleInBrowser>Главная</titleInBrowser> <showInHmenu>true</showInHmenu> <showInVmenu>true</showInVmenu> <showTitle>false</showTitle> </content> <serverInfo> <title><![CDATA[]]></title> <position d5p1:nil="true" xmlns:d5p1="http://www.w3.org/2001/XMLSchema-instance" /> <dateCreated>0001-01-01T00:00:00</dateCreated> <dateModified>0001-01-01T00:00:00</dateModified> <titleInBrowser /> <showInHmenu>true</showInHmenu> <showInVmenu>true</showInVmenu> <showTitle>false</showTitle> </serverInfo> </page>


Отправлено: 13:42, 28-05-2012

 

Ветеран


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

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


sweetpleasure, WSH Вам подойдёт?
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:56, 28-05-2012 | #2



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

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


Старожил


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

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


Например, как-то так:
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

Set File1=source1.txt
Set File2=source2.txt
Set TargetLine=4
Set Output=out.txt

Set i=0
For /F "usebackq delims=" %%A In ("%File1%") Do (
	Set /A i+=1
	Echo.%%A>>"%Output%"
	If !i!==%TargetLine% (
		For /F "usebackq delims=" %%A In ("%File2%") Do (Echo.%%A>>"%Output%")
	)
)
После четвертой строки первого файла вставится построчно содержимое второго файла, а после - остаток первого. Недостатки - циклом For игнорируются пустые строки, из-за EnableDelayedExpansion игнорируются все восклицательные знаки в тексте.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:57, 28-05-2012 | #3


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


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

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


Цитата Anonymоus:
После четвертой строки первого файла вставится построчно содержимое второго файла, а после - остаток первого. Недостатки - циклом For игнорируются пустые строки, из-за EnableDelayedExpansion игнорируются все восклицательные знаки в тексте.»
ой нет, восклицательные знаки там обязательны.

Цитата Iska:
WSH Вам подойдёт? »
Подойдёт)

Я просто думала, что на ssed так же просто, как и удалить, можно вставить текст.

Отправлено: 14:02, 28-05-2012 | #4


Ветеран


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

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


Цитата sweetpleasure:
Я просто думала, что на ssed так же просто, как и удалить, можно вставить текст. »
Может быть. Я с ним не работал.


Цитата sweetpleasure:
Подойдёт) »
Попробуйте так:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim strSourceFile
Dim strDestFile
Dim lngInsertPosition

Dim objFSO

Dim strSourceContent
Dim strDestContent

Dim strTempFile
Dim strBackupFile

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

If WScript.Arguments.Count <> 3 Then
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file> <Destination file> <Line number for insert>"
	WScript.Quit 1
End If

With objFSO
	strSourceFile = WScript.Arguments.Item(0)
	
	If Not .FileExists(strSourceFile) Then
		WScript.Echo "Source file [" & strSourceFile & "] not found."
		WScript.Quit 2
	End If
	
	strDestFile = WScript.Arguments.Item(1)
	
	If Not .FileExists(strDestFile) Then
		WScript.Echo "Destination file [" & strDestFile & "] not found."
		WScript.Quit 3
	End If
	
	If Not IsNumeric(WScript.Arguments.Item(2)) Then
		WScript.Echo "Line number must be a numeric value."
		WScript.Quit 4
	End If
	
	lngInsertPosition = CLng(WScript.Arguments.Item(2))
	
	If lngInsertPosition < 0 Then
		WScript.Echo "Line number can't be less than zero."
		WScript.Quit 5
	End If
	
	With .OpenTextFile(strSourceFile)
		strSourceContent = .ReadAll()
		.Close
	End With
	
	With .OpenTextFile(strDestFile)
		strDestContent = ""
		
		Do Until .AtEndOfStream
			If .Line <> lngInsertPosition Then
				strDestContent = strDestContent & .ReadLine() & vbCrLf
			Else
				strDestContent = strDestContent & strSourceContent & .ReadLine() & vbCrLf
			End If
		Loop
		
		.Close
	End With
	
	strTempFile = GetTemporaryName()
	
	With .CreateTextFile(strTempFile)
		.Write strDestContent
		.Close
	End With
	
	strBackupFile = .BuildPath(.GetParentFolderName(strDestFile), .GetBaseName(strDestFile) & ".bak")
	
	If .FileExists(strBackupFile) Then
		.DeleteFile strBackupFile
	End If
	
	.MoveFile strDestFile, strBackupFile
	.CopyFile strTempFile, strDestFile
	.DeleteFile strTempFile
End With

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

'=============================================================================
' Серый форум / vbscript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
	Const TemporaryFolder = 2
	
	Dim strTempName
	
	With WScript.CreateObject("Scripting.FileSystemObject")
		Do
			strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
		Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
	End With
	
	GetTemporaryName = strTempName
End Function
'=============================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:12, 28-05-2012 | #5


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


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

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


А где можно задать номер строки, с которой начинать, а также файл с которого берём и куда вставляем?
Я образно сказала с 4... а так таких вставок будет несколько. Я просто продублирую скрипт.

Если я правильно поняла, то вот эта строка
Код: Выделить весь код
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file> <Destination file> <Line number for insert>"
А в каком формате туда вставлять?

Так?
Код: Выделить весь код
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ "D:\compilation\template\Web Site\put.xml" "D:\compilation\template\Web Site\output.xml" 4"

Последний раз редактировалось sweetpleasure, 28-05-2012 в 15:30.


Отправлено: 15:24, 28-05-2012 | #6


Ветеран


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

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


Запускаете командную строку, в ней пишете:
Код: Выделить весь код
cscript.exe //nologo "<Путь\SomeScript.vbs" "Путь\Файл, содержимое которого надо вставить.xml>" "<Путь\Файл, в который надо вставить содержимое первого файла.xml>" <Номер строки, начиная с которой будет вставлено содержимое первого файла>
Например:
Код: Выделить весь код
cscript.exe //nologo "c:\My Scripts\SomeScript.vbs" "C:\Песочница\0009\Source.xml" "C:\Песочница\0009\Destination.xml" 4
Для текущего каталога пути, разумеется, можно опускать.

P.S. Пример рассчитан на одну вставку за раз.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:35, 28-05-2012 | #7


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


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

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


Огромное спасибо!
А можно же вставлять в середину bat?
т.е. выполняется bat, доходит до строки
Код: Выделить весь код
cscript.exe //nologo "c:\My Scripts\SomeScript.vbs" "C:\Песочница\0009\Source.xml" "C:\Песочница\0009\Destination.xml" 4
останавливается, выполняет скрипт, а после продолжает выполняться bat. Так ведь будет работать?

Отправлено: 15:51, 28-05-2012 | #8


Ветеран


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

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


sweetpleasure, можно. Работать будет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:03, 28-05-2012 | #9


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


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

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


Всё отлично работает!
Я хотела бы ещё уточнить, возможно ли запустить bat, перетащив на него файл (drag and drop)?

Я использую
Код: Выделить весь код
7z x *.zip -oD:\compilation\template
он работает, когда только файл zip рядом с bat-файлом...конечно можно прописать путь и тогда он начнёт работать из прописанной директории и при этом будет распаковывать все zip в этой директории. Можно прописать название zip, но архивы имеют разные имена.

Пробовала даже в Bat To Exe Converter делать exe, но всё равно не получается перетаскиванием нужного файла на ярлык запустить его обработку.

Если я верно понимаю, то нужно вместо * вставить какое-то значение, которое будет передаваться при перетаскивании объекта.

Нашла вот такой код, но не знаю насколько он эффективен
Код: Выделить весь код
Suddenly the drag-drop has stopped working. How to fix this problem?

Click Start, Run and type these commands:

    cmd /c ftype batfile="%1" %*
    cmd /c assoc .bat=batfile
    regsvr32 /i shell32.dll
не решилась экспериментировать с shell32.dll

Последний раз редактировалось sweetpleasure, 28-05-2012 в 19:55.


Отправлено: 19:43, 28-05-2012 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Поиск и копирование текста из файла KaKTuZ49 Скриптовые языки администрирования Windows 2 03-11-2011 13:38
[решено] Записать данные из ИНИ файла в одну строчку Centrinar AutoIt 1 18-03-2011 00:34
Как с помощью FileReadLine прочитать последнюю строчку файла? sashadeg AutoIt 10 01-02-2010 21:33
CMD/BAT - [решено] Как прочесть из файла .txt только первую строчку текста. Sdib121 Скриптовые языки администрирования Windows 6 15-08-2009 14:26
копирование текста volin Хочу все знать 10 08-01-2007 00:18




 
Переход