如何从 Windows 控制台调用 .exe (C++) 以在不同目录(或任何目录)中创建文件夹?

Posted

技术标签:

【中文标题】如何从 Windows 控制台调用 .exe (C++) 以在不同目录(或任何目录)中创建文件夹?【英文标题】:How to call an .exe (C++) from windows console to create a folder in a different directory (or any directory)? 【发布时间】:2020-06-19 20:20:34 【问题描述】:

这几天我一直在研究一个主题,但没有成功。我是 C++ 菜鸟,作为实践,我决定制作一个版本控制系统的基本(非常基本)副本

我已将项目分成多个步骤。第一步(分为活动)是:

    用户在 Windows 控制台中搜索他要跟踪的文件所在的目录。假设他到达了期望的路径:C:\MyProjectFolder\ProjectToTrack> 进入 ProjectToTrack 文件夹后,用户应用以下命令:C:\MyProjectFolder\ProjectToTrack> emi track . "emi" 是我在 C++ 中创建的 .EXE 的名称,track 参数告诉到可执行文件以在 ProjectToTrack 文件夹内创建一个隐藏文件夹。 注意:显然emi.exe不在路径C:\MyProjectFolder\ProjectToTrack中,让我们说 emi.exeC:\ProgramFiles\emi\emi.exe

就是这样,一旦完成,我将通过第二步,但我稍后会处理这个问题。

目前,在练习和查看文档后,我已经:

    .exe 在作为参数发送给它的路径中创建一个隐藏文件夹,话虽如此... 我也知道如何通过 windows 控制台将参数发送到 .exe

但是,我仍然无法得到的是:

    通过控制台从任何目录调用emi.exe (C:\ProgramFiles\emi\emi.exe)(需要跟踪任何文件夹中的任何文件) . 当C:\MyProjectFolder\ProjectToTrack> emi track 应用时,我知道如何发送参数track em> 到 emi.exe,但是,很明显我还必须捕获当前路径(我从控制台访问的路径),以便 emi.exe 知道在哪里创建隐藏的跟踪文件夹;好吧,我仍然不知道如何捕获并将此路径发送到.exe的主要功能。

我没有找到与我需要的相关的东西,英语不是我的默认语言,所以也许我没有使用正确的术语,我希望我在这里所说的可以理解。

PS.1. 我目前正在尝试使用 "windows.h" 构建此项目,如果您的 cmets 与此库相关,我将不胜感激。一旦我明白了这一点,我将开始练习可移植性。

PS.2.我不想要详细的解决方案,我只是想要一个意见或建议,也许还有一些链接可以找到我需要的东西,剩下的我可以做。

谢谢!

【问题讨论】:

如果您来自 Linux,通常在 Windows 中创建可以从/传递到控制台应用程序的东西是一个坏主意。 即使是简单的 VCS 对新手来说也是一项复杂的任务。我向你的雄心致敬。 @MichaelChourdakis,我理解,但我并不是说我会采用相同的代码并尝试使其在另一个平台上运行,我的意思是也许我可以将我所学的应用到采用另一种范式,从头开始一个更有趣的可移植项目。 @user4581301,雄心勃勃还是愚蠢,我现在不知道 :),无论如何这是一个有趣的项目,现在的想法是学习。 当我想嘲笑那些志存高远的人时,我记得这个人在 90 年代初就用“只是一个爱好,不会像 gnu 那样大而专业”的操作系统搞砸了一轮内核只是为了好玩/学习。有趣的旁注,过了一会儿,他对版本控制软件的状态很生气,并大量开发了 git。 【参考方案1】:
    通过控制台从任何目录调用 emi.exe (C:\ProgramFiles\emi\emi.exe)(需要跟踪任何文件夹中的任何文件)。

为此,您需要将可执行文件的文件夹(即 C:\ProgramFiles\emi)添加到名为 PATH 的系统全局变量中(Windows 和 Linux 都以这种方式工作,并且也必须是 MAC OS,但我没用过)。

    当应用 C:\MyProjectFolder\ProjectToTrack> emi track 时,我知道如何将参数 track 发送到 emi.exe,但是显然我还必须捕获当前路径(我从控制台访问的路径) , 以便 emi.exe 知道在哪里创建隐藏的跟踪文件夹;好吧,我仍然不知道如何捕获并将此路径发送到.exe的主要功能。

为此,请在此处查看此 STD 函数:https://en.cppreference.com/w/cpp/filesystem/current_path(我个人从未使用过它,但一定是您要查找的内容)。

祝你工作顺利!

【讨论】:

A1. 天啊,我觉得好傻,这几周我为不同的程序添加了环境变量,我不知道为什么我没有考虑它前。我认为当您经常考虑同一件事时,就会发生这种情况,外部观察会有所帮助。 A2. 我一定会检查它是否适用于我的需要。好吧,我会应用这些建议,然后我会带着结果回来。谢谢! 不客气。无论如何,让我们知道结果;) 效果很好,我可以从任何目录(环境变量)调用emi.exe;而且,我能够捕捉到我所在的路线。我仍然需要添加一些条件来控制某些行为,但第一步几乎完成了。非常感谢! 很高兴我能帮上忙,感谢您接受我的回答。也可以考虑对其进行投票。【参考方案2】:

如果用户没有将目标路径作为参数显式传递,EXE 可以使用 Win32 GetCurrentDirectory() 函数,或在 C++17 及更高版本中的标准 std::filesystem::current_path() 函数,来检索其当前的“工作目录”。

如果用户将控制台窗口导航到C:\MyProjectFolder\ProjectToTrack,然后执行C:\ProgramFiles\emi\emi.exe,则当前工作目录最初将是C:\MyProjectFolder\ProjectToTrack

【讨论】:

以上是关于如何从 Windows 控制台调用 .exe (C++) 以在不同目录(或任何目录)中创建文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# windows 应用程序调用 C dll 会导致 svchost.exe 崩溃

无法访问显示组件 - 从 Windows 服务调用

如何从 C++/Qt 中的 .exe 和 .dlls 中读取图标(在 Windows 上)?

如何查看 dll (c) exe 调用了哪个函数?

如何用Lua.EXE调用Lua文件啊?

Windows 控制面板调用命令