我正在创建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 }}文件。
答案 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;
}