2016-09-14 92 views
1

我有以下vbscript,它在命令行中运行时工作得非常好。当用鼠标双击时,会喜欢将其与Windows GUI配合使用。使vbscript能够在两个命令行中运行,并通过双击运行

当前设置

这是当前命令执行的VBScript - 需要两个参数

  1. 密码

cscript fix.vbs file.ext password

这里是我的代码(fix.vbs):

Dim Arg, pfxFileName, keyFileName, cerFileName, cabFileName, keyPassword 
Set Arg = WScript.Arguments 

pfxFileName = Arg(0) 
keyPassword = Arg(1) 
keyFileName = "key.tmp" 
cerFileName = "cer.tmp" 
cabFileName = "cabundle.tmp" 

Dim oShell 
Set oShell = WScript.CreateObject ("WScript.Shell") 
return = oShell.run("cmd /C openssl pkcs12 -in " & pfxFileName & " -nocerts -out " & keyFileName & " -passin pass:" & keyPassword & " -passout pass:" & keyPassword & " | openssl pkcs12 -in " & pfxFileName & " -clcerts -nokeys -out " & cerFileName & " -passin pass:" & keyPassword & " | openssl pkcs12 -in " & pfxFileName & " -cacerts -nokeys -out " & cabFileName & " -passin pass:" & keyPassword, 0, true) 

' strip all ca's except for the last block 
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 
Dim reCut : Set reCut = New RegExp 
reCut.Global = True 
reCut.Pattern = "-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----" 
Dim oMTS : Set oMTS = reCut.Execute(goFS.OpenTextFile(cabFileName).ReadAll()) 
Dim sBlock : sBlock = oMTS(oMTS.Count - 1).Value 
' WScript.Echo sBlock 

Sub SaveStringToFile(filename, text) 
    Dim fso, f 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set f = fso.OpenTextFile(filename, 2) 
    f.Write text 
    f.Close 
End Sub 

SaveStringToFile cabFileName, sBlock 

' build pfx file 
return = oShell.run("cmd /C openssl pkcs12 -export -in " & cerFileName & " -inkey " & keyFileName & " -certfile " & cabFileName & " -out NEW-" & pfxFileName & " -password pass:" & keyPassword & " -passin pass:" & keyPassword, 0, true) 

Dim WshShell, strCurDir 
Set WshShell = CreateObject("WScript.Shell") 
strCurDir = WshShell.CurrentDirectory 
WScript.Echo vbNewLine & ">>> Thew NEW PFX file is located in " & strCurDir & "\" & "NEW-" & pfxFileName 

Set oShell = Nothing 

' remove files 
Set obj = CreateObject("Scripting.FileSystemObject") 
obj.DeleteFile(cerFileName) 
obj.DeleteFile(keyFileName) 
obj.DeleteFile(cabFileName) 

需要补充

  1. 使上述兼容双当Windows图形用户界面点击 工作代码。
  2. 提示用户输入两个参数(浏览到文件)&(文件 密码)
+1

那么你的问题是什么?检查'Arg(0)'和'Arg(1)'中是否有值;如果你不这样做,你就会被双击并提示输入值。你还希望如何从双击中获得它们? –

+0

我想这是有道理的..现在它的写作方式是参数只能通过命令行传递。 – user3436467

+0

你可以向他们提供双击(不提示他们)的唯一方法是将它们硬编码到脚本中,这似乎不符合你所描述的要求。建议:对于未来的问题,你应该努力实际陈述你所问的问题。这一个没有,但在线之间阅读很容易。未来的问题可能不会那么顺利,并且在有问题的问题上迅速堆积起来。 –

回答

2

与下面的代码创建一个.vbs文件,并将其放置在桌面上。双击它。

PerformAction 

Private Sub PerformAction() 

    pfxFileName = Trim(InputBox("Enter Filename:", "My VB Script")) 
    If pfxFileName = vbNullString Then 
    Exit Sub 
    End If 

    keyPassword = Trim(InputBox("Enter Password:", "My VB Script")) 
    If keyPassword = vbNullString Then 
    Exit Sub 
    End If 

    ProcessCertificate pfxFileName, keyPassword 

End Sub 

Private Sub ProcessCertificate(ByVal pfxFileName, ByVal keyPassword) 
    Dim keyFileName, cerFileName, cabFileName 
    keyFileName = "key.tmp" 
    cerFileName = "cer.tmp" 
    cabFileName = "cabundle.tmp" 

    Dim oShell 
    Set oShell = WScript.CreateObject("WScript.Shell") 
    return = oShell.run("cmd /C openssl pkcs12 -in " & pfxFileName & " -nocerts -out " & keyFileName & " -passin pass:" & keyPassword & " -passout pass:" & keyPassword & " | openssl pkcs12 -in " & pfxFileName & " -clcerts -nokeys -out " & cerFileName & " -passin pass:" & keyPassword & " | openssl pkcs12 -in " & pfxFileName & " -cacerts -nokeys -out " & cabFileName & " -passin pass:" & keyPassword, 0, true) 

    ' strip all ca's except for the last block 
    Dim goFS: Set goFS = CreateObject("Scripting.FileSystemObject") 
    Dim reCut: Set reCut = New RegExp 
    reCut.Global = True 
    reCut.Pattern = "-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----" 
    Dim oMTS: Set oMTS = reCut.Execute(goFS.OpenTextFile(cabFileName).ReadAll()) 
    Dim sBlock: sBlock = oMTS(oMTS.Count - 1).Value 
    ' WScript.Echo sBlock 

    SaveStringToFile cabFileName, sBlock 

    ' build pfx file 
    return = oShell.run("cmd /C openssl pkcs12 -export -in " & cerFileName & " -inkey " & keyFileName & " -certfile " & cabFileName & " -out NEW-" & pfxFileName & " -password pass:" & keyPassword & " -passin pass:" & keyPassword, 0, true) 

    Dim WshShell, strCurDir 
    Set WshShell = CreateObject("WScript.Shell") 
    strCurDir = WshShell.CurrentDirectory 
    WScript.Echo vbNewLine & ">>> Thew NEW PFX file is located in " & strCurDir & "\" & "NEW-" & pfxFileName 

    Set oShell = Nothing 

    ' remove files 
    Set obj = CreateObject("Scripting.FileSystemObject") 
    obj.DeleteFile (cerFileName) 
    obj.DeleteFile (keyFileName) 
    obj.DeleteFile (cabFileName) 
End Sub 

    Sub SaveStringToFile(filename, text) 
     Dim fso, f 
     Set fso = CreateObject("Scripting.FileSystemObject") 
     Set f = fso.OpenTextFile(filename, 2) 
     f.Write text 
     f.Close 
    End Sub 
+0

非常感谢。我试图运行这个,但我得到38号线,字符3,代码:800A03EA错误。 此外,该代码是否可以与命令行和Windows GUI一起使用? – user3436467

+0

里面有一个程序,我把它移出来并更新了上面的代码。尝试使用它。我无法在我的机器上编译,因为我没有openssl和其他必需的东西。意图是向您展示使用inputbox读取userinput并将其传递给函数。这可以用于双击。 –

+0

现在很好用!我只是要求在提示输入文件名时是否可以有一个“浏览”按钮而不是手动输入文件?虽然,我知道这样做可能会破坏代码,因为我不考虑路径..当前代码假定文件与脚本位于同一目录中。 – user3436467

相关问题