如何在%appdata%中创建文件夹,在其中创建.bat文件,然后执行它?

时间:2019-04-10 07:40:21

标签: c++

我正在创建C ++代码,它将创建一些.bat文件并将其存储在%appdata%文件夹中。我已经成功创建了文件,但是仍然无法创建文件夹并执行它。

下面是我的简单代码,它看起来并不简单,但是可以在.bat中创建%appdata%文件,也许有人可以帮助我找到简单的文件。

#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;
}

代码成功在.bat中创建了%appdata%文件,但是我需要存储在%appdata%的新文件夹中,例如New Folder,然后执行{{1 }}文件。

2 个答案:

答案 0 :(得分:0)

要在用户可写的位置创建/运行可执行文件是要小心的事情(让人们将您的进程提升为运行状态,然后运行攻击有效负载),否则,只有两件事需要结合在一起。

在Windows上,大多数这些环境变量是出于遗留/兼容性原因而存在的,SHGetKnownFolderPath是查找文件夹的现代方法。它为路径分配了足够的空间,请小心使用C-API的手动存储,并尽快将其设为class SeleniumTest(LiveServerTestCase): @classmethod def setUpClass(cls): cls.port = settings.PORT cls.host = settings.HOSTNAME super().setUpClass() cls.selenium = webdriver.Remote( command_executor=settings.SELENIUM_REMOTE_EXECUTOR, desired_capabilities=webdriver.common.desired_capabilities.DesiredCapabilities.FIREFOX, ) cls.selenium.implicitly_wait(10) cls.selenium.get('%s%s' % (cls.live_server_url, '/')) @classmethod def tearDownClass(cls): cls.selenium.quit() super().tearDownClass() def setUp(self): self.selenium.get("{}{}".format(self.live_server_url, '/')) class I18nTestCase(SeleniumTest): def wait_to_be_clickable(self, by, val): return WebDriverWait(self.selenium, 45).until( expected_conditions.element_to_be_clickable((by, val)) ) def wait_for_site_to_reload(self): def is_ready(driver): return driver.execute_script("return document.readyState") == "complete" WebDriverWait(self.selenium, 60).until(is_ready) def set_language_to_german(self): language_menu = Select(self.selenium.find_element_by_id("language_id")) language_menu.select_by_visible_text('Deutsch (de)') go_button = self.selenium.find_element_by_id("language_submit_button") go_button.click() def test_german_index(self): self.set_language_to_german() self.wait_for_site_to_reload() headline = self.selenium.find_element_by_xpath("/html/body/div[3]/h1").text self.assertEquals(headline, "Gib das zu überprüfende Passwort ein:") self.check_footer() unique_ptr。它可以在Vista中运行,如果确实需要,则可以使用较旧的API。

wstring

还要注意文件路径中的Unicode和空格。

进程有两个选项,wchar_t *str = nullptr; SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DEFAULT, NULL, &str); // CHECK RETURN ...use str... CoTaskMemFree(str); 标头中有system(command_line),或者要进阶使用,请查看Windows CreateProcessW。像这样:

cstdlib

显然特定于Windows。 Linux,Mac等具有自己的文件系统布局和安全性。

C ++ 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); 不会自动为您创建目录。您可以将这些目录设置为安装程序的一部分,但要在运行时进行安装,C ++ 17具有std::filesystem::create_directories,该目录带有一个路径。如果您不能使用C ++ 17,请使用CreateDirectory_mkdir。再次在Windows上注意Unicode。

答案 1 :(得分:0)

创建目录 第一个使用字符串中的_dupenv_s()获取路径,添加新文件夹名称“ \ New Folder”
第二个使用_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;
}
请!如果有帮助,别忘了投票