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

Аватара пользователя
sweetpleasure

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

Сообщение sweetpleasure »

Здравствуйте.

Решила написать себе небольшой скрипт по работе с текстом, но не хватает знаний.



Код:

Код: Выделить всё

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>
Аватара пользователя
Guest

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

Сообщение Guest »

sweetpleasure, батник и так прекрасно распознает drag-n-drop, полный путь к файлу передается в переменной %1. Проблема в другом, батник стартует с рабочей директорией в профиле пользователя, что очень не удобно, если обвязка (архиватор, etc.) не прописана в Path.

В этом примере показано, как сменить рабочую директорию на ту, в которой находится батник, или ту, в которой находится перетягиваемый файл



Код:

Код: Выделить всё

@Echo Off
:: Рабочая директория. При drag-n-drop скрипт стартует с рабочей директорией
:: в %UserProfile%, что совсем не хорошо. Здесь можно выбрать, что будет являться
:: рабочей директорией: self - директория со скриптом, или target - директория с
:: перетягиваемым файлом
Set WorkDir=target
If Not "%~1"=="" (If %WorkDir%==target CD /D "%~dp1")
If Not "%~1"=="" (If %WorkDir%==self CD /D "%~dp0")
Echo Рабочая директория - [%CD%]
Echo Файл - [%~nx1]
Pause
Аватара пользователя
Guest

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

Сообщение Guest »

Цитата Anonymоus:



После четвертой строки первого файла вставится построчно содержимое второго файла, а после - остаток первого. Недостатки - циклом For игнорируются пустые строки, из-за EnableDelayedExpansion игнорируются все восклицательные знаки в тексте.
CMD/BAT - [решено] Копирование текста из другога файла в определённую строчку




ой нет, восклицательные знаки там обязательны.




Цитата Iska:



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




Подойдёт)



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

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

Сообщение sweetpleasure »

Цитата sweetpleasure:



Я просто думала, что на ssed так же просто, как и удалить, можно вставить текст.
CMD/BAT - [решено] Копирование текста из другога файла в определённую строчку




Может быть. Я с ним не работал.




Цитата sweetpleasure:



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




Попробуйте так:


читать дальше »

Код: Выделить всё

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
'=============================================================================
Аватара пользователя
Iska

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

Сообщение Iska »

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

Я образно сказала с 4... а так таких вставок будет несколько. Я просто продублирую скрипт.



Если я правильно поняла, то вот эта строка



Код:

Код: Выделить всё

WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """   "

А в каком формате туда вставлять?



Так?



Код:

Код: Выделить всё

WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ "D:\compilation\template\Web Site\put.xml" "D:\compilation\template\Web Site\output.xml" 4"
Аватара пользователя
sweetpleasure

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

Сообщение sweetpleasure »

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

Я образно сказала с 4... а так таких вставок будет несколько. Я просто продублирую скрипт.



Если я правильно поняла, то вот эта строка



Код:

Код: Выделить всё

WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """   "

А в каком формате туда вставлять?



Так?



Код:

Код: Выделить всё

WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ "D:\compilation\template\Web Site\put.xml" "D:\compilation\template\Web Site\output.xml" 4"
Аватара пользователя
Iska

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

Сообщение Iska »

Запускаете командную строку, в ней пишете:



Код:

Код: Выделить всё

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. Пример рассчитан на одну[/i] вставку за раз.
Аватара пользователя
sweetpleasure

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

Сообщение sweetpleasure »

Огромное спасибо!

А можно же вставлять в середину bat?

т.е. выполняется bat, доходит до строки



Код:

Код: Выделить всё

cscript.exe //nologo "c:\My Scripts\SomeScript.vbs" "C:\Песочница\0009\Source.xml" "C:\Песочница\0009\Destination.xml" 4

останавливается, выполняет скрипт, а после продолжает выполняться bat. Так ведь будет работать?
Ответить

Вернуться в «Скриптовые языки администрирования Windows»