VbScript для обрезки конечных каналов из файла на 35 каналах

Итак, я изначально писал это в пакетном режиме, но количество токенов, используемых с ASCII, было слишком маленьким, я думаю, это позволяет только 26, а мне нужно, чтобы в моем выходном файле осталось 35 каналов.

Я новичок в VBScript, но в основном я хочу, чтобы он читался в исходном файле, творил магию, чтобы выбрать первый символ в файле до последних 35 каналов (и все, что между ними, даже в пространстве между двумя каналами пусто) . Затем выведите этот файл в другой файл, сохранив при этом целостность оригинала.

Вот мой код:

' **************
' ** Anthony B.
' **************
' ** PipeDropper
' **************
Dim WshShell, oExec
Set wshShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objInputFile = objFSO.OpenTextFile("C:\Users\aborgetti\Desktop\Pipe Delimiter Project\oauthrn.cms",1)
Set objOutputFile = objFSO.OpenTextFile("C:\Users\aborgetti\Desktop\Pipe Delimiter Project\output.txt",8,True)

Do until objInputFile.AtEndofStream
    strcomputer = objInputFile.ReadLine
    strCommand = "dsquery computer -name " & strComputer
    Set oExec = WShShell.Exec(strCommand)
    If (oExec.Status = 0) Then
        If (oExec.stdOut.ReadAll = "") Then
            objOutputFile.WriteLine(strComputer)
        End If
    End If
Loop

objInputFile.Close
objOutputFile.Close

Проблемы

Эта строка Set oExec = WShShell.Exec(strCommand) говорит, что не может найти указанный файл... так что я не уверен, почему это плохо.

И тогда, куда мне идти отсюда?

Заранее спасибо!

ОБНОВЛЕНИЕ

Вот строка, которая будет в файле, обычно где-то от 10 до 100 раз...

RE|922124607|1 |KimV|HOS99999|Y|N|2014-04-02 15:49:14|2014-04-02 15:49:58|Y|2014-04-02 00:00:00|R9815|01|1 |2014-04-02 00:00:00|493.90||||2016-04-02|N||HOS99999|||06|PROV99999|2014-04-02 15:48:20|2014-04-02||R9815|2014-04-02 00:00:00|2016-04-02 00:00:00||||||98960|06 |08|6|6|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||02|||||||Z4|2014-04-02 15:49:58|04|001|01|***|PMER|***|***|2013-08-01||||||||||||||||||||||||||||||||||||||||

Все после последнего 01 нужно удалить... так что:

|***|PMER|***|***|2013-08-01||||||||||||||||||||||||||||||||||||||||

Должно быть:

Start of line ...  |***|PMER|***|***|2013-08-01 

person Hituptony    schedule 04.04.2014    source источник
comment
Можете ли вы привести пример того, как выглядит строка и что вы хотели бы из нее извлечь?   -  person shahkalpeshp    schedule 04.04.2014
comment
я не вижу ничего в приведенном выше, что даже пытается проверить символ, чтобы увидеть, является ли он трубой. Вы на 90% готовы... продолжайте. Вы читаете строку, поэтому вместо этого перебираете строку (или вместо этого просто читаете символ) и проверяете, является ли каждый символ вертикальной чертой, увеличивая счетчик по мере продвижения.   -  person Cor_Blimey    schedule 05.04.2014
comment
Также из вашего второго вопроса я не понимаю, как это связано с первым? Это не имеет ничего общего с количеством | персонажи прочитаны до сих пор. Если это не удается, то это связано с переданной командой или, скорее, с тем, что strComputer предназначен для команды dquery, а не с тем, что передается.   -  person Cor_Blimey    schedule 05.04.2014
comment
@Cor_Blimey Смотрите мое обновление ... Я знаю, что даже не читал в строке, но мне интересно это сделать ... спасибо за ваш вклад и время!   -  person Hituptony    schedule 05.04.2014


Ответы (1)


Я сомневаюсь, что твоя проблема

  1. имеет какое-то отношение к трубам
  2. опубликованный вами код - это код, вызвавший ошибку

Есть два способа получить ошибку 424 «Требуется объект» для такого оператора, как

Set a = b.c(d)

Первый (и очевидный): b не является объектом. Второе: возвращаемое значение b.c(d) не является объектом.

Ваш код сжат:

Set wshShell = CreateObject("WScript.Shell")
strCommand = "hostname"
Set oExec = WShShell.Exec(strCommand)
WScript.Echo oExec.Stdout.Readline()

работает без проблем. Небольшое изменение:

Set wshShell = CreateObject("WScript.Shell")
strCommand = "hostname"
Set oExec = WShShel1.Exec(strCommand)
WScript.Echo oExec.Stdout.Readline()

терпит неудачу с «Требуется объект». Вы замечаете опечатку? Почему бы не позволить «Option Explicit» помочь вам:

Option Explicit
Dim wshShell   : Set wshShell = CreateObject("WScript.Shell")
Dim strCommand : strCommand = "hostname"
Dim oExec      : Set oExec = WShShel1.Exec(strCommand)
WScript.Echo oExec.Stdout.Readline()

выход:

...\22871772.vbs(4, 18) Microsoft VBScript runtime error: Variable is undefined: 'WShShel1'

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

Option Explicit
Dim wshShell   : Set wshShell = CreateObject("WScript.Shell")
Dim strCommand : strCommand = "hostname"
'...
wShSheLL = "oops"
'...
Dim oExec      : Set oExec = WShShell.Exec(strCommand)
WScript.Echo oExec.Stdout.Readline()

снова вылетает с ошибкой 424.

Обновите каналы:

Я бы выбрал Split() (со счетчиком, установленным на #pipes you want + 1), чтобы справиться с задними каналами:

>> n = 8 + 1
>> s = "|abc123|1*|004|**gobbligook|001|%|2014-01-01|||||||||||||"
>> a = Split(s, "|", n)  ' <-- 9th elm get all the junk
>> WScript.Echo UBound(a)
>> a(n - 1) = "" ' <-- zap the junk
>> WScript.Echo Join(a, "|")
>>
8
|abc123|1*|004|**gobbligook|001|%|2014-01-01|

Чтобы удалить хвост |, RegExp кажется более подходящим:

>> set r = New RegExp
>> r.Pattern = "\|+$"
>> WScript.Echo r.Replace(s, "")
>>
|abc123|1*|004|**gobbligook|001|%|2014-01-01
person Ekkehard.Horner    schedule 04.04.2014
comment
отличный ответ, за исключением того, что я не уверен в использовании Split. Что, если, скажем, последняя партия из 23 труб (из указанных 35 партий труб) попадает в... последнюю партию? Казалось, что вопрос касается не только одной «тянущейся» трубы. Я думаю, что было бы лучше использовать Stream.Read для проверки каждого символа и соответствующего увеличения счетчика канала. Тем не менее, 2/3 вашего ответа являются золотыми и действительно хорошим примером того, почему Option Explicit вообще не должно быть «вариантом». - person Cor_Blimey; 05.04.2014
comment
редактировать: я думаю, что первая часть вопроса, кажется, о каналах, но после кода OP, похоже, речь идет о чем-то совершенно другом. Так что +1 за то, что сделал голову или хвост;) - person Cor_Blimey; 05.04.2014
comment
Код такой, какой он есть, потому что я никогда раньше не кодировал VBscript. Сегодня был первый день, когда я даже запустил VBscript. Мой код - это мой предварительный запуск, чтобы заставить vb что-то сделать. Хотя в настоящее время это не относится к вопросу о трубах, проблема с трубами - это то, что я в конечном итоге хочу, чтобы код делал. Спасибо - person Hituptony; 06.04.2014