1

我有下面的代码..如果我使用静态 strInputPath3 代码工作正常,但如果我使用 strInputPath3 代码错误,错误无效的过程调用或参数..有人可以告诉我我在这里做错了什么

strInputPath1 =  "C:\test" & "\" & "css" & "\" & "main.css"

strInputPath3 = "C:\test\css\main.css"


Set txsInput1 = FSO.OpenTextFile(strInputPath1, 1)
4

2 回答 2

6

如果您将 VBScript 可以用作字符串的内容提供给 .OpenTextFile,则该方法将尝试打开文件并可能引发“找不到文件”错误。

>> strInputPath1 =  "C:\test" & "\" & "css" & "\" & "main.css"
>> WScript.Echo strInputPath1
>> set f = goFS.OpenTextFile(strInputPath1,1)
>>
C:\test\css\main.css
Error Number:       76
Error Description:  Path not found

要获得“无效的过程调用”错误,您必须传递一些险恶的东西,例如 Empty 值:

>> strInputPath1 = Empty
>> set f = goFS.OpenTextFile(strInputPath1,1)
>>
Error Number:       5
Error Description:  Invalid procedure call or argument

这些事实使您很可能

  • 要么在变量 strInputPath1 的初始化和它在 .OpenTextFile() 中的使用之间改变了它的内容
  • 或初始化变量 X 并使用变量 Y(Y 和 X 可能是“strInputPath1”的变体)
  • 或者在不同的作用域(~Functions/Subs)中初始化并使用了两个同名变量

使用“Option Explicit”开始您的脚本将降低此类错误的风险。

添加了 wrt“将 fso 命名为错误”的注释:

由于 VBScript 的错误消息通常难以解释/理解,这可能是一个很好的机会来反思“什么可能出错?VBScript 会告诉我什么问题?我应该怎么做才能修复错误?如何避免它在将来?”

在 goFS 中给定一个字符串的第一个参数和一个错字(=> 空变量):

>> strInputPath1 =  "C:\test" & "\" & "css" & "\" & "main.css"
>> set f = goSF.OpenTextFile(strInputPath1,1)
>>
Error Number:       424
Error Description:  Object required

有道理:尝试在点左侧没有对象的情况下调用方法(. 运算符)是不行的。

让我们将邪恶的 goSF 设置为一个对象:

>> Set goSF = New RegExp
>> set f = goSF.OpenTextFile(strInputPath1,1)
>>
Error Number:       438
Error Description:  Object doesn't support this property or method

仍然没有“无效的过程调用或参数”错误。由于 goSF 现在是一个正则表达式,让我们忽略特定的方法(名称) - OpenTextFile() - 看看如果我们搞砸了调用会发生什么:

>> WScript.Echo TypeName(goSF)
>> Set ms = goSF.Execute()
>>
IRegExp2
Error Number:       450
Error Description:  Wrong number of arguments or invalid property assignment
>> Set ms = goSF.Execute(Null)
>>
Error Number:       13
Error Description:  Type mismatch

所以我的主张仍然成立。错误“无效的过程调用或参数”是由将 Empty 提供给在有效 FSO 上调用的方法 .OpenTextFile() 引起的。

于 2013-06-13T17:46:04.147 回答
1

这是一个老问题,但今天它让我很生气:如果您尝试打开您认为是 ASCII 但实际上是 Unicode 的文件,则 OpenTextFile() 也可能触发无效的过程调用。

请参阅https://msdn.microsoft.com/en-us/library/314cz14s(v=vs.84).aspx

所以

Set txsInput1 = FSO.OpenTextFile(strInputPath1, 1)

会成为

Set txsInput1 = FSO.OpenTextFile(strInputPath1, 1, false, -1)
于 2016-09-30T14:01:00.940 回答