Problèmes de .BAT en C#

Résolu
Bonjour à tous !

J'ai déployé mon application sur un serveur : te-tst1
dessus, dans le dossier C:\inetpub\wwwroot\CBConfig\Bat\config\ je cré un fichier, disons, toto.txt
ce fichier, je dois le copier dans le dossier qui est sur un autre serveur : 192.168.1.7 dans le dossier \\192.168.1.7\config_files

du coup, j'ai fait le code suivant dans un.bat :
net use L: \\192.168.1.7\config_files /USER:user mdp /persistent:no
XCOPY /E C:\inetpub\wwwroot\CBConfig\Bat\config\*.* L: /Y
net use L: /delete /Y


je cré un lecteur réseau, puis je copie le contenu du dossier dans le lecteur créé, et je déconnecte le lecteur.

code dans visual studio pour appelé le fichier :

public static void ExecuteBatch(string nomFichier)
{
try
{
logger.Debug("nomFichier : " + nomFichier);

Process P = new Process();

HicefCBEntities db = new HicefCBEntities();

var theParam = (from param in db.Parametres
where param.reference == nomFichier
select param).FirstOrDefault();

logger.Debug("theParam.libelle : " + theParam.libelle);

ProcessStartInfo processInfo;
Process process;

processInfo = new ProcessStartInfo(theParam.libelle, "/c ");
processInfo.Verb = "runas";
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
// *** Redirect the output ***
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;

process = Process.Start(processInfo);

logger.Debug("processInfo : " + processInfo);
logger.Debug("process : " + process);

process.WaitForExit(3000);

process.Close();

}
catch (Exception e)
{
logger.Error(e.Message);
}
}


mon paramètre permet de récupérer le chemin du fichier bat.

contenu de mon fichier log :

2016-07-22 15:10:12.2000|DEBUG|HicefCB.Controllers.CBController|test
2016-07-22 15:10:12.2000|DEBUG|HicefCB.Controllers.CBController|test
2016-07-22 15:10:36.9900|DEBUG|HicefCB.Controllers.FichierController|config
2016-07-22 15:10:36.9900|DEBUG|HicefCB.Controllers.FichierController|config
2016-07-22 15:10:36.9900|DEBUG|HicefCB.Controllers.Batch|nomFichier : config_files.bat
2016-07-22 15:10:36.9900|DEBUG|HicefCB.Controllers.Batch|nomFichier : config_files.bat
2016-07-22 15:10:37.0056|DEBUG|HicefCB.Controllers.Batch|theParam.libelle : C:\inetpub\wwwroot\CBConfig\Bat\config_files.bat
2016-07-22 15:10:37.0056|DEBUG|HicefCB.Controllers.Batch|theParam.libelle : C:\inetpub\wwwroot\CBConfig\Bat\config_files.bat
2016-07-22 15:10:37.0056|DEBUG|HicefCB.Controllers.Batch|processInfo : System.Diagnostics.ProcessStartInfo
2016-07-22 15:10:37.0056|DEBUG|HicefCB.Controllers.Batch|processInfo : System.Diagnostics.ProcessStartInfo
2016-07-22 15:10:37.0056|DEBUG|HicefCB.Controllers.Batch|process : System.Diagnostics.Process (cmd)
2016-07-22 15:10:37.0056|DEBUG|HicefCB.Controllers.Batch|process : System.Diagnostics.Process (cmd)

le fichier log du bat est toujours vide, mais lorsque je l’exécute à la main, ça fonctionne et ça me donne ça :

C:\inetpub\wwwroot\CBConfig\Bat\config\toto.txt
1 File(s) copied
L: was deleted successfully.

Voilà, si vous avez des questions, n'hésitez pas.

3 réponses

  1. Bon, au final, j'ai fait autrement.
    J'ai crée un lecteur réseau.
    puis j'y cré mon fichier.
    et je supprime le lecteur réseau.

            public static void connexionReseau(string nomFichier)
    {
    try
    {

    Process P = new Process();
    HicefCBEntities db = new HicefCBEntities();

    var theParam = (from param in db.Parametres
    where param.reference == nomFichier
    select param).FirstOrDefault();

    ProcessStartInfo processInfo;
    Process process;
    processInfo = new ProcessStartInfo(@"C:\Windows\System32\cmd.exe", "/c " + "net use L: "+theParam.libelle+" /USER:user mdp /persistent:no");
    processInfo.Verb = "runas";
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    // *** Redirect the output ***
    processInfo.RedirectStandardError = true;
    processInfo.RedirectStandardOutput = true;

    process = Process.Start(processInfo);

    process.WaitForExit(3000);

    process.Close();

    }
    catch (Exception e)
    {
    logger.Error(e.Message);
    }
    }
    public static void deconnexionReseau()
    {
    try
    {
    Process P = new Process();

    HicefCBEntities db = new HicefCBEntities();
    ProcessStartInfo processInfo;
    Process process;
    processInfo = new ProcessStartInfo(@"C:\Windows\System32\cmd.exe", "/c " + "net use L: /delete /Y ");
    processInfo.Verb = "runas";
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    // *** Redirect the output ***
    processInfo.RedirectStandardError = true;
    processInfo.RedirectStandardOutput = true;

    process = Process.Start(processInfo);

    process.WaitForExit(3000);

    process.Close();

    }
    catch (Exception e)
    {
    logger.Error(e.Message);
    }
    }
    1. Alors, j'avance petit à petit.
      lorsque mon fichier bat ne contient que :
      XCOPY /E  C:\inetpub\wwwroot\CBConfig\Bat\config\*.*  C:\inetpub\wwwroot\CBConfig\Bat\dossiertest\ /Y

      la mon fichier bat est bien appelé et fonctionne.
      Je pense que c'est la création du lecteur réseau qui doit planter. Est-ce un problème de droit ? car mon appli fonctionne avec le user system normalement.
      1. Bonjour

        pourquoi ne pas faire ta copie dans le code c#?
        1. Bonjour,

          Je fais une copie en batch car lorsque j'essaye de créer mon fichier directement dans \\192.168.1.7\config_files, je n'ai pas les droits.
          je suppose que tu fais référence à System.IO.File.Copy();
          c'est vrai que je n'ai pas essayé. peut ton le faire sur le réseau ? Et en rentrant mon user et mdp ?