1 (изменено: The_Immortal, 2011-02-14 03:06:07)

Тема: VBS: Запись в файл инвертированным образом, конкатенация строк

Ребят, у меня идет обычная запись в файл путем добавления:

Dim fso, tf, time
Set fso = CreateObject("Scripting.FileSystemObject")
Const ForAppending = 8
Set tf = fso.OpenTextFile("c:\testfile.txt", ForAppending, True)
time = Now()
tf.Write(time)
tf.WriteLine(" Не удалось запустить процесс.")

По-прежнему хотелось бы узнать как одной строкой вот это можно оформить? (Не знаю, как преобразовать переменную time в строку, чтобы осуществить конкатенацию)

tf.Write(time)
tf.WriteLine(" Не удалось запустить процесс.")

На выходе в файле получается что-то типа этого:
13.02.2011 15:38:53 Не удалось запустить процесс.
14.02.2011 15:38:53 Не удалось запустить процесс.
15.02.2011 15:38:53 Не удалось запустить процесс.
и т.д.

Не подскажите, как можно сделать, чтобы последняя строчка была на самом верху (то есть, чтобы происходила обратная запись в файл -все новое наверх)? Вот так:
и т.д.
15.02.2011 15:38:53 Не удалось запустить процесс.
14.02.2011 15:38:53 Не удалось запустить процесс.
13.02.2011 15:38:53 Не удалось запустить процесс.

Спасибо!


Так, с конкатенацией разобрался, оказывается надо было всего лишь написать:

tf.WriteLine(time & " Не удалось запустить процесс.")

Но на эту тему созрел еще один вопрос: пусть на входе есть 2 строковые переменные "Люблю " и "Мир!". На выходе надо получить "Люблю Мир!".
Я пытался сделать следующим образом:

love = """Люблю """
what = """Мир!"""
res =  l & m
MsgBox res

На выходе у меня получается: "Люблю ""Мир!"
Если же сделать так:

love = "Люблю "
what = "Мир!"
res = """l & m"""
MsgBox res

То оператор & и переменные l,m будут восприниматься как обычные символы, и на выходе получится: "l & m".
А вот как можно загнать эти слова под общие кавычки? И реально ли это осуществить?

2

Re: VBS: Запись в файл инвертированным образом, конкатенация строк

The_Immortal пишет:

То оператор & и переменные l,m будут восприниматься как обычные символы, и на выходе получится: "l & m".
А вот как можно загнать эти слова под общие кавычки? И реально ли это осуществить?

Так?

love = "Люблю "
what = "Мир!"
res =  """" & love & what & """"
MsgBox res
Нас невозможно сбить с пути, нам пофигу куда идти.

3

Re: VBS: Запись в файл инвертированным образом, конкатенация строк

The_Immortal пишет:

Не подскажите, как можно сделать, чтобы последняя строчка была на самом верху (то есть, чтобы происходила обратная запись в файл -все новое наверх)?

Никак. Только читать весь файл в переменную, закрывать файл, открывать его для записи, писать новую строку, затем старое содержимое файла из переменной, закрывать файл. Соответственно — для сколько-нибудь значимых объёмов текстового файла сие мало применимо.

Именно поэтому серьёзные логи во-первых, бинарные, во-вторых — являются базой данных того или иного формата. Запись в них всё равно идёт в конец файла, но база данных позволяет манипулировать с ними достаточно произвольным образом, например, извлечь N последних записей, отсортировать записи в порядке, обратном добавлению и т.п.

В принципе, используя OLEDB, можно работать и с текстовым файлом, как с базой данных: VBScript: работа с большими текстовыми файлами

The_Immortal пишет:

пусть на входе есть 2 строковые переменные "Люблю " и "Мир!". На выходе надо получить "Люблю Мир!".

love = "Люблю "
what = "Мир!"

WScript.Echo """" & love & " " & what & """"
"Люблю  Мир!"

The_Immortal, ещё раз: один вопрос — одна тема. Последующие темы с несколькими вопросами внутри будут мною закрываться.

4 (изменено: DnsIs, 2011-02-14 09:52:52)

Re: VBS: Запись в файл инвертированным образом, конкатенация строк

Способов добавления строк в начала файла наверное тьма, могу предложить парочку:

Берем файл лога, читаем его весь в память, добавляем к нему новую строку и результат снова записываем в файл.
Из минусов вижу: При огромном файле, и небольшом объеме оперативной памяти, могут возникнуть проблемы. Как вариант, можно не читать весь файл целиком, а читать его построчно => нужно писать циклы. Опять же при внезапном прерывании скрипта, данные теряются, поэтому лучше организовывать через временный файл ИМХО (я сделал без временного).

'Способ 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("c:\testfile.txt", 1)
buffer = f.ReadAll()
f.Close()
Set f = fso.OpenTextFile("c:\testfile.txt", 2, True)
s = Now() & " Не удалось запустить процесс."
f.WriteLine(s)
f.WriteLine(buffer)
f.Close()

Как вариант можно скинуть новую строчку во временный файл. Затем воспользоваться стандартной коммандой Windows - copy, для склеивания файлов. Думаю работать будет быстрее (не утверждаю) чем заниматься чтением файла построчно, и записью. Потом проверить результат копирования (в примере я не делал проверки), удалить временные файлы и переименовать готовый.

'Способ 2
Set fso = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
Set f = fso.CreateTextFile("c:\tmp.txt")
s = Now() & " Не удалось запустить процесс."
f.WriteLine(s)
f.Close()

WshShell.Run "cmd.exe /C copy c:\tmp.txt + c:\testfile.txt c:\out.txt /B", 0, True
fso.DeleteFile "c:\tmp.txt"
fso.DeleteFile "c:\testfile.txt"
Set f = fso.GetFile ("c:\out.txt")
f.Name = "testfile.txt"

Ну вот как то так.

Нас невозможно сбить с пути, нам пофигу куда идти.