我已经打开了控制面板上的 telnet 选项 - 程序/功能。虽然 telnet 手动工作正常,但是当我从我的 C# 库下面运行时,我收到此错误:
“'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件。”
这是我用来启动 Telnet 的代码:
Process.Start("cmd", "/k telnet")
这与手动从命令提示符运行它之间有什么区别,我该如何克服这种区别?
通过控制面板 - 程序和功能 - 打开或关闭 Windows 功能安装Telnet 客户端时,安装telnet.exe
到目录中%SystemRoot%\System32
。
该目录%SystemRoot%\System32
用于 64 位 Windows 上的 64 位应用程序。因此,安装的可执行文件telnet.exe
也是 64 位版本。此目录还包含 64 位版本的cmd.exe
.
系统环境变量PATH包含%SystemRoot%\System32
负责查找%SystemRoot%\System32\cmd.exe
和%SystemRoot%\System32\telnet.exe
执行时没有文件扩展名和路径。
但另外还有一个%SystemRoot%\SysWOW64
包含 32 位版本可执行文件的 32 位应用程序目录。
微软在文档页面WOW64 实现细节和文件系统重定向器中解释%SystemRoot%\System32
了 32 位应用程序对文件系统的访问如何自动重定向到%SystemRoot%\SysWOW64
.
安装Telnet Client 时没有telnet.exe
安装32 位版本。%SystemRoot%\SysWOW64
那么会发生什么:
Process.Start("cmd", "/k telnet")
当 C# 库被编译为 64 位应用程序使用的 64 位库时,64 位 Windows 会查找并%SystemRoot%\System32\cmd.exe
启动%SystemRoot%\System32\telnet.exe
.
但是,当 C# 库被编译为 32 位应用程序使用的 32 位库时,64 位 Windows 会通过文件系统重定向器找到并启动,该文件系统重定向器在当前目录或任何目录中的环境变量PATHEXT中%SystemRoot%\SysWOW64\cmd.exe
找不到telnet.*
列出的文件扩展名。环境变量PATH因为目录中没有文件。telnet.exe
%SystemRoot%\SysWOW64
最好的解决方案绝对是在 C# 库中使用静态(或动态)telnet 库来独立于Panagiotis Kanavos 的telnet.exe
建议。在我看来,对于通过进程调用使用外部可执行文件的每个 C# 程序员来说,这是一种耻辱,程序员也可以很容易地编写 C# 代码。使用带有搜索词的任何万维网搜索引擎都会返回大量带有解决方案的页面,例如Stack Overflow 上的C# Telnet 库。C# telnet
当然,也可以使用GetEnvironmentVariable方法获取环境变量SystemRoot 的第一个值以获取 Windows 目录的路径,或者使用GetWindowsDirectory或GetSystemWindowsDirectory方法更好。
然后将此字符串值与"\\System32\\telnet.exe"
新字符串连接,并使用File.Exists方法检查具有该完整路径的文件是否存在。如果该文件存在于安装了 32 位版本的 32 位 Windows 上(telnet.exe
如果 C# 应用程序也是 32 位应用程序)或在telnet.exe
安装了 64 位的 64 位 Windows 上(如果 C# 应用程序是 64 位应用程序),则此文件具有完整路径和文件扩展名的名称可用于进程调用。
否则将 Windows 目录路径与"\\Sysnative\\telnet.exe"
并检查具有该完整路径的文件是否存在。如果在安装了 64 位版本的 64 位 Windows 上,telnet.exe
如果 C# 应用程序是 32 位应用程序,则可以使用此路径从 32 位应用程序中运行 64 位 telnet 客户端可执行文件。
但是,如果这也失败了,telnet.exe
则根本没有安装,这就是为什么telnet.exe
通常不建议在 C# 代码应用程序中使用from的原因。
老实说,我不明白为什么在 C# 库中有代码,它只启动一个命令进程执行telnet.exe
而没有选项,因此需要用户输入,并在 telnet 客户端会话终止后保持命令进程运行。C# 库函数可以替换为telnet.exe
Windows 桌面或用户 Windows 开始菜单中的快捷方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句