2016-09-14 93 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

相關問題