Hola estoy teniendo un problema por el paso de parámetros a través de un vbscript para un archivo de proceso por lotes.
No soy muy buena en la parte de programación, así que estoy seguro de que me estoy perdiendo algo estúpido.
De todos modos estoy usando vbscript para invisiblemente ejecutar el archivo por lotes

El vbscript se llama como "C:\Program Files (x86)\scripts\check.vbs" %S "%D"

Donde %S es el estado y %D es el directorio.

Si yo llamo el archivo de proceso por lotes directamente como "C:\Program Files (x86)\scripts\checkdir.bat" %S "%D" todo funciona bien excepto que hay dos ventanas que aparece que es molesto.

Así que busqué por internet y encontré este vbscript que se puede ejecutar un archivo por lotes en silencio. De hecho ejecuta silenciosamente, sin embargo no pasa los parámetros para el archivo de proceso por lotes.

Aquí es el vbscript:

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\Program Files (x86)\scripts\checkdir.bat" & Chr(34), 0
Set WshShell = Nothing

Cómo se podría ir sobre pasa los parámetros? He buscado pero no he podido venir con cualquier cosa que trabajó para mí, me gustaría obtener un error en el funcionamiento o los parámetros no iba a pasar.

InformationsquelleAutor user2411206 | 2013-05-23

2 Comentarios

  1. 4

    Suponiendo que están llamando a la VBScript en este camino…

    wscript myscript.vbs ArgumentS ArgumentD

    A continuación, cambiar la línea 2 para que esto debería funcionar…

    WshShell.Run """C:\Program Files (x86)\scripts\checkdir.bat"" " & WScript.Arguments.Item(0) & " """ & WScript.Arguments.Item(1) & """", 0

    Nota que estoy asumiendo que usted necesita para pasar Argumento D con comillas dobles alrededor de ella, así que he incluido aquellos. Dentro de una cadena de VBScript reemplazará doble-doble cita con comillas dobles. Si no funciona, cambiar WshShell.Ejecutar wscript.echo y usted debería ver exactamente lo que VBScript está tratando de pasar. Si no es del todo correcto, ajustar y probar de nuevo con WshShell.Ejecute.

    Buena suerte.

    • Gracias por lo mucho que funcionó a la perfección.
  2. 1

    Necesita menos suerte, si se aborda el problema de complejo de construcción de la línea de comandos de una forma más sistemática de la moda:

    checkdir.bat:

    @echo off
    echo '%1' '%2' > checkdir.log

    de verificación.vbs:

    Option Explicit
    
    Dim oFS  : Set oFS  = CreateObject("Scripting.FileSystemObject")
    Dim oWAU : Set oWAU = WScript.Arguments.Unnamed
    Dim oWS : Set oWS = CreateObject("WScript.Shell")
    
    Dim S : S = "state"
    If oWAU.Count >= 1 Then S = oWAU(0)
    Dim D : D = "directory"
    If oWAU.Count >= 2 Then D = oWAU(1)
    
    Dim sBFspec : sBFSpec = oFS.GetAbsolutePathName(".\checkdir.bat")
    
    ' One way of building a command from parts that need quoting
    ' Replacing placeholders in a template is another one
    ' Everything is better than concatenating, cf:
    ' """C:\Program Files (x86)\scripts\checkdir.bat"" " & WScript.Arguments.Item(0) & " """ & WScript.Arguments.Item(1) & """", 0
    Dim sCmd    : sCmd    = Join(Array( _
          qq(sBFSpec) _
        , qq(S) _
        , qq(D) _
    ))
    
    ' sanity check
    WScript.Echo "About to call:"
    WScript.Echo sCmd
    WScript.Echo "Your last chance to check!"
    
    Dim iRet : iRet = oWS.Run(sCmd, 0, True)
    If 0 = iRet Then
       WScript.Echo "looks ok:"
       WScript.Echo oFS.OpenTextFile(".\checkdir.log").ReadAll()
    Else
       WScript.Echo "looks bad:", iRet
    End If
    
    WScript.Quit 0
    
    Function qq(s) : qq = """" & s & """" : End Function

    De salida:

    cscript check.vbs
    About to call:
    "E:\trials\SoTrials\answers722567\vbs\checkdir.bat" "state" "directory"
    Your last chance to check!
    looks ok:
    '"state"' '"directory"'
    
    cscript check.vbs "i don't care" "c:\ \ \simsalabim"
    About to call:
    "E:\trials\SoTrials\answers722567\vbs\checkdir.bat" "i don't care" "c:\ \ \simsalabim"
    Your last chance to check!
    looks ok:
    '"i don't care"' '"c:\ \ \simsalabim"'

    o:

    checkdir.bat "i don't care" "c:\ \ \simsalabim"
    
    type  checkdir.log
    '"i don't care"' '"c:\ \ \simsalabim"'

    (La preservación de la » cita fue una sorpresa para mí)

    • Gracias a esto no soluciono mi problema, pero fue un buen ejercicio de aprendizaje.

Dejar respuesta

Please enter your comment!
Please enter your name here