Cpp實現window上cmd執行效果

Cpp實現window上cmd執行效果

文章目錄

  • Cpp實現window上cmd執行效果
      • 1.頭文件包含部分
      • 2.`main` 函數部分
      • 3. 獲取當前工作目錄部分
      • 4.主循環部分
      • 5.退出條件部分
      • 6.處理 `cd` 命令部分
      • 7.執行其他命令部分
      • 8.讀取命令輸出部分
      • 9.關閉管道并處理返回碼部分
      • 10.源碼

1.頭文件包含部分

#include <iostream>
#include <string>
#include <cstdlib>
#include <windows.h>  // 用于 Windows 系統的 SetCurrentDirectory 函數
  • #include <iostream>:引入標準輸入輸出流庫,這樣就能使用 std::cout 進行輸出,std::cin 進行輸入。
  • #include <string>:引入標準字符串庫,用于處理 std::string 類型的字符串。
  • #include <cstdlib>:引入標準庫,包含了一些常用的函數和類型,這里可能在后續使用 _popen 等函數時會依賴它。
  • #include <windows.h>:引入 Windows 系統的頭文件,包含了許多 Windows API 函數,這里主要使用 GetCurrentDirectoryASetCurrentDirectoryA 函數。

2.main 函數部分

int main() {std::string inputCommand;char currentDir[MAX_PATH];
  • int main():程序的入口函數,返回值為 int 類型,通常返回 0 表示程序正常結束。
  • std::string inputCommand;:定義一個 std::string 類型的變量 inputCommand,用于存儲用戶輸入的命令。
  • char currentDir[MAX_PATH];:定義一個字符數組 currentDir,用于存儲當前工作目錄,MAX_PATH 是 Windows 系統中定義的最大路徑長度。

3. 獲取當前工作目錄部分

// 使用 ANSI 版本的函數
if (!GetCurrentDirectoryA(MAX_PATH, currentDir)) {std::cerr << "無法獲取當前工作目錄,錯誤代碼: " << GetLastError() << std::endl;return 1;
}
  • GetCurrentDirectoryA(MAX_PATH, currentDir):調用 Windows API 函數 GetCurrentDirectoryA 獲取當前工作目錄,并將其存儲到 currentDir 數組中。A 表示使用 ANSI 版本,以處理 char* 類型的字符串。
  • if (!GetCurrentDirectoryA(MAX_PATH, currentDir)):如果獲取當前工作目錄失敗,GetCurrentDirectoryA 函數返回 0,則執行 if 語句塊。
  • std::cerr << "無法獲取當前工作目錄,錯誤代碼: " << GetLastError() << std::endl;:使用 std::cerr 輸出錯誤信息,GetLastError() 函數返回最后一次系統調用的錯誤代碼。
  • return 1;:返回非零值表示程序異常結束。

4.主循環部分

while (true) {std::cout << currentDir << "> ";  // 顯示當前工作目錄作為提示符std::getline(std::cin, inputCommand);
  • while (true):創建一個無限循環,使程序持續等待用戶輸入命令。
  • std::cout << currentDir << "> ";:輸出當前工作目錄和一個大于號作為提示符,模擬命令行界面。
  • std::getline(std::cin, inputCommand);:從標準輸入讀取一行內容,并將其存儲到 inputCommand 變量中。

5.退出條件部分

if (inputCommand == "exit") {break;
}
  • if (inputCommand == "exit"):檢查用戶輸入的命令是否為 exit
  • break;:如果是 exit,則跳出循環,結束程序。

6.處理 cd 命令部分

// 處理 cd 命令
if (inputCommand.substr(0, 2) == "cd") {std::string newDir = inputCommand.substr(3);// 使用 ANSI 版本的函數if (SetCurrentDirectoryA(newDir.c_str())) {// 更新當前工作目錄if (!GetCurrentDirectoryA(MAX_PATH, currentDir)) {std::cerr << "無法更新當前工作目錄,錯誤代碼: " << GetLastError() << std::endl;continue;}}else {std::cerr << "無法更改目錄到 " << newDir << std::endl;}continue;
}
  • if (inputCommand.substr(0, 2) == "cd"):檢查用戶輸入的命令是否以 cd 開頭。
  • std::string newDir = inputCommand.substr(3);:如果是以 cd 開頭,提取 cd 后面的目錄路徑,存儲到 newDir 變量中。
  • SetCurrentDirectoryA(newDir.c_str()):調用 Windows API 函數 SetCurrentDirectoryA 嘗試將當前工作目錄更改為 newDir
  • if (!GetCurrentDirectoryA(MAX_PATH, currentDir)):如果更改成功,再次調用 GetCurrentDirectoryA 函數更新 currentDir 數組。如果更新失敗,輸出錯誤信息并繼續下一次循環。
  • else:如果更改目錄失敗,輸出錯誤信息并繼續下一次循環。
  • continue;:跳過本次循環的剩余部分,繼續等待用戶輸入下一個命令。

7.執行其他命令部分

// 使用 _popen 打開一個管道來執行命令
FILE* pipe = _popen(inputCommand.c_str(), "r");
if (!pipe) {std::cerr << "無法打開管道!" << std::endl;continue;
}
  • _popen(inputCommand.c_str(), "r"):使用 _popen 函數打開一個管道,執行用戶輸入的命令,并以只讀模式讀取命令的輸出。
  • if (!pipe):如果打開管道失敗,輸出錯誤信息并繼續下一次循環。

8.讀取命令輸出部分

// 用于存儲命令輸出的緩沖區
char buffer[1024];
std::string res = "";
// 從管道中讀取命令輸出
while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {res += buffer;
}
  • char buffer[1024];:定義一個字符數組 buffer,用于存儲從管道中讀取的命令輸出。
  • std::string res = "";:定義一個 std::string 類型的變量 res,用于存儲命令的完整輸出。
  • while (fgets(buffer, sizeof(buffer), pipe) != nullptr):使用 fgets 函數從管道中讀取數據,每次最多讀取 sizeof(buffer) 個字符,直到讀取到文件末尾(返回 nullptr)。讀取到的數據存儲在 buffer 中,并追加到 res 變量中。

9.關閉管道并處理返回碼部分

// 關閉管道
int returnCode = _pclose(pipe);
if (returnCode == 0) {std::cout << "命令執行成功。" << std::endl;std::cout << "命令輸出信息如下:" << std::endl;std::cout << res << std::endl;
}
else {std::cout << "命令執行失敗,返回碼:" << returnCode << std::endl;
}
  • _pclose(pipe):關閉管道并返回命令的退出狀態碼。
  • if (returnCode == 0):檢查返回碼是否為 00 通常表示命令執行成功,此時輸出成功信息和命令的輸出內容;否則輸出失敗信息和返回碼。

10.源碼

#include <iostream>
#include <string>
#include <cstdlib>
#include <windows.h>  // 用于 Windows 系統的 SetCurrentDirectory 函數int main() {std::string inputCommand;char currentDir[MAX_PATH];// 使用 ANSI 版本的函數if (!GetCurrentDirectoryA(MAX_PATH, currentDir)) {std::cerr << "無法獲取當前工作目錄,錯誤代碼: " << GetLastError() << std::endl;return 1;}while (true) {std::cout << currentDir << "> ";  // 顯示當前工作目錄作為提示符std::getline(std::cin, inputCommand);if (inputCommand == "exit") {break;}// 處理 cd 命令if (inputCommand.substr(0, 2) == "cd") {std::string newDir = inputCommand.substr(3);// 使用 ANSI 版本的函數if (SetCurrentDirectoryA(newDir.c_str())) {// 更新當前工作目錄if (!GetCurrentDirectoryA(MAX_PATH, currentDir)) {std::cerr << "無法更新當前工作目錄,錯誤代碼: " << GetLastError() << std::endl;continue;}}else {std::cerr << "無法更改目錄到 " << newDir << std::endl;}continue;}// 使用 _popen 打開一個管道來執行命令FILE* pipe = _popen(inputCommand.c_str(), "r");if (!pipe) {std::cerr << "無法打開管道!" << std::endl;continue;}// 用于存儲命令輸出的緩沖區char buffer[1024];std::string res = "";// 從管道中讀取命令輸出while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {res += buffer;}// 關閉管道int returnCode = _pclose(pipe);if (returnCode == 0) {std::cout << "命令執行成功。" << std::endl;std::cout << "命令輸出信息如下:" << std::endl;std::cout << res << std::endl;}else {std::cout << "命令執行失敗,返回碼:" << returnCode << std::endl;}}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79918.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32 HAL庫FreeRTOS 中斷管理

一、引言 在嵌入式系統開發中&#xff0c;STM32 微控制器憑借其高性能、低功耗和豐富的外設資源&#xff0c;被廣泛應用于各種領域。FreeRTOS 作為一款輕量級、開源且功能強大的實時操作系統&#xff0c;為多任務處理提供了良好的支持。中斷是嵌入式系統中實現實時響應外部事件…

在 UE5 編輯器中,由于游戲設置 -> EV100 設置,點擊播放前后的光照不同。如何保持點擊播放前后的光照一致?

?In Unreal Engine 5 (UE5), discrepancies in lighting between the editor and play modes are often due to auto exposure settings, particularly when using the EV100 system. To maintain consistent lighting across both modes, follow these steps:?YouTube1Epic …

[python] set

1.添加元素 在 Python 中&#xff0c;向 set 添加一個元素可以使用 add() 方法。如果添加的元素已經存在于 set 中&#xff0c;add() 不會重復添加&#xff08;因為 set 具有自動去重的特性&#xff09;。 方法 1&#xff1a;add(element)&#xff08;添加單個元素&#xff0…

第一期第18講26:23

shell腳本以 .sh為后綴&#xff0c;里面存放著一行行要運行的linux指令。 shell腳本第一行一定為 #!/bin/bash&#xff0c;表示使用bash。 shell文件舉例如下&#xff1a; #!/bin/bash echo "hello shell!" shell文件默認沒有可執行權限&#xff0c;因此 chmod 777 m…

解決 Ubuntu 下 VTune 無法收集 CPU 硬件時間計數數據的問題

解決 Ubuntu 下 VTune 無法收集 CPU 硬件時間計數數據的問題 在 Ubuntu 上使用 Intel VTune Profiler 時遇到無法收集 CPU 硬件性能計數器數據的問題&#xff0c;通常是由于權限和系統配置問題導致的。以下是解決方案&#xff1a; 1. 檢查并加載性能監控模塊 首先確保 Linux…

健康元 以韌性換彈性

拼韌性的時候到了&#xff01; 一面是復雜的市場、政策環境與醫藥行業轉型所疊加形成的向下壓力&#xff1b;一面是AI技術深度賦能醫藥企業創新加速的向上機遇。 中國藥企在經歷了一輪群體性低潮期后&#xff0c;進入“結構性”分化的階段。 在這一階段上&#xff0c;一些財…

csv數據的讀取

在地理信息系統&#xff08;GIS&#xff09;項目中&#xff0c;CSV&#xff08;Comma-Separated Values&#xff09;文件是一種常見的數據格式&#xff0c;用于存儲表格數據。CSV 文件因其簡單易用、可被多種軟件讀取而廣泛應用于數據交換和存儲。ArcPy 提供了強大的功能&#…

android Stagefright框架

作為Android音視頻開發人員&#xff0c;學習Stagefright框架需要結合理論、源碼分析和實踐驗證。以下是系統化的學習路徑&#xff1a; 1. 基礎準備 熟悉Android多媒體體系 掌握MediaPlayer、MediaCodec、MediaExtractor等核心API的用法。 理解Android的OpenMAX IL&#xff08…

【基于WSAAsyncSelec模型的通信程序設計】

文章目錄 一、實驗背景與目的二、實驗設計與實現思路1. 設計思想2. 核心代碼實現 總結 一、實驗背景與目的 這次實驗主要是為了讓大家了解基于 WSAAsyncSelect 模型通信程序的編寫、編譯和執行過程。通過實踐操作&#xff0c;深入掌握這種模型在實現計算機之間通信時的應用。 …

JAVA:利用 Apache Tika 提取文件內容的技術指南

1、簡述 Apache Tika 是一個強大的工具,用于從各種文件中提取內容和元數據。??Tika 支持解析文檔、??圖像、??音頻、??視頻文件以及其他多種格式,非常適合構建??搜索引擎、??內容管理系統和??數據分析工具。 樣例代碼:https://gitee.com/lhdxhl/springboot-…

數碼管靜態顯示一位字符(STC89C52單片機)

#include <reg52.h> sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; //用數組來存儲數碼管的真值表&#xff0c;數組將在下一章詳細介紹 unsigned char code LedChar[] { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82…

計算機視覺與深度學習 | 工業視覺缺陷檢測如何檢小缺陷?背景概述,原理,檢測難點,常用的檢測算法,算法評估指標,新項目算法選擇,算法部署

工業視覺小缺陷檢測技術解析 背景概述 工業視覺缺陷檢測是智能制造中質量控制的核心環節,而小缺陷檢測(如微米級劃痕、點狀污漬、細微裂紋等)因其目標小、易受干擾等特點,成為技術難點。隨著制造業對精度要求提升(如3C電子、半導體、精密零部件行業),傳統人工目檢和基…

OBS 日期時間.毫秒時間腳本 date-and-time.lua

文章目錄 OBS 日期時間.毫秒時間腳本&#xff1a;效果 OBS 日期時間.毫秒時間腳本&#xff1a; obs obslua source_name ""last_text "" format_string "" activated false-- 此函數用于獲取精確的毫秒級時間戳&#…

進程和線程(1)

前言&#xff1a; 在計算機中cpu就像一座工廠&#xff0c;這個工廠里面有許多的車間&#xff0c;但是假如工廠的電力有限&#xff0c;一次只能供給一個車間使用&#xff0c;也就是說當一個車間在進行工作的時候&#xff0c;其他車間是不能工作的&#xff08;單個cpu只能運行一…

入門-C編程基礎部分:16、 預處理器

飛書文檔https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf C 預處理是編譯過程中一個單獨的步驟&#xff0c;是一個文本替換工具而已。所有的預處理命令都是以井號&#xff08;#&#xff09;開頭。 指令描述#define定義宏#ifdef如果宏已經定義&#xff0c;則返…

Ubuntu下安裝和卸載MySQL

Ubuntu下安裝和卸載MySQL 下面的演示系統版本&#xff1a;Ubuntu 24.04 更新系統軟件包 在開始安裝之前&#xff0c;建議先更新系統的軟件包列表&#xff0c;以確保所有依賴項是最新的。 sudo apt update && sudo apt upgrade -y安裝MySQL服務器 Ubuntu的官方軟件…

【Python爬蟲實戰篇】--爬取豆瓣電影信息(靜態網頁)

網站&#xff0c;&#xff1a;豆瓣電影 Top 250 爬取豆瓣前250電影的信息&#xff0c; F12打開網頁控制臺&#xff0c;查看網頁元素&#xff0c; 發現網頁數據直接可以查看到&#xff0c;為靜態網頁數據&#xff0c;較為簡單 目錄 1.第一步使用urllib庫獲取網頁 2.第二步使…

【Unity知識點詳解】Unity中泛型單例的使用,兼容WebGL

今天來講下Unity中泛型單例的使用&#xff0c;包含普通單例和繼承MonoBehaviour的單例。重點是需要兩種泛型單例兼容WebGL平臺&#xff0c;話不多說直接開始。 泛型單例的設計目標 作為泛型單例&#xff0c;需要實現以下幾個目標&#xff1a; 全局唯一&#xff0c;在程序的整個…

Python進程與線程的深度對比

一、核心概念對比 1. 進程&#xff08;Process&#xff09; 操作系統級獨立單元&#xff1a;每個進程擁有獨立的內存空間&#xff08;堆、棧、代碼段&#xff09; 資源隔離性&#xff1a;崩潰不影響其他進程 多核并行&#xff1a;可充分利用多核CPU資源 2. 線程&#xff0…

Django 入門指南:構建強大的 Web 應用程序

什么是 Django&#xff1f; Django 是一個開源的高層次 Python Web 框架&#xff0c;旨在快速開發安全且可維護的網站。它通過簡化常見的 Web 開發任務&#xff0c;幫助開發者專注于開發應用的核心功能。Django 實現了“快速開發”和“盡量少的重復”的理念&#xff0c;提供了…