0

我正在尝试从 sObj.txt 读取文本并在 MPadd.txt 中写入一些前缀文本。sObj.txt 包含一条垂直的单词(每行 1 个),并且该文件中的行数是可变的(由用户确定)。这是我正在使用的脚本:

Dim commands() =
    {
        "stmotd -a {0}",
        "stmotd -b 15 {0}"
    }


Dim counter As Integer = 1
Dim objLines = File.ReadAllLines("C:\temp\sObj.txt")

Using SW As New IO.StreamWriter("c:\temp\MPadd.txt", True)
    For Each line in objLines
        SW.WriteLine(string.Format(commands(counter), line))
        counter += 1
    Next
End Using

但是在执行时它返回错误“IndexOutOfRangeException 未处理”也表示索引超出了数组的范围。请帮忙。

4

3 回答 3

3

.NET 中的数组是从零开始的。

利用

Dim counter As Integer = 0

显然,objLines可能包含不超过两行。

commands也许你的意思是为每一行发射所有?

For Each line in objLines
    For Each cmd in commands
        SW.WriteLine(string.Format(cmd, line))
    Next
Next

编辑:

Dim joined_lines = File.ReadAllText("C:\temp\sObj.txt").Replace(vbNewLine, " ")

Using SW As New IO.StreamWriter("c:\temp\MPadd.txt", True)
    For Each cmd In commands
        SW.WriteLine(String.Format(cmd, joined_lines))
    Next
End Using
于 2013-05-21T10:13:41.440 回答
0

数组“commands”中只有 2 个项目。当计数器值为 2 时,它会引发异常。我不确定您的要求,但您可以按如下方式修改代码:

Dim commands() =
    {
        "stmotd -a {0}",
        "stmotd -b 15 {0}"
    }


Dim counter As Integer = 0
Dim objLines = File.ReadAllLines("C:\temp\sObj.txt")
Using SW As New IO.StreamWriter("c:\temp\MPadd.txt", True)
      for Each line in objLines
      If counter > 1 Then
     counter = 0
      End If
      SW.WriteLine(string.Format(commands(counter), line))
      counter += 1
Next
End Using

如果你确定没有。对于命令数组中的项目,我建议您对项目索引进行硬编码,而不是使用计数器变量。

于 2013-05-21T10:20:30.430 回答
0

由于您的 commands 数组中只有两个项目,如果您从文件中导入超过两行,那么您将增加counter两次以上,因此您将尝试访问数组中不存在的项目,这表示这一行:

SW.WriteLine(string.Format(commands(counter), line))

会导致index out of range错误。.NET 中的数组也是基于 0 的,因此counter应该从 0 开始,除非您要排除objLines数组中的第一项

编辑:是的,要执行您在评论中提到的操作,您需要将其更改为以下内容:

Using SW As New IO.StreamWriter("c:\temp\MPadd.txt", True)
    For Each cmd in commands
        Dim strLine As New String

        For Each line in objLines
            strLine += " WIN" + line
        Next

        SW.WriteLine(String.Format(cmd, strLine.ToUpper().Trim()))
    Next
End Using

这会将数组中的所有项目附加到带有 WIN 前缀的单行:

stmotd -a WINFPH WINMAC WINPPC WINVPN 
stmotd -b 15 WINFPH WINMAC WINPPC WINVPN
于 2013-05-21T10:13:58.210 回答