如果然后endif,其他智能解决方案,如果那么

时间:2010-06-13 14:25:50

标签: vbscript

我有以下VB脚本 如何用case语法编写这个VB脚本?如果那时候为了进行专业写作...... 耶尔

Set fso = CreateObject("Scripting.FileSystemObject") 

If (fso.FileExists("C:\file1 ")) Then 
    Verification=ok
Else 
  WScript.Echo("file1") 
  Wscript.Quit(100)
End If 

If (fso.FileExists("C:\file2 ")) Then 
  Verification=ok
Else 
  WScript.Echo("file2") 
  Wscript.Quit(100)
End If 


If (fso.FileExists("C:\file3 ")) Then 
    Verification=ok
Else 
  WScript.Echo("file3") 
  Wscript.Quit(100)
End If

。 。 。

3 个答案:

答案 0 :(得分:4)

在VB(或vbs)中有with子句或其他语言中的switch等替代品,但是这些用于单个给定条件/ var然后检查它们的值但是因为你不必检查单个事物,例如多个文件名C:\file1C:\file2等,因此在这种情况下不适用它们。

作为另一种选择,您可以使用循环,因为文件名编号在您的代码中似乎是一致的:

For i 1 To 3
  If (fso.FileExists("C:\file" & i)) Then
      Verification = ok
  Else
    WScript.Echo("file" & i)
    Wscript.Quit(100)
  End If
Next

总而言之,上面的代码是代码的简写。

答案 1 :(得分:0)

虽然可能需要更多代码行,但您可以实现一个简单的有限状态机来执行此操作。然后,不使用if / then结构,而是使用某种类型的switch语句,其中包含一组枚举的“状态”,您可以使用它们。

这详细介绍了FSM http://en.wikipedia.org/wiki/Finite-state_machine,并且使用枚举和切换语句很容易实现它们。

我刚刚抓住了Google的这个,这是C:中的一个简单的FSM实现:

#include <stdio.h>

main()
{
    int c;

    START: 
        switch(c = getchar()){
            case 'f' : goto F;
            case 'b' : goto B;
            case EOF : goto FAIL;
            default: goto START; }

    F:
        switch(c = getchar()){
            case 'o' : goto FO;
            case EOF : goto FAIL;
            default  : goto START;}

    FO:
        switch(c = getchar()){
            case 'o' : goto SUCCESS;
            case EOF : goto FAIL;
            default  : goto START;}

    B:
        switch(c = getchar()){
            case 'a' : goto BA;
            case EOF : goto FAIL;
            default  : goto START;}

    BA:
        switch(c = getchar()){
            case 'r' : goto SUCCESS;
            case EOF : goto FAIL;
            default  : goto START;}

    FAIL: 
        printf("Does not match.\n");
        return;
    SUCCESS:
        printf("Matches.\n");
        return;
}

答案 2 :(得分:0)

您不能将select / case用于此类事物,但还有其他方法可以压缩或简化代码。

首先,反转测试条件:

If Not (fso.FileExists("C:\file1 ")) Then 
  WScript.Echo("file1") 
  Wscript.Quit(100)
End If 

这样可以避免在if / then之后需要“不执行任何操作”命令。

接下来,您可以在函数和子例程中进行包装,以减少重复的代码:

function TestFile(sFileName)
  TestFile = fso.FileExists(sFileName)
end function

sub ErrorExit(sMessage, nCode)
  WScript.Echo sMessage
  WScript.Quit nCode
end sub

然后你的一系列测试成为:

if not TestFile("c:\file1") then
  ErrorExit "file1 not found", 100

elseif not TestFile("c:\file2") then
  ErrorExit "file2 not found", 100

elseif not TestFile("c:\file3") then
  ErrorExit "file3 not found", 100
end if