VbScript用于修剪35个管道上的尾随管道

时间:2014-04-04 19:44:35

标签: windows vba vbscript windows-scripting

所以我最初是批量编写的,但是可用于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 

1 个答案:

答案 0 :(得分:2)

我怀疑你的问题

  1. 与管道有关
  2. 您发布的代码是导致错误的代码
  3. 有两种方法可以获得错误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。

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

    要删除|&#39; s的尾部,RegExp似乎更合适:

    >> set r = New RegExp
    >> r.Pattern = "\|+$"
    >> WScript.Echo r.Replace(s, "")
    >>
    |abc123|1*|004|**gobbligook|001|%|2014-01-01