none
Ayuda con la ejecución de un fichero en C#

    Question

  • ¡Hola a todos! Veréis, tengo un pequeño problema: estoy creando una aplicación de consola que lo que hace, básicamente, es lo siguiente:

    • Elimina los archivos temporales y obsoletos.
    • Limpia el registro de Windows.
    • Realiza labores de reparación del ordenador.

    El tema es que al probarla para ver si todo funcionaba correctamente me salta la excepción que se muestra en la imágen de abajo. He comprobado que lo que se me indica está donde debe de estar (cosa que es así), y no sé dónde está el fallo.

    Os paso también el código de la aplicación por si os sirve de algo:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.CompilerServices;
    using System.Diagnostics;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                const string archivo = @"c:\\%homepath%\\Mis documentos\\PCCR.bat";
                string arch = "TempCleaner.bat", arch1 = "ReagClean.bat", arch2 = "PCR.bat";
                StreamWriter writer, writer1, writer2, writer3;
                FileStream fichero, fichero1, fichero2, fichero3;
                ProcessStartInfo proceso, proceso1, proceso2, proceso3, proceso4;
                Console.Title = "PC Cleaner & Repair 1.0";
                fichero = new FileStream(archivo, FileMode.Create, FileAccess.Write);
                writer = new StreamWriter(archivo);
                try
                {
                    writer.WriteLine("@echo off");
                    writer.WriteLine("title PC Clean and Repair 1.0 by Santi & color 4");
                    writer.WriteLine("if exist TempCleaner.bat call TempCleaner.bat");
                    writer.WriteLine("if exist RegClean.bat call RegClean.bat");
                    writer.WriteLine("if exist PCR.bat call PCR.bat");
                    writer.WriteLine("exit");
                    writer.Close();
                }
                catch (IOException io)
                {
                    io.Message.Contains("Error de ejecución inesperado.");
                    throw io;
                }
                fichero.Close();
                fichero1 = new FileStream(arch, FileMode.Create, FileAccess.Write);
                writer1 = new StreamWriter(arch);
                try
                {
                    writer1.WriteLine("@echo off");
                    writer1.WriteLine("title TempCleaner & color 4");
                    writer1.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer1.WriteLine("echo A continuación PC Clean & Repair procederá a eliminar los archivos temporales del ordenador.");
                    writer1.WriteLine("cd c:\\Users\\%username%\\AppData\\Local");
                    writer1.WriteLine("rmdir //S //Q Temp");
                    writer1.WriteLine("echo Eliminando archivos antiguos...");
                    writer1.WriteLine("del dir/s *.bak");
                    writer1.WriteLine("del dir/s *.log");
                    writer1.WriteLine("del dir/s *.OLD");
                    writer1.WriteLine("del dir/s *.sqm");
                    writer1.WriteLine("echo ¡Archivos antiguos eliminados!");
                    writer1.WriteLine("exit");
                    writer1.Close();
                }
                catch (IOException io)
                {
                    throw io;
                }
                fichero1.Close();
                fichero2 = new FileStream(arch1, FileMode.Create, FileAccess.Write);
                writer2 = new StreamWriter(arch1);
                try
                {
                    writer2.WriteLine("@echo off");
                    writer2.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer2.WriteLine("echo Realizando copia de seguridad del registro...");
                    writer2.WriteLine("reg export HKEY_CLASSES_ROOT Copia de seguridad del registro.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_USER Copia de seguridad del registro 2.reg");
                    writer2.WriteLine("reg export HKEY_LOCAL_MACHINE Copia de seguridad del registro 3.reg");
                    writer2.WriteLine("reg export HKEY_USERS Copia de seguridad del registro 4.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_CONFIG Copia de seguridad del registro 5.reg");
                    writer2.WriteLine("echo Limpiando el registro...");
                    writer2.WriteLine("goto clean");
                    writer2.WriteLine(":clean");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd %programfiles%");
                    writer2.WriteLine("if exist c:\\%programfiles%\\CCleaner goto ccleaner else goto nc");
                    writer2.WriteLine(":ccleaner");
                    writer2.WriteLine("cd CCleaner");
                    writer2.WriteLine("start CCleaner.exe");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":nc");
                    writer2.WriteLine("set /p usuario = %USERNAME%");
                    writer2.WriteLine("echo Lo sentimos, %usuario%, pero esta versión de PC Clean and Repair sólamente trabaja con el programa CCleaner. En futuras versiones haremos que trabaje con otros programas de ese estilo.");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":fin");
                    writer2.WriteLine("cls");
                    writer2.WriteLine("exit");
                    writer2.Close();
                }
                catch (IOException io)
                {
                    io.Message.Contains("Error de ejecución inesperado.");
                }
                fichero2.Close();
                fichero3 = new FileStream(arch2, FileMode.Create, FileAccess.Write);
                writer3 = new StreamWriter(arch2);
                try
                {
                    writer3.WriteLine("@echo off");
                    writer3.WriteLine("title PCR&color C");
                    writer3.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer3.WriteLine("echo Procediendo a la comprobación de errores en el disco...");
                    writer3.WriteLine("chkdsk /f/r");
                    writer3.WriteLine("echo Procediendo a la defragmentación del disco...");
                    writer3.WriteLine("defrag c:");
                    writer3.WriteLine("echo Procediendo a la comprobación de archivos del sistema corruptos o dañados...");
                    writer3.WriteLine("sfc /scannow");
                    writer3.WriteLine("exit");
                    writer3.Close();
                }
                catch (IOException io)
                {
                    io.Message.Contains("Error de ejecución desconocido.");
                }
                fichero3.Close();
                proceso = new ProcessStartInfo();
                proceso.WorkingDirectory = @"c:\\%homepath%\\Mis documentos\\PCCR.bat";
                proceso.FileName = "PCR.bat";
                proceso.Verb = "open";
                Thread.Sleep(5000);
                proceso1 = new ProcessStartInfo();
                proceso1.WorkingDirectory = @"c:\\%homepath%\\Mis documentos\\TempCleaner.bat";
                proceso1.FileName = "TempCleaner.bat";
                proceso1.Verb = "delete";
                proceso2 = new ProcessStartInfo();
                proceso2.WorkingDirectory = @"c:\\%homepath%\\Mis documentos\\RegClean.bat";
                proceso2.FileName = "RegClean.bat";
                proceso2.Verb = "delete";
                proceso3 = new ProcessStartInfo();
                proceso3.WorkingDirectory = @"c:\\%homepath%\\Mis documentos\\PCR.bat";
                proceso3.FileName = "PCR.bat";
                proceso3.Verb = "delete";
                proceso4 = new ProcessStartInfo();
                proceso4.WorkingDirectory = @"c:\\%homepath%\\Mis documentos\\PCCR.bat";
                proceso4.FileName = "PCR.bat";
                proceso4.Verb = "open";
                Console.ReadKey();
            }
        }
    }
    

    Friday, March 09, 2012 5:54 PM

All replies

    1. Cuando use @ con cadenas literales de texto, no debe usar doble barra para representar una barra.
    2. No es correcta la ruta "C:\%homepath%".  En todo caso sería sin C:\.
    3. No es correcto asumir que todas las PC's tienen un folder llamado Mis Documentos.  Lo correcto es utilizar Environment.GetFolderPath(Environment.SpecialFolder.Personal) (si no estoy equivocado con el enumerador).

    Jose R. MCP

    Friday, March 09, 2012 6:04 PM
  • Otra cosa:  Utilice las funciones estáticas de System.IO.Path para trabajar con las rutas de archivos.  Por ejemplo, puede combinar el resultado de Environment.GetFolderPath() con un subfolder o un nombre de archivo utilizando System.IO.Path.Combine().

    Jose R. MCP

    Friday, March 09, 2012 6:06 PM
  • mm no creo que funcione ese %homepath% como parte de una ruta

    si podrias usar

    Environment.SpecialFolder.MyDocuments

    para obtenr la carpeta mis documentos del equipo

    C# Environment.SpecialFolder

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Friday, March 09, 2012 6:07 PM
  • La idea de usar la variable de entorno %homepath% se me ocurrió porque pensé que de esa manera me aseguraba de que la aplicación pudiera funcionar en cualquier ordenador en que la probara (la variable de entorno %homepath% equivale a c:\User\nombre de usuario). De igual manera probaré lo que me comentas y luego te cuento.

    Santiago Casteleiro

    Friday, March 09, 2012 6:29 PM
  • Probaré lo que me comentas. Otra cosa, ¿cómo haría para que la aplicación se guardara en la carpeta 'Mis documentos' del equipo en el que se ejecute?

    Santiago Casteleiro

    Friday, March 09, 2012 6:35 PM
  • para al carpeta mi documentos

    Environment.SpecialFolder.MyDocuments


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Friday, March 09, 2012 6:47 PM
  • Otra cosa:  Utilice las funciones estáticas de System.IO.Path para trabajar con las rutas de archivos.  Por ejemplo, puede combinar el resultado de Environment.GetFolderPath() con un subfolder o un nombre de archivo utilizando System.IO.Path.Combine().

    Jose R. MCP

    Lo acabo de intentar pero no hay forma: haga como lo haga siempre me sale un error, como por ejemplo el que se muestra en la imágen de abajo. Por otro lado he modificado ligeramente el código y ahora queda algo así:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.CompilerServices;
    using System.Diagnostics;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                const string archivo = @"%homepath%\PCCR.bat";
                string arch = "TempCleaner.bat", arch1 = "RegClean.bat", arch2 = "PCR.bat";
                StreamWriter writer, writer1, writer2, writer3;
                FileStream fichero, fichero1, fichero2, fichero3;
                ProcessStartInfo proceso, proceso1, proceso2, proceso3, proceso4;
                Console.Title = "PC Clean & Repair 1.0";
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                Path.Combine(Environment.SpecialFolder.MyDocuments(archivo));
                fichero = new FileStream(archivo, FileMode.Create, FileAccess.Write);
                writer = new StreamWriter(archivo);
                try
                {
                    writer.WriteLine("@echo off");
                    writer.WriteLine("title PC Clean and Repair 1.0 by Santi & color 4");
                    writer.WriteLine("if exist TempCleaner.bat call TempCleaner.bat");
                    writer.WriteLine("if exist RegClean.bat call RegClean.bat");
                    writer.WriteLine("if exist PCR.bat call PCR.bat");
                    writer.WriteLine("exit");
                    writer.Close();
                }
                catch (IOException io)
                {
                    io.Message.Contains("Error de ejecución inesperado.");
                    throw io;
                }
                fichero.Close();
                fichero1 = new FileStream(arch, FileMode.Create, FileAccess.Write);
                writer1 = new StreamWriter(arch);
                try
                {
                    writer1.WriteLine("@echo off");
                    writer1.WriteLine("title TempCleaner & color 4");
                    writer1.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer1.WriteLine("echo A continuación PC Clean & Repair procederá a eliminar los archivos temporales del ordenador.");
                    writer1.WriteLine("cd c:\\Users\\%username%\\AppData\\Local");
                    writer1.WriteLine("rmdir //S //Q Temp");
                    writer1.WriteLine("echo Eliminando archivos antiguos...");
                    writer1.WriteLine("del dir/s *.bak");
                    writer1.WriteLine("del dir/s *.log");
                    writer1.WriteLine("del dir/s *.OLD");
                    writer1.WriteLine("del dir/s *.sqm");
                    writer1.WriteLine("echo ¡Archivos antiguos eliminados!");
                    writer1.WriteLine("exit");
                    writer1.Close();
                }
                catch (IOException io)
                {
                    throw io;
                }
                fichero1.Close();
                fichero2 = new FileStream(arch1, FileMode.Create, FileAccess.Write);
                writer2 = new StreamWriter(arch1);
                try
                {
                    writer2.WriteLine("@echo off");
                    writer2.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer2.WriteLine("echo Realizando copia de seguridad del registro...");
                    writer2.WriteLine("reg export HKEY_CLASSES_ROOT Copia de seguridad del registro.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_USER Copia de seguridad del registro 2.reg");
                    writer2.WriteLine("reg export HKEY_LOCAL_MACHINE Copia de seguridad del registro 3.reg");
                    writer2.WriteLine("reg export HKEY_USERS Copia de seguridad del registro 4.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_CONFIG Copia de seguridad del registro 5.reg");
                    writer2.WriteLine("echo Limpiando el registro...");
                    writer2.WriteLine("goto clean");
                    writer2.WriteLine(":clean");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd %programfiles%");
                    writer2.WriteLine("if exist c:\\%programfiles%\\CCleaner goto ccleaner else goto nc");
                    writer2.WriteLine(":ccleaner");
                    writer2.WriteLine("cd CCleaner");
                    writer2.WriteLine("start CCleaner.exe");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":nc");
                    writer2.WriteLine("set /p usuario = %USERNAME%");
                    writer2.WriteLine("echo Lo sentimos, %usuario%, pero esta versión de PC Clean and Repair sólamente trabaja con el programa CCleaner. En futuras versiones haremos que trabaje con otros programas de ese estilo.");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":fin");
                    writer2.WriteLine("cls");
                    writer2.WriteLine("exit");
                    writer2.Close();
                }
                catch (IOException io)
                {
                    io.Message.Contains("Error de ejecución inesperado.");
                }
                fichero2.Close();
                fichero3 = new FileStream(arch2, FileMode.Create, FileAccess.Write);
                writer3 = new StreamWriter(arch2);
                try
                {
                    writer3.WriteLine("@echo off");
                    writer3.WriteLine("title PCR&color C");
                    writer3.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer3.WriteLine("echo Procediendo a la comprobación de errores en el disco...");
                    writer3.WriteLine("chkdsk /f/r");
                    writer3.WriteLine("echo Procediendo a la defragmentación del disco...");
                    writer3.WriteLine("defrag c:");
                    writer3.WriteLine("echo Procediendo a la comprobación de archivos del sistema corruptos o dañados...");
                    writer3.WriteLine("sfc /scannow");
                    writer3.WriteLine("exit");
                    writer3.Close();
                }
                catch (IOException io)
                {
                    io.Message.Contains("Error de ejecución desconocido.");
                }
                fichero3.Close();
                proceso = new ProcessStartInfo();
                proceso.WorkingDirectory = @"%homepath%\PCCR.bat";
                proceso.FileName = "PCR.bat";
                proceso.Verb = "open";
                Thread.Sleep(5000);
                proceso1 = new ProcessStartInfo();
                proceso1.WorkingDirectory = @"%homepath%\Mis documentos\TempCleaner.bat";
                proceso1.FileName = "TempCleaner.bat";
                proceso1.Verb = "delete";
                proceso2 = new ProcessStartInfo();
                proceso2.WorkingDirectory = @"%homepath%\Mis documentos\RegClean.bat";
                proceso2.FileName = "RegClean.bat";
                proceso2.Verb = "delete";
                proceso3 = new ProcessStartInfo();
                proceso3.WorkingDirectory = @"%homepath%\Mis documentos\PCR.bat";
                proceso3.FileName = "PCR.bat";
                proceso3.Verb = "delete";
                proceso4 = new ProcessStartInfo();
                proceso4.WorkingDirectory = @"%homepath%\PCCR.bat";
                proceso4.FileName = "PCR.bat";
                proceso4.Verb = "delete";
                Console.ReadKey();
            }
        }
    }
    

    ¿Qué es lo que estoy haciendo mal?


    Santiago Casteleiro

    Saturday, March 10, 2012 12:25 AM
  • Siempre es bueno revisar la documentación de las funciones y métodos que no hemos usado antes.  Aquí está Environment.GetFolderPath().  Como puede usted observar, es un método que devuelve una cadena de texto.  La cadena devuelta es el folder que se solicita.  Por lo tanto usted debe almacenar el valor devuelto en una variable.  En su código usted deja que el valor devuelto se pierda.  Igualmente ocurren con Path.Combine().

    string ubicacion = Environment.GetFolderPath(Environment.SpecialFolders.MyDocuments);
    string archivo = "miarchivo.bat";
    archivo = Path.Combine(ubicacion, archivo);
    //Ahora la variable archivo contiene algo como:
    //C:\Documents and Settings\elusuario\Mis Documentos\miarchivo.bat
    //Ahora puede usted utilizar este resultado para abrir el archivo.


    Jose R. MCP

    Saturday, March 10, 2012 3:59 AM
  • Ante todo perdonad por mi tardanza en contestar, y dejadme que os agradezca la ayuda que me estáis prestando (ambas respuestas me han ayudado mucho), pero ahora el problema es que cuando intento depurar la aplicación para ver si se ejecuta correctamente o no, ésta se ejecuta... pero se queda colgada sin, aparentemente, hacer nada; aunque he podido comprobar que me crea el primero de los ficheros de los que se vale para realizar su función pero los otros 2 inexplicablemente no los crea.

    El código (lo he modificado un poco) queda ahora como sigue:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.CompilerServices;
    using System.Diagnostics;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                string ub = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                string archivo = "PCCR.bat";
                string arch = "TempCleaner.bat", arch1 = "RegClean.bat", arch2 = "PCR.bat";
                ProcessStartInfo proceso, proceso1, proceso2, proceso3, proceso4;
                StreamWriter writer, writer1, writer2, writer3;
                Console.Title = "PC Clean & Repair 1.0";
                archivo = Path.Combine(ub, archivo);
                writer = new StreamWriter(archivo);
                try
                {
                    writer.WriteLine("@echo off");
                    writer.WriteLine("if exist TempCleaner.bat call TempCleaner.bat");
                    writer.WriteLine("if exist RegClean.bat call RegClean.bat");
                    writer.WriteLine("if exist PCR.bat call PCR.bat");
                    writer.WriteLine("exit");
                }
                catch (Exception ex)
                {
                    ex.Message.Contains("Error no reconocido");
                }
                writer1 = new StreamWriter(arch);
                try
                {
                    writer.WriteLine("@echo off");
                    writer.WriteLine("title TempCleaner & color 4");
                    writer.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer.WriteLine("echo A continuación PC Clean & Repair procederá a eliminar los archivos temporales del ordenador.");
                    writer.WriteLine("cd c:\\Users\\%username%\\AppData\\Local");
                    writer.WriteLine("rmdir //S //Q Temp");
                    writer.WriteLine("echo Eliminando archivos antiguos...");
                    writer.WriteLine("del dir/s *.bak");
                    writer.WriteLine("del dir/s *.log");
                    writer.WriteLine("del dir/s *.OLD");
                    writer.WriteLine("del dir/s *.sqm");
                    writer.WriteLine("echo ¡Archivos antiguos eliminados!");
                    writer.WriteLine("exit");
                   
                }
                catch (Exception ex1)
                {
                    ex1.Message.Contains("Error no especificado.");
                }
                writer2 = new StreamWriter(arch1);
                try
                {
                    writer1.WriteLine("@echo off");
                    writer2.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer2.WriteLine("echo Realizando copia de seguridad del registro...");
                    writer2.WriteLine("reg export HKEY_CLASSES_ROOT Copia de seguridad del registro.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_USER Copia de seguridad del registro 2.reg");
                    writer2.WriteLine("reg export HKEY_LOCAL_MACHINE Copia de seguridad del registro 3.reg");
                    writer2.WriteLine("reg export HKEY_USERS Copia de seguridad del registro 4.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_CONFIG Copia de seguridad del registro 5.reg");
                    writer2.WriteLine("echo Limpiando el registro...");
                    writer2.WriteLine("goto clean");
                    writer2.WriteLine(":clean");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd %programfiles%");
                    writer2.WriteLine("if exist c:\\%programfiles%\\CCleaner goto ccleaner else goto nc");
                    writer2.WriteLine(":ccleaner");
                    writer2.WriteLine("cd CCleaner");
                    writer2.WriteLine("start CCleaner.exe");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":nc");
                    writer2.WriteLine("set /p usuario = %USERNAME%");
                    writer2.WriteLine("echo Lo sentimos, %usuario%, pero esta versión de PC Clean and Repair sólamente trabaja con el programa CCleaner. En futuras versiones haremos que trabaje con otros programas de ese estilo.");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":fin");
                    writer2.WriteLine("cls");
                    writer2.WriteLine("exit");
                }
                catch (Exception ex2)
                {
                    throw ex2;
                }
                writer3 = new StreamWriter(arch2);
                try
                {
                    writer3.WriteLine("@echo off");
                    writer3.WriteLine("title PCR&color C");
                    writer3.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer3.WriteLine("echo Procediendo a la comprobación de errores en el disco...");
                    writer3.WriteLine("chkdsk /f/r");
                    writer3.WriteLine("echo Procediendo a la defragmentación del disco...");
                    writer3.WriteLine("defrag c:");
                    writer3.WriteLine("echo Procediendo a la comprobación de archivos del sistema corruptos o dañados...");
                    writer3.WriteLine("sfc /scannow");
                    writer3.WriteLine("exit");
                }
                catch (Exception ex3)
                {
                    throw ex3;
                }
                proceso = new ProcessStartInfo();
                proceso.WorkingDirectory = @"%homepath%\PCCR.bat";
                proceso.FileName = "PCR.bat";
                proceso.Verb = "open";
                Thread.Sleep(5000);
                proceso1 = new ProcessStartInfo();
                proceso1.WorkingDirectory = @"%homepath%\Mis documentos\TempCleaner.bat";
                proceso1.FileName = "TempCleaner.bat";
                proceso1.Verb = "delete";
                proceso2 = new ProcessStartInfo();
                proceso2.WorkingDirectory = @"%homepath%\Mis documentos\RegClean.bat";
                proceso2.FileName = "RegClean.bat";
                proceso2.Verb = "delete";
                proceso3 = new ProcessStartInfo();
                proceso3.WorkingDirectory = @"%homepath%\Mis documentos\PCR.bat";
                proceso3.FileName = "PCR.bat";
                proceso3.Verb = "delete";
                proceso4 = new ProcessStartInfo();
                proceso4.WorkingDirectory = @"%homepath%\PCCR.bat";
                proceso4.FileName = "PCR.bat";
                proceso4.Verb = "delete";
                Console.ReadKey();
            }
        }
    }
    

    Estas son las capturas de pantalla que he hecho del error:

    ¿Dónde estará el fallo?


    Santiago Casteleiro

    Thursday, March 15, 2012 8:32 PM
  • cuando se queda la pantala de esta forma, presioans un enter o alguna otra tecla

    porque veo que al final pones

    Console.ReadKey();

    porque en el codigo no intercalas lineas de

    Console.WriteLine()

    para poder ir mostrando por donde pasa el codigo y ver donde se queda


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Thursday, March 15, 2012 8:37 PM
  • Ya sabía lo del Console.Readkey() (de hecho lo uso en todas las aplicaciones de consola que creo), y lo del Console.WriteLine ya lo había pensado, pero he estado revisando el código y creo haber encontrado la causa por la que la aplicación se queda colgada sin hacer. Si te fijas en las líneas de código proceso.FileName = "PCR.bat" y proceso4.FileName = "PCR.bat", éstas hacen referencia al fichero PCR.bat, que no existe, dado que el fichero .bat que crea la aplicación se llama PCCR.bat; por lo que intercalando una C entre la C y la R (de tal manera que quede proceso.FileName = "PCCR.bat" y proceso4.FileName = "PCCR.bat") creo que el problema ya estaría resuelto.

    De todas formas utilizaré Console.WriteLine() para ver si además se para en otra parte.


    Santiago Casteleiro

    Friday, March 16, 2012 12:01 AM
  • Tras llevar varios días intentando solucionar el problema de la ejecución de mi aplicación, tras comprobar que me crea el fichero principal del que se vale pero vacío, he pensado en volver a usar FileStream, pero ahora me sale una excepción en el StreamWriter indicándome que no se puede tener acceso al fichero principal (PCCR.bat) por que está siendo usado por otro proceso (¿?), tal y como se muestra en la siguiente captura de pantalla:

    El código de mi aplicación queda como sigue:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.CompilerServices;
    using System.Diagnostics;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading;
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                string ub = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                string archivo = "PCCR.bat";
                string arch = "TempCleaner.bat", arch1 = "RegClean.bat", arch2 = "PCR.bat";
                ProcessStartInfo proceso, proceso1, proceso2, proceso3, proceso4;
                StreamWriter writer, writer1, writer2, writer3;
                Console.Title = "PC Clean & Repair 1.0";
                archivo = Path.Combine(ub, archivo);
                FileStream fichero = new FileStream(archivo, FileMode.Create, FileAccess.Write);
                writer = new StreamWriter(archivo);
                try
                {
                    writer.WriteLine("@echo off");
                    writer.WriteLine("if exist TempCleaner.bat call TempCleaner.bat");
                    writer.WriteLine("if exist RegClean.bat call RegClean.bat");
                    writer.WriteLine("if exist PCR.bat call PCR.bat");
                    writer.WriteLine("exit");
                    writer.Close();
                }
                catch (Exception ex)
                {
                    ex.Message.Contains("Error no reconocido");
                }
                fichero.Close();
                FileStream fichero1 = new FileStream(arch, FileMode.Create, FileAccess.Write);
                writer1 = new StreamWriter(arch);
                try
                {
                    writer1.WriteLine("@echo off");
                    writer1.WriteLine("title TempCleaner & color 4");
                    writer1.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer1.WriteLine("echo A continuación PC Clean & Repair procederá a eliminar los archivos temporales del ordenador.");
                    writer1.WriteLine("cd c:\\Users\\%username%\\AppData\\Local");
                    writer1.WriteLine("rmdir //S //Q Temp");
                    writer1.WriteLine("echo Eliminando archivos antiguos...");
                    writer1.WriteLine("del dir/s *.bak");
                    writer1.WriteLine("del dir/s *.log");
                    writer1.WriteLine("del dir/s *.OLD");
                    writer1.WriteLine("del dir/s *.sqm");
                    writer1.WriteLine("echo ¡Archivos antiguos eliminados!");
                    writer1.WriteLine("exit");
                    writer1.Close();
                   
                }
                catch (Exception ex1)
                {
                    ex1.Message.Contains("Error no especificado.");
                }
                fichero1.Close();
                FileStream fichero2 = new FileStream(arch1, FileMode.Create, FileAccess.Write);
                writer2 = new StreamWriter(arch1);
                try
                {
                    writer2.WriteLine("@echo off");
                    writer2.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer2.WriteLine("echo Realizando copia de seguridad del registro...");
                    writer2.WriteLine("reg export HKEY_CLASSES_ROOT Copia de seguridad del registro.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_USER Copia de seguridad del registro 2.reg");
                    writer2.WriteLine("reg export HKEY_LOCAL_MACHINE Copia de seguridad del registro 3.reg");
                    writer2.WriteLine("reg export HKEY_USERS Copia de seguridad del registro 4.reg");
                    writer2.WriteLine("reg export HKEY_CURRENT_CONFIG Copia de seguridad del registro 5.reg");
                    writer2.WriteLine("echo Limpiando el registro...");
                    writer2.WriteLine("goto clean");
                    writer2.WriteLine(":clean");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd..");
                    writer2.WriteLine("cd %programfiles%");
                    writer2.WriteLine("if exist c:\\%programfiles%\\CCleaner goto ccleaner else goto nc");
                    writer2.WriteLine(":ccleaner");
                    writer2.WriteLine("cd CCleaner");
                    writer2.WriteLine("start CCleaner.exe");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":nc");
                    writer2.WriteLine("set /p usuario = %USERNAME%");
                    writer2.WriteLine("echo Lo sentimos, %usuario%, pero esta versión de PC Clean and Repair sólamente trabaja con el programa CCleaner. En futuras versiones haremos que trabaje con otros programas de ese estilo.");
                    writer2.WriteLine("goto fin");
                    writer2.WriteLine(":fin");
                    writer2.WriteLine("cls");
                    writer2.WriteLine("exit");
                    writer2.Close();
                }
                catch (Exception ex2)
                {
                    throw ex2;
                }
                fichero2.Close();
                FileStream fichero3 = new FileStream(arch2, FileMode.Create, FileAccess.Write);
                writer3 = new StreamWriter(arch2);
                try
                {
                    writer3.WriteLine("@echo off");
                    writer3.WriteLine("title PCR&color C");
                    writer3.WriteLine("runas /user:%USERNAME% /savecred 'CMD.exe'");
                    writer3.WriteLine("echo Procediendo a la comprobación de errores en el disco...");
                    writer3.WriteLine("chkdsk /f/r");
                    writer3.WriteLine("echo Procediendo a la defragmentación del disco...");
                    writer3.WriteLine("defrag c:");
                    writer3.WriteLine("echo Procediendo a la comprobación de archivos del sistema corruptos o dañados...");
                    writer3.WriteLine("sfc /scannow");
                    writer3.WriteLine("exit");
                    writer3.Close();
                }
                catch (Exception ex3)
                {
                    throw ex3;
                }
                fichero3.Close();
                proceso = new ProcessStartInfo();
                proceso.WorkingDirectory = @"%homepath%\PCCR.bat";
                proceso.FileName = "PCCR.bat";
                proceso.Verb = "open";
                Thread.Sleep(5000);
                proceso1 = new ProcessStartInfo();
                proceso1.WorkingDirectory = @"%homepath%\Mis documentos\TempCleaner.bat";
                proceso1.FileName = "TempCleaner.bat";
                proceso1.Verb = "delete";
                proceso2 = new ProcessStartInfo();
                proceso2.WorkingDirectory = @"%homepath%\Mis documentos\RegClean.bat";
                proceso2.FileName = "RegClean.bat";
                proceso2.Verb = "delete";
                proceso3 = new ProcessStartInfo();
                proceso3.WorkingDirectory = @"%homepath%\Mis documentos\PCR.bat";
                proceso3.FileName = "PCR.bat";
                proceso3.Verb = "delete";
                proceso4 = new ProcessStartInfo();
                proceso4.WorkingDirectory = @"%homepath%\PCCR.bat";
                proceso4.FileName = "PCCR.bat";
                proceso4.Verb = "delete";
                byte[] data = new byte[archivo.Length];
                MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
                MD5.ComputeHash(data);
                Console.ReadKey();
            }
        }
    }
    

    Ignoro cuál es el motivo por el que me da esa excepción.

    Santiago Casteleiro

    Wednesday, March 21, 2012 9:16 PM
  • De acuerdo, en cuanto tenga algo de tiempo lo probaré y ya contaré cómo me ha ido.

    Santiago Casteleiro

    Wednesday, March 21, 2012 11:35 PM