如何在 %appdata% 中创建文件夹,在其中创建 .bat 文件,然后执行?
Posted
技术标签:
【中文标题】如何在 %appdata% 中创建文件夹,在其中创建 .bat 文件,然后执行?【英文标题】:How to create folder in %appdata%, create .bat file in it, and then execute it? 【发布时间】:2019-04-10 07:40:20 【问题描述】:我正在创建 C++ 代码,它将创建一些 .bat
文件并将其存储在 %appdata%
文件夹中。我已成功创建文件,但仍然无法创建文件夹并执行它。
下面是我的简单代码,它看起来并不简单,但它可以在%appdata%
中创建.bat
文件,也许有人可以帮我找到简单的。
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
#include <direct.h>
int main(int argc, char **argv)
using namespace std;
std::ofstream aaa;
ostringstream aaa;
aaa.open(aaa1.str());
aaa1 << getenv("appdata") << "/"
<< "test.bat";
aaa.open(aaa1.str());
Updater << "@echo on" << endl;
Updater << "echo \"on\"" << endl;
return 0;
代码在%appdata%
中成功创建了.bat
文件,但我需要存储在%appdata%
的新文件夹中,比如New Folder
,然后执行.bat
文件。
【问题讨论】:
请正确命名您的变量,您是否同时拥有 ofstream 和 ostringstream 名称 'aaa'? 您应该使用SHGetFolderPath 来获取早于 Windows Vista 的 Windows 上的 AppData 文件夹。或者 >= Windows Vista 上的 SHGetKnownFolderPath 函数。 This question 可以帮到你很多。 @Tom,对不起,但我还是 C++ 的新手,我从许多来源获得的代码,也许你可以帮我做一个简单的.. @Neijwiert 我已经阅读了,但仍然无法开始,然后我使用 getenv 得到了上面的代码 【参考方案1】:创建目录 1st 在字符串中使用 _dupenv_s() 获取路径添加新文件夹名称“\New Folder”2nd 使用 _mkdir(str.c_str()) 创建目录; 3rd 使用 std::ofstream outf(str) 创建“test.bat”;
#include "stdafx.h"
#include<fstream>
#include<iostream>
#include<conio.h>
#include<direct.h>
using std::cout;
using std::cin;
using std::endl;
int tmain(int argc, TCHAR* argv[])
char *pValue;
size_t len;
errno_t err = _dupenv_s(&pValue, &len, "APPDATA");
std::string NewFile = "\\new";
std::string str(pValue);
str = str + NewFile;
_mkdir(str.c_str());
str = str + "\\Sample.bat"; //
std::ofstream outf(str);
if (!outf)
printf("error ");
outf << "this is line1" << endl;
outf << "line 2" << endl;
return 0;
请!如果有帮助别忘了投票
【讨论】:
是否需要“stdafx.h”?我还没有找到它。如果我尝试没有“stdafx.h”错误说必须定义入口点.. @akash das 请看链接***.com/questions/39845899/… @Achilles29 转到在用户可写位置创建/运行可执行文件是需要小心的(利用人们运行提升的进程,然后运行攻击负载),否则只需将几件事联系在一起。
在 Windows 上,大多数环境变量是出于遗留/兼容性原因而存在的,SHGetKnownFolderPath
是查找文件夹的现代方式。它为路径分配了足够的空间,小心使用 C-API 的手动内存,尽快获得unique_ptr
或wstring
。它适用于 Vista,如果真的需要,还有旧的 API。
wchar_t *str = nullptr;
SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DEFAULT, NULL, &str); // CHECK RETURN
...use str...
CoTaskMemFree(str);
还要注意文件路径中的 Unicode 和空格。
进程有两个选项,cstdlib
标头中有 system(command_line)
,或者对于高级用途,请查看 Windows CreateProcessW
。比如:
STARTTUPINFO startup;
startup.cb = sizeof(startup);
PROCESS_INFORMATION pi;
CreateProcessW(NULL, L"cmd.exe /C C:\\ThePath\\myfile.bat", NULL, NULL, FALSE, 0, NULL, NULL, &startup, &pi);
显然特定于 Windows。 Linux、Mac 等都有自己的文件系统布局和安全性。
C++ fstream
不会自动为您创建目录。您可以将此类目录设置为安装程序的一部分,但要在运行时执行此操作,C++17 有 std::filesystem::create_directories
,它采用路径。如果不能使用 C++17,请使用 CreateDirectory
或 _mkdir
。再次在 Windows 上注意 Unicode。
【讨论】:
以上是关于如何在 %appdata% 中创建文件夹,在其中创建 .bat 文件,然后执行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C 语言的 windows 的 %appdata% 路径中创建目录并创建文件
如何使用 log4net 在 AppData 文件夹中创建文件
如何正确引用/检索在 AppData 中创建的临时文件以将文件上传到服务器?