none
(Ayuda) Ejecutar desfragmentador de windows con un botón RRS feed

  • Pregunta

  • Hola,

    Me gustaría saber como puedo ejecutar el desfragmentador de Windows mediante un botón en un formulario.

    ¿Serviría para windows y 10?

    Gracias

    miércoles, 27 de enero de 2021 10:10

Todas las respuestas

  • Puedes usar Process.Start para ejecutar el comando "defrag".

    Primero ejecuta a mano desde una ventana de comandos defrag ? para que veas las opciones. Por ejemplo, "defrag /C /H" significa "defragmentar todas las unidades con prioridad normal". Una vez que ya sepas el comando que quieres, se lo pasas a Process.Start, por ejemplo:

    Process.Start("defrag", "/C /H")

    • Marcado como respuesta EricRRModerator viernes, 29 de enero de 2021 17:03
    • Desmarcado como respuesta Symantecc domingo, 31 de enero de 2021 13:10
    miércoles, 27 de enero de 2021 13:05
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    miércoles, 27 de enero de 2021 14:07
    Moderador
  •       Try
                Process.Start("defrag", "/C /H")
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    (El sistema no puede encontrar el archivo especifico.)

    Es el error que me lanza

    domingo, 31 de enero de 2021 13:08
  • Prueba a ponerlo con su ruta completa:

    Process.Start("C:\Windows\System32\defrag.exe", "/C /H")

    Por supuesto, si tu Windows no está en la ubicación usual, pon la ruta que corresponda conforme con tu configuración.


    domingo, 31 de enero de 2021 13:16
  • Gracias, creo que para esto hay unas variables para detectar la ruta exacta donde esta creo yo.
    miércoles, 3 de febrero de 2021 7:28
  • Sí, puedes usar Environment.GetFolderPath. No te lo quise poner en la respuesta anterior para no complicarla con detalles innecesarios mientras no hubieras comprobado que la llamada al defragmentador efectivamente funcionaba.
    • Propuesto como respuesta Sergio Parra miércoles, 3 de febrero de 2021 21:26
    • Marcado como respuesta EricRRModerator viernes, 5 de febrero de 2021 15:15
    • Desmarcado como respuesta Symantecc domingo, 7 de febrero de 2021 19:08
    miércoles, 3 de febrero de 2021 8:45
  • Hola, tengo puesto esto pero se me reinicia la app. No recibo el error en try ¿que puedo hacer?

            Try
                Dim myProcess As New Process()
                myProcess.StartInfo.FileName = System.Environment.GetFolderPath(System.Environment.SpecialFolder.System, "dfrgui.exe")
                myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
    
                'myProcess.StartInfo.Arguments = " /s"
    
                myProcess.Start()
            Catch ex As ComponentModel.Win32Exception
    
                MsgBox(ex.Message)
            End Try

    miércoles, 3 de febrero de 2021 9:32
  • ¿Qué puedo hacer? se reinicia mi aplicación al ejecutar el fichero.
    domingo, 7 de febrero de 2021 19:09
  • Fíjate que hay un error en GetFolderPath: no hay ninguna sobrecarga que permita pasarle aquí el nombre del ejecutable. Acostúmbrate a majejar la documentación. Fíjate aquí en la descripción de GetFolderPath, y verás que no tiene ninguna sobrecarga que acepte un string como segundo argumento.

    Otra cosa que conviene acostumbrarse a hacer cuando programas en VB.Net es poner Option Strict On. Esto hace que el compilador detecte las conversiones implícitas y te dé un error en ellas. De esta manera te das cuenta de que has metido una conversión no intencionada. Si es correcta y efectivamente querías hacerla, hay que trabajar un poco más porque tienes que escribir expresamente la conversión. Pero merece la pena este pequeño esfuerzo porque a cambio te ahorra muchísimos errores que de otra manera serían difíciles de detectar (como la conversión de string a enum que te está "rompiendo" tu código en este caso concreto).

    Para resolverlo, Llama primero al getfolderpath (sin pasarle "drggui.exe") y después, al valor que te devuelva concaténale debidamente el nombre del ejecutable (Puedes usar System.IO.Path.Combine, o bien concatenar los strings directamente). Y no lo ejecutes a ciegas; pon un punto de ruptura con el debugger para cerciorarte de que la ruta que te devuelve y el nombre que resulta de concatenar son correctos. 

    Aparte de eso, no hay ninguna otra razón para que se reinicie la aplicación. Incluso aunque se produjese un error al lanzar el Process, simplemente te saldría el error, pero no se reiniciaría.

    Puede ser que ocurra otro error distinto del Win32Exception, cosa que justificaría el por qué no entra en el Catch. Pero, una vez más, no se reiniciaría, sino que subiría al código llamante de ese fragmento y daría el error ahí... a no ser que ahí haya algo que haga reiniciarse la aplicación.


    domingo, 7 de febrero de 2021 19:32
  • ¿Me lo podrías explicar en un ejemplo de código? estoy algo perdido por mas que intento y reviso.
    lunes, 8 de febrero de 2021 10:54
  • Explicación con ejemplo de código. Esto esta mal:

    myProcess.StartInfo.FileName = System.Environment.GetFolderPath(System.Environment.SpecialFolder.System, "dfrgui.exe")

    Se resuelve así:

    myProcess.StartInfo.FileName = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.System), "dfrgui.exe"))

    Otra sugerencia (no imprescindible) es cambiar Catch ex As ComponentModel.Win32Exception por Catch ex As Exception

    lunes, 8 de febrero de 2021 12:23
  • Lo he puesto, pero me sigue diciendo que la ruta no es correcta, lo pongo dentro de un msgbox y la ruta es correcta, es muy raro
    lunes, 8 de febrero de 2021 15:05
  • Copia con exactitud la ruta que te sale y ponnosla aquí, a ver si le vemos algo. Usa "copiar y pegar" desde el debugger. No la copies desde el MsgBox, no vaya a ser que contenga algún carácter oculto que no se vea en el msgbox.

    También puede ser buena idea que nos copies aquí el fragmento de código exacto que estás ejecutando, para que podamos probarlo a ver si detectamos el mismo problema.

    lunes, 8 de febrero de 2021 15:40