0

我有这个批处理文件:

@echo off
echo StrText="Application created Successfully" > spk.vbs
echo set ObjVoice=CreateObject("SAPI.SpVoice") >> spk.vbs
echo ObjVoice.Speak StrText >> spk.vbs
start spk.vbs

该批处理文件在同一目录下创建spk.vbs,并用电脑语音输出文本“应用程序创建成功”。

现在我希望批处理文件在命令行上说出给它的文本文件的内容 (%1)。而 spk.vbs 文件应该在默认的 Windows 临时目录中创建。我怎样才能做到这一点?

***编辑 06.11.2012 20:24

同时我也放弃了使用批处理文件脚本生成vbs脚本文件的想法,想直接使用vbs脚本。虽然我是 VBS 的绝对初学者,但我创建了这个:

Set objFSO = CreateObject("Scripting.FileSystemObject")
strAFile = Wscript.Arguments(0)
Set objFile = objFSO.GetFile(strAFile)
If objFile.Size > 0 Then
  Set objReadFile = objFSO.OpenTextFile(Wscript.Arguments(0), 1)
  strContents = objReadFile.ReadAll 
  objReadFile.Close
  set ObjVoice=CreateObject("SAPI.SpVoice") 
  ObjVoice.Speak strContents 
Else
  Wscript.Echo "The file is empty."
End If

它有效,但可能我犯了很多错误。有人能告诉我如何优化 vbs 脚本吗?谢谢!

***编辑 06.11.2012 22:19

这工作了几次之后,现在它不再工作了:现在电脑扬声器只输出“Y”和文本文件的第一个字符!这与我的脚本中的错误有关吗?

***编辑 10.11.2012 19:32 发现错误:上述脚本仅适用于 ANSI 编码的文本文件。它不适用于 UNICODE 文本文件!为什么?我怎样才能使它也与 UNICODE 文本文件一起使用?

4

1 回答 1

1

使用 .OpenTextFile 的第 4 个参数.OpenAsTextStream的第 2 个参数)方法指定是以 ASCII 还是 Unicode (16) 格式打开文件。

我在您的代码片段中没有发现任何严重错误,但也许您想考虑:

  1. 使用“选项显式”(显式)
  2. 检查用户是否向脚本传递了至少一个参数
  3. 避免通过不同的名称/变量(strAFile、WScript.Arguments(0))引用相同的“对象”
  4. 使用 .OpenAsTextStream 因为你已经有一个 File 对象
  5. 通过定义适当的常量(例如 ForReading)来避免“幻数”(例如 1)
  6. 避免不必要的变量(你不写的代码不会错)

例如:

Set objReadFile = objFSO.OpenTextFile(WScript.Arguments(0), 1)
strContents = objReadFile.ReadAll 
objReadFile.Close

==>

Const cnUnicode = -1
...
strContents = objFile.OpenAsTextStream(ForReading, cnUnicode).ReadAll()
于 2012-11-11T10:40:52.043 回答