我正在运行一个VBS文件,该文件需要在64位版本的cscript上执行。在命令行上,当我调用cscript时,它将打开位于C:\Windows\System32\cscript.exe
的64位版本,并且VBS文件可以正常工作。
但是,我想通过C#将此VBS文件称为一个进程。以FileName为cscript
来启动进程确实会打开cscript,但只会打开位于C:\Windows\SysWoW64\cscript.exe
的32位版本。
即使我将FileName设置为专门指向cscript的64位版本,它也只加载32位版本。
如何强制进程打开cscript的64位版本?
这是我的代码,包括上面解释的64位版本文件路径:
string location = @"C:\location";
Process process = new Process();
process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe";
process.StartInfo.WorkingDirectory = location+@"\VBS\";
process.StartInfo.Arguments = "scriptName.vbs";
process.Start();
最佳答案
根据您的要求,还有另一种解决方案。
一些背景知识:当您运行64位应用程序并尝试启动cscript.exe
时,您会调用C:\Windows\System32\cscript.exe
(或更通用的%windir%\System32\cscript.exe
)
但是,当您运行32位应用程序时,每次对%windir%\System32\
的调用都会自动重定向到%windir%\SysWOW64\
。在此目录中,您将找到所有32位DLL。此重定向由Windows内部完成,您的应用程序无法识别任何差异。
为了从32位应用程序访问%windir%\System32\
,您可以使用%windir%\Sysnative\
,即process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe";
应该可以工作,即使您将应用程序编译为32位。
注意,文件夹%windir%\Sysnative\
在64位环境中不存在,因此您可以通过Environment.Is64BitProcess
检查运行环境,因此
if Environment.Is64BitProcess {
process.StartInfo.FileName = @"C:\Windows\System32\cscript.exe";
} else {
process.StartInfo.FileName = @"C:\Windows\Sysnative\cscript.exe";
}
另见File System Redirector
注意,注册表也存在类似的机制,请参见Registry Redirector
关于c# - CScript在C#中作为进程调用时仅打开32位版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46855084/