systeminfo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了systeminfo相关的知识,希望对你有一定的参考价值。

运行-cmd-systeminfo
出现提示'systeminfo'不是内部或外部命令,也不是可运行程序或批处理文件.
这是怎么回事?
- -
改成啥摸样?

你的环境变量被改了,可以用两个方法改回来,一个是右击我的电脑--属性--高级---环境变量

也可以在cmd--输入 path c:\windows\system32临时解决
参考技术A - -

没这个命令吧?????
参考技术B 你可以看一下是否有这个文件,一般在c:\windows\system32\systeminfo.exe另外确认一下你的环境变量设置是否有问题,我的运行没问题。

执行“systeminfo”命令后,waitforsingleobject 停止

【中文标题】执行“systeminfo”命令后,waitforsingleobject 停止【英文标题】:After executing "systeminfo" commaind, waitforsingleobject stopped 【发布时间】:2017-04-14 22:35:02 【问题描述】:

因此,如果您运行下面的代码,它将永远停在int retVal = WaitForSingleObject( processInfo.hProcess, INFINITE);。但是当我运行“ipconfig”或“ping 192.168.0.1”而不是“systeminfo”时,代码运行良好。我想知道如何解决这个问题以及导致这个问题的原因是什么?

#include <windows.h>

int WINAPI WinMain(
                   HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpComLine,
                   int nCmdShow)

    SECURITY_ATTRIBUTES secAttr; 
    HANDLE hRead,hWrite;

secAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
secAttr.lpSecurityDescriptor = NULL; 
secAttr.bInheritHandle = TRUE; 
if (!CreatePipe(&hRead,&hWrite,&secAttr,0)) 
 
    return FALSE; 
 

char command[1024];
strcpy(command, "systeminfo");

STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo; 
startupInfo.cb = sizeof(STARTUPINFO); 
GetStartupInfo(&startupInfo); 
startupInfo.hStdError = hWrite;  
startupInfo.hStdOutput = hWrite;    
startupInfo.hStdInput = hRead;      
startupInfo.lpTitle = "CMD";
startupInfo.wShowWindow = SW_HIDE; 
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo)) 
 
    MessageBox(NULL, "Error", NULL, MB_OK);
    CloseHandle(hWrite); 
    CloseHandle(hRead); 
    return FALSE; 
 

char buffer[1024] = 0;         
DWORD bytesRead; 

int retVal = WaitForSingleObject( processInfo.hProcess, INFINITE);
if (retVal == WAIT_FAILED)
    MessageBox(NULL, "WAIT_FAILED", NULL, MB_OK);
else if (retVal == WAIT_TIMEOUT)
    MessageBox(NULL, "WAIT_TIMEOUT", NULL, MB_OK);
ReadFile(hRead,buffer,1024,&bytesRead,NULL);
MessageBox(NULL, buffer, NULL, MB_OK);

CloseHandle(hWrite); 
CloseHandle(hRead);

return 0;

【问题讨论】:

【参考方案1】:

虽然我在运行您的代码时没有遇到任何问题,但我怀疑我知道问题所在。

您可能在尝试写入管道句柄的进程和等待它退出的代码之间陷入僵局。

systeminfo 将至少 2K 的数据写入管道。这可能会超过管道中内置的缓冲区。但是您的程序不会同时从中读取。因此 systeminfo 程序无法退出,因为它一直在写入标准输出。并且您的程序会阻塞等待应用程序退出。经典的僵局。不输出那么多字符的程序可以正常工作。

我没有时间编写一个完整的解决方案,但我相信您会想要使用一个循环来为读取句柄和进程句柄执行 WaitForMultipleObjects。如果可能,请在读取句柄上使用非阻塞或重叠 i/o。

另外,修改您的 ReadFile 调用如下:

DWORD dwResult = ReadFile(hRead,buffer,sizeof(buffer)-1,&bytesRead,NULL);
if (dwResult > 0)

   buffer[dwResult] = '\0';

这样当整个缓冲区被字符填满时,您就可以保证 null 终止。

【讨论】:

好的,你说的对我来说很有意义,我有点明白我的程序中存在什么问题。但是,当你在我的编译器上运行它时,相同的代码是如何工作的呢?我仍然无法弄清楚解决方案。我想在 systeminfo 程序完全退出后读取文件。 你是完全正确的,管道写入buff在我的电脑上是4kb。不知何故,我认为它在你的电脑上是 64kb,这就是它在你的电脑上完美运行的原因。我使用文件重定向输出而不是管道。我现在可以成功获得输出,但我仍然向控制台输入任何解决方案?

以上是关于systeminfo的主要内容,如果未能解决你的问题,请参考以下文章