计划
计划是从windows窗体应用程序中禁用并随后启用设备。为了测试我的计划的第一个构建块,我使用管理权限打开cmd,以下操作非常完美:
> devcon hwids =ports
> devcon hwids *VID_10C4*
> devcon disable *VID_10C4*
> devcon enable *VID_10C4*我可以在设备管理器中看到设备被禁用并再次启用。
我还可以通过将命令放入批处理文件并以管理权限从cmd运行所有这些命令。以上所述告诉我,我的计划基本上是好的。
应用程序
然而,我实际上想要做的是在windows窗体应用程序中实现相同的目标:
uiAccess="false" requestedExecutionLevel level="requireAdministrator“
//构建字符串字符串strCmdText = "'/c cd“+ prodPath +”& dir“+”> logs\logFileEnablePrt.txt \“;//运行命令var p=新的System.Diagnostics.Process();var psi =新的ProcessStartInfo("CMD.exe",strCmdText);psi.Verb = "runas";//管理权限p.StartInfo = psi;p.WaitForExit();;p.Start()
然而,
//构建字符串字符串strCmdText = "'/c cd“+ prodPath +”& devcon =端口“+”> logs\logFileEnablePrt.txt \“;//运行命令var p=新的System.Diagnostics.Process();var psi =新ProcessStartInfo("CMD.exe",strCmdText);psi.Verb = "runas";// admin rights p.StartInfo = psi;p.WaitForExit();;p.Start()
cmd窗口中的错误是:
'devcon' is not recognized as an internal or external command,可操作的程序或批处理文件。
到底怎么回事?
以上这些让我感到困惑。我已经证明了命令是有效的。我已经证明了我的C#代码是有效的。但当我加入2组的时候,它不起作用.
注:我的C#程序运行在我的D:驱动器上,如果这有什么不同.
基于评论的更新
@Compo使用您的代码,它的操作与我的完全相同。我看到一个空日志文件&没有对设备进行任何更改。我将/c更改为/k,这样我就可以看到cmd终端上发生了什么,我看到了以下内容:

我甚至尝试过您的代码C:\\Windows\\System32\\devcon hwids =usb直接指向devcon。同时也尝试了\devcon.exe的完整性。令人费解的错误是:

我可以看到翻转的devcon.exe文件就坐在那里的文件夹!它有什么理由不承认它呢?
另外,使用您编写的命令,日志文件名实际上是logFileEnablePrt.txt‘。我同意你的命令看起来是对的,所以不要问我为什么会这样!

@Panagiotis Kanavos使用您的代码,我得到以下错误:

这是在线p.Start();。我试着放入devcon.exe,甚至整个路径(我检查了文件夹在我的路径中,它确实在)。过不了这关。实际上,我无意中发现了你分享的答案,我已经来到了这堵砖墙。
发布于 2022-05-09 08:13:37
这是为我工作的代码,我没有端口设备,所以我把它改为usb。
public static void Main()
{
string prodPath = @"c:\devcon\x64";
// Build String
string strCmdText =
"/c \"cd /d " + prodPath +
" && devcon hwids =usb " +
" > log.txt \"";
// Run command
var p = new Process();
var psi = new ProcessStartInfo("CMD.exe", strCmdText);
psi.Verb = "runas"; // admin rights
p.StartInfo = psi;
p.Start();
p.WaitForExit();
}发布于 2022-05-13 13:42:15
工作了几步认为我可能有答案..。

仅指定devcon失败,因为expected...windows找不到它所在的文件夹,因为它不在windows中的%PATH%变量中。
如果我指定了完整的路径,但是它能工作.

从原始代码中还不清楚,但是如果您的devcon副本位于System32或Syswow目录中,您可能也遇到了仿真问题.see here....
EDIT1::证明这一点的一种方法是执行Direcory.GetFiles(包含devcon的目录),并查看结果是否与您预期的一致。
至于将参数传递给devcon,我会尝试这样的方法,而不是试图连接一个巨大的cmd行。

一个类似的例子,但使用netstat:

编辑2::另一个例子,但与devcon:



构建的目标平台是x64。
EDIT3::将我的应用程序构建设置为x86:

发布于 2022-09-13 02:06:06
在研究了上面的答案和评论之后,我似乎有一些可靠的工作方法,显然我想分享给大家,以供仔细研究和将来使用。
所以,我的函数最后看起来是这样的:
private int enablePort(string action)
{
while (true)
{
// Command Arg
string devconPath = @"c:\Windows\SysNative";
string strCmdText =
"'/c \"cd /d \"" +
devconPath +
"\" && c:\\Windows\\SysNative\\devcon " + action + " *VID_10C4* " +
"> \"" + prodPath + "\\logs\\logFileEnablePrt.txt\"\"";
// Process
var p = new Process();
var psi = new ProcessStartInfo()
{
Arguments = strCmdText,
Verb = "runas",
FileName = "CMD.exe",
UseShellExecute = true
};
p.StartInfo = psi;
p.Start();
p.WaitForExit();
// Grab log output
string logPath = prodPath + "\\logs\\logFileEnablePrt.txt";
Console.WriteLine("logPath = " + logPath);
string tempFile = System.IO.File.ReadAllText(logPath);
System.Console.WriteLine("Contents of WriteText.txt = \n{0}", tempFile);
// Check if it worked
var success = false;
if (tempFile.Contains(action))
{
success = true;
return 0;
}
// Error -> Allow user to try again!
if (MessageBox.Show("Was unable to " + action + " Test Jig COM port. Unlug & Replug USB. Check COM port is enabled if not working.", "COM Port Problem", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return -1;
}
}
}呼叫代码是:
this.enablePort("disable");
int milliseconds = 3000;
await Task.Delay(milliseconds);
this.enablePort("enable");正如您在上面的代码中所看到的,我记录了所有的内容,以了解发生了什么.通过调试器,我现在可以看到禁用之后:
USB\VID_10C4&PID_EA60\0001 :禁用1个设备。
然后在启用之后:
USB\VID_10C4&PID_EA60\0001 :启用了1个设备。
我需要强调的另一件事是,在测试期间,我认为我可以将串行外设连接到端口上,并通过检查连接来确定它是否可以成功地禁用和启用。这不管用。上述代码仅在端口空闲时才能工作。也许理解底层软件的人可能会冒险解释这是为什么。
https://stackoverflow.com/questions/72105087
复制相似问题