?
1、windows/Linux c++ 获取CMD指令执行的返回结果
无论是在windows还是linux下我们都可以借助popen执行终端指令并获取到返回值。
/// 执行cmd指令并返回结果
string getCmdResult(const string &strCmd)
{
char buf = {0};
FILE *pf = NULL;
if( (pf = popen(strCmd.c_str(), "r")) == NULL )
{
return "";
}
string strResult;
while(fgets(buf, sizeof buf, pf))
{
strResult += buf;
}
pclose(pf);
unsigned int iSize = strResult.size();
if(iSize > 0 && strResult == 'n') // linux
{
strResult = strResult.substr(0, iSize - 1);
}
return strResult;
}
但是值得注意的是,windows下诸多的指令需要管理员的权限才能执行,这是很令人头疼的。
除了上述方法外,我们先大致罗列下windows下可以执行命令行指令的方法:
1、WinExec() ==》无法直接使用管理员权限,无法获取返回信息,只能判断是否执行
QString cmdstr = QString("cmd /c taskkill /im iphelper.exe /t /f");
WinExec(cmdstr.toLatin1().data(), SW_HIDE);
2、ShellExecute()==》可使用管理员权限,无法获取返回信息
ShellExecute(0,"runas", LPCSTR("cmd.exe"),LPCSTR("/c net user administrator /active:yes"),"",SW_HIDE);
3、CreateProcessAsUser()==》可使用管理员权限,无法获取返回信息,可判断是否执行成功
BOOL CreateProcessAsUser(
HANDLE hToken, // handle to a token representing the logged-on user
LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // whether new process inherits handles
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
显然,在我们渴望获取到指令返回的信息时,以上的几种方法都不如人意。考虑到‘runas’方法,那么我们能否既使用管理员权限执行指令的同时获取到指令执行返回结果信息呢?答案是肯定的。
先熟悉下windows的runas指令:
RUNAS 用法:
RUNAS ]
/user:<UserName> program
RUNAS ]
/smartcard program
RUNAS /trustlevel:<TrustLevel> program
/noprofile 指定不应该加载用户的配置文件。
这会加速应用程序加载,但
可能会造成一些应用程序运行不正常。
/profile 指定应该加载用户的配置文件。
这是默认值。
/env 要使用当前环境,而不是用户的环境。
/netonly 只在指定的凭据限于远程访问的情况下才使用。
/savecred 用用户以前保存的凭据。
/smartcard 如果凭据是智能卡提供的,则使用这个选项。
/user <UserName> 应使用 USER@DOMAIN 或 DOMAINUSER 形式
/showtrustlevels 显示可以用作 /trustlevel 的参数的
信任级别。
/trustlevel <Level> 应该是在 /showtrustlevels 中枚举
的一个级别。
program EXE 的命令行。请参阅下面的例子
示例:
> runas /noprofile /user:mymachineadministrator cmd
> runas /profile /env /user:mydomainadmin "mmc %windir%system32dsa.msc"
> runas /env /user:user@domain.microsoft.com "notepad "my file.txt""
注意: 只在得到提示时才输入用户的密码。
注意: /profile 跟 /netonly 不兼容。
注意: /savecred 跟 /smartcard 不兼容。
如何打开 CMD 命令提示符窗口
方法一:开始菜单 -> Windows 系统 -> 命令提示符。
方法二:按下快捷键 Win + R 打开运行,输入 cmd 回车。
方法三:点击任务栏搜索按钮,搜索 cmd 并打开。
方法四:在资源管理器的地址栏输入 cmd 并回车,cmd 打开后会自动定位到当前目录。
方法五:右键点击开始菜单的 Win 图标 -> 命令提示符。
每条命令输入后,回车运行。命令正确则执行完毕后回到 > 状态;命令错误返回错误信息。
CMD 常用命令总结
小技巧:
输入 help,查看帮助;
Tab 键,自动补全;
上/下方向键,查看历史命令;
右键窗口标题栏 -> 属性,可以修改外观样式。
# 关机、重启、注销、休眠、定时
关机:shutdown /s
重启:shutdown /r
注销:shutdown /l
休眠:shutdown /h /f
取消关机:shutdown /a
定时关机:shutdown /s /t 3600(3600 秒后关机)
# 目录操作
切换目录,进入指定文件夹:
切换磁盘:d:(进入 d 盘)
切换磁盘和目录:cd /d d:/test(进入 d 盘 test 文件夹)
进入文件夹:cd test1test2(进入 test2 文件夹)
返回根目录:cd
回到上级目录:cd ..
新建文件夹:md test
显示目录内容:
显示目录中文件列表:dir
显示目录结构:tree d:test(d 盘 test 目录)
显示当前目录位置:cd
显示指定磁盘的当前目录位置:cd d:
# 网络操作
延迟和丢包率:ping ip/域名
Ping 测试 5 次:ping ip/域名 -n 5
清除本地 DNS 缓存:ipconfig /flushdns
路由追踪:tracert ip/域名
# 进程/服务操作
进程管理:
显示当前正在运行的进程:tasklist
运行程序或命令:start 程序名
结束进程,按名称:taskkill /im notepad.exe(关闭记事本)
结束进程,按 PID:taskkill /pid 1234(关闭 PID 为 1234 的进程)
服务管理:
显示当前正在运行的服务:net start
启动指定服务:net start 服务名
停止指定服务:net stop 服务名
保存为 .bat 可执行文件
我们可以将常用的命令输入记事本中,并保存为后缀为 .bat 的可执行文件。
以后只要双击该文件即可执行指定命令;将文件放入系统【启动】目录中,可以实现开机自动运行。
注:启动目录位置:
使用实践
使用示例 1:
在资源管理器卡死时,我们可以使用 taskkill 命令重启。将下面命令保存为 ReExplorer.bat,在需要时双击即可强制重启资源管理器。或直接打开 CMD 运行命令也可以。
taskkill /f /im explorer.exe & start explorer.exe
使用示例 2:
迅雷会在后台自动运行 ThunderPlatform.exe 进程和 XLServicePlatform 服务,如果当前没有使用迅雷的话显然没必要。
我们可以将如下代码保存为 killxl.bat,并放入【启动】目录,开机后会自动运行该脚本,清除这两个进程。
net stop XLServicePlatform
taskkill /F /im ThunderPlatform.exe