如何在 %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 转到 Property > Configuration Properties > C/C++ > Recompiled Headers > Recompiled Header > Not Using Recompiled Headers 请看这个链接***.com/questions/39845899/…【参考方案2】:

在用户可写位置创建/运行可执行文件是需要小心的(利用人们运行提升的进程,然后运行攻击负载),否则只需将几件事联系在一起。

在 Windows 上,大多数环境变量是出于遗留/兼容性原因而存在的,SHGetKnownFolderPath 是查找文件夹的现代方式。它为路径分配了足够的空间,小心使用 C-API 的手动内存,尽快获得unique_ptrwstring。它适用于 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 中创建的临时文件以将文件上传到服务器?

在 Appdata 文件夹中创建文本文件时出现异常,它说文件正在被另一个进程使用

如何在Android中创建一个在其上旋转的圆形进度条?

如何在 Python 函数中创建简单的 PyQt 弹出窗口并在其末尾关闭?