2017-10-20 24 views
0

Je lance un fichier VBS qui doit être exécuté sur la version 64 bits de cscript. Sur la ligne de commande, lorsque j'appelle cscript, il ouvre la version 64 bits située au C:\Windows\System32\cscript.exe et le fichier VBS fonctionne correctement. Cependant, je voudrais appeler ce fichier VBS via C# en tant que processus. Démarrage du processus avec le nom de fichier comme cscript ouvre cscript, mais ouvre uniquement la version 32 bits, située à C:\Windows\SysWoW64\cscript.exe.CScript lors de l'appel en tant que processus dans C# ouvre uniquement la version 32 bits

Même lorsque j'ai défini FileName pour pointer spécifiquement sur la version 64 bits de cscript, il charge uniquement la version 32 bits.

Comment puis-je forcer le processus à ouvrir la version 64 bits de cscript?

Voici mon code, y compris le chemin du fichier de version 64 bits expliqué ci-dessus:

string location = @"C:\location"; 
Process process = new Process(); 
process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe"; 
process.StartInfo.WorkingDirectory = [email protected]"\VBS\"; 
process.StartInfo.Arguments = "scriptName.vbs"; 
process.Start(); 

Répondre

1

En fonction de vos besoins, il existe une autre solution.

Un peu d'histoire: Lorsque vous exécutez une application 64 bits et essayez de démarrer cscript.exe alors vous appelez C:\Windows\System32\cscript.exe (ou plus général %windir%\System32\cscript.exe)

Toutefois, lorsque vous exécutez une application 32 bits puis chaque appel à %windir%\System32\ est automatiquement redirigé vers %windir%\SysWOW64\. Dans ce répertoire, vous trouverez toutes vos DLLs 32 bits. Cette redirection est effectuée par Windows en interne et votre application ne reconnaît aucune différence.

Pour accéder %windir%\System32\ à partir d'une application 32 bits, vous pouvez utiliser %windir%\Sysnative\, à savoir process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe"; devrait fonctionner même si vous compilez votre application en 32 bits.

Remarque, le dossier %windir%\Sysnative\ n'existe pas dans un environnement 64 bits, donc vous pouvez vérifier votre gestion environnement par Environment.Is64BitProcess, si

if Environment.Is64BitProcess { 
    process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe"; 
} else { 
    process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe"; 
} 

Voir aussi File System Redirector

+0

Bonne réponse, plus concrète, ce qui est bien d'avoir un enregistrement au fur et à mesure que Visual Studio mélange leurs options avec chaque version. – user2494584

0

Une réponse simple a surgi:

Dans mon application C# Je crée, dans Visual Studio (2017) avait choisi mon Platform target à Prefer 32-bit, qui devrait peut-être mieux s'appeler "force 32 bits". En désélectionnant cette option, mon processus s'exécutait en 64 bits, à la fois en spécifiant le chemin 64 bits comme le code ci-dessus, mais aussi en exécutant simplement le cscript par son nom.

process.StartInfo.FileName = "cscript"; 

Activer cette option dans Propriétés> Créer> Préférez 32 bits

+0

Vous pouvez sélectionner votre propre commentaire comme réponse donc les gens ne regardent pas pour voir si on y répond. –

+1

Je peux "accepter ma propre réponse dans 2 jours" (: – user2494584