2014-04-04 34 views
0

所以我最初是在批量写这个,但可用于ASCII的令牌数量太小了,我想它只允许26个,我需要35个管道留在我的输出文件。VbScript在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) 说,它无法找到真实指定的文件......所以我不知道为什么这是坏。

然后我该从哪里出发?

在此先感谢!

UPDATE

这里是一个行会的文件中,通常是从10到100倍的任何地方......最后的01后需要

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

一切去...所以:

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

应该是:

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

你可以举一个例子,看看你想要提取什么样的行吗? – shahkalpesh

+1

我没有看到上面的任何东西,甚至试图测试一个字符,看它是否是一个管道。你有90%...继续前进。你读这行代码,而是循环行(或者只是读一个字符),并检查每个字符是否是一个管道,随着你的增加一个计数器。 –

+0

另外从你的第二个问题,我不明白这是如何涉及到第一个?这与“|”的数量无关到目前为止阅读的字符如果它失败了,那么它是通过传入的命令来做的,或者说,无论什么“strComputer”是用于dquery命令还是传入的命令。 –

回答

2

我怀疑你的问题

  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() 

失败并显示“Object required”。你发现错字吗?为什么不让“选项显式”帮助你:

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

更新WRT在pipes

我会选择Split()(计数设为#pipes你想+ 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 
+0

谢谢你Ekkehard! – Hituptony

+0

很好的答案,除了我不太确定使用斯普利特。如果说最后一批23个管道(指定的35个管道批次中的一批)属于......最后一批?这个问题似乎并不仅仅是关于一个“尾随”管道。我认为使用'Stream.Read'读取每个字符测试并适当增加管道计数器可能会更好。然而,你的答案的2/3是金黄的,是一个很好的例子,说明为什么'Option Explicit'根本不应该是'Option'。 –

+0

编辑:我认为这个问题的第一部分似乎是关于管道,但在OP的代码之后,它似乎完全是关于别的东西。所以+1做它的头部或尾部;) –