VB脚本问题 - Bitlocker状态到以计算机名命名的文件中

时间:2014-04-29 22:19:40

标签: vb.net vbscript

我需要调整以下脚本以将Bitlocker状态提供给文本文件,该文件应具有其文件名的计算机名称。因此,对于名为Station10的PC,脚本将输出名为Station10_enabled.txt的文本文件。或者,如果禁用Bitlocker,它将创建一个名为Station10_disabled.txt的文件。

我有下面的代码,这似乎有道理,但是没有用。

代码产生错误“Can not use parentheses when calling a sub”,我该如何解决?

我也担心一旦代码运行,%computername%变量将无效或创建语法错误,但由于上述问题我无法测试。

如果有人知道如何优雅地处理我想要做的事情,请帮助。

strComputer = "." 
Set objShell = CreateObject("Wscript.Shell") 
strEnvSysDrive = objShell.ExpandEnvironmentStrings("%SystemDrive%") 

Set objWMIServiceBit = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2     \Security\MicrosoftVolumeEncryption") 
Set colItems = objWMIServiceBit.ExecQuery("SELECT * FROM Win32_EncryptableVolume",,48) 

For Each objItem in colItems 
    If objItem.DriveLetter = strEnvSysDrive Then 
       strDeviceC = objItem.DeviceID 
       DriveC =  "Win32_EncryptableVolume.DeviceID='"&strDeviceC&"'" 
       Set objOutParams = objWMIServiceBit.ExecMethod(DriveC, "GetProtectionStatus") 
        If objOutParams.ProtectionStatus = "1" Then 
            My.Computer.FileSystem.WriteAllText("C:\cos\.txt","Bitlocker is enabled.",True)  
        Else 
            My.Computer.FileSystem.WriteAllText("C:\cos\test.txt","Bitlocker is disabled.",True) 
        End if 
    End If 
Next

1 个答案:

答案 0 :(得分:0)

VB对圆括号有点挑剔:

如果使用函数结果,则必须指定Function调用的参数列表。

不得指定Sub个电话的参数列表。如果不使用函数结果,则对于函数调用的参数列表也是如此。

陷阱是,如果你调用一个只需要一个参数的子(或函数,并且不使用它的结果),你通常会离开,并在圆括号中指定该参数。 < strong>您可能认为,既然这样可行,您可以(或必须)指定圆括号。这是不真实的,因为在这种情况下,圆括号可以(并且被)作为表达式的一部分,该表达式被计算以传递要作为实际paarmeter传递的值。这就是写

的原因
My.Computer.FileSystem.WriteAllText("C:\cos\test.txt","Bitlocker is disabled.",True) 

在语法上无效,而

AnyRoutineThatAcceptsOneArgument (Value) 

没问题,但与

完全相同
AnyRoutineThatAcceptsOneArgument Value

如果你不明白,请考虑

AnyRoutineThatAcceptsOneArgument ((((((((Value))))))))

这是合法的,但充满了无用(冗余)括号。

因此,只需要围绕常规参数的圆括号的两个上下文是:

  • 调用只需要一个参数的函数,并使用 功能结果。

与此相反,对于不使用函数结果的Sub调用或函数调用,不允许指定括号。 事实上,在一个特殊情况下,即只有一个参数的例程调用,您可以根据需要指定尽可能多的圆括号。它只是一个表达式,并且你可以根据需要使用尽可能多的(多余的)包围。