1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

バットコードを共有し、ドラッグ&ドロップでファイル情報を取得可能

2022-02-10 15:52:57

前文

ご存知のように、ファイルを扱うのにコマンドラインを使うことがありますが、パスやファイル名を定期的に何度も繰り返す必要がある場合、手動で入力したりコピー&ペーストするのは非常に非効率的です。

batコマンドを使えば、その作業を軽減することができます。

batとはWindowsのバッチファイルのことで、1行1行がDOSコマンドになっています。

ファイルのプロパティを取得する

#define CONFIGPATH "config\\config.json"
CProcessGroup* pProcessServer; 
void ServiceMain(int argc, char** argv); 
void ControlHandler(DWORD request); 
int InitService();

//Get the configuration file in the current directory
Json::Value GetConfig(std::string strPath = "")
{
	char szCurrentDir[MAX_PATH + 1] = {0};
	char szFileName[MAX_PATH] = {0};
	GetModuleFileNameA(NULL, szCurrentDir, MAX_PATH);


	sprintf(szFileName,"%s",&(strrchr(szCurrentDir, '\\'))[1]);
	(strrchr(szFileName, '.')) [0] = 0;


	(strrchr(szCurrentDir, '\\'))[1] = 0;

	Json::Reader jrReader;
	Json::Value jvProCnfg;
	std::ifstream is;

	is.open(std::string(szCurrentDir)+CONFIGPATH, std::ios::binary);
	
	if(!jrReader.parse(is, jvProCnfg))
	{

		return jvProCnfg;
	}

	std::string capstr = strfunc::StrW2A(strfunc::StrA2W(jvProCnfg.toFastString(),CP_UTF8));
	if(!jrReader.parse(capstr, jvProCnfg))
	{
		ProcessGroupLog().WriteError(L"%s,parameter open profile %s failed",
			strfunc::StrA2W(__FUNCTION__).c_str(),
			strfunc::StrA2W(capstr).c_str());
		return jvProCnfg;
	}


	ProcessGroupLog().WriteInfo(L"%s,open configuration complete Parameters: %s",
			strfunc::StrA2W(__FUNCTION__).c_str(),
			strfunc::StrA2W(jvProCnfg.toFastString()).c_str());


	return jvProCnfg;
}

//Entry
int _tmain(int argc, _TCHAR* argv[])
{


	SERVICE_TABLE_ENTRY ServiceTable[2];
	ServiceTable[0].lpServiceName = L"ProcessProtectService";
	ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

	ServiceTable[1].lpServiceName = NULL;
	ServiceTable[1].lpServiceProc = NULL;


	StartServiceCtrlDispatcher(ServiceTable); 


	return 0;
}

//Service execution function
void ServiceMain(int argc, char** argv) 
{ 
	int error; 

	ServiceStatus.dwServiceType = 
	SERVICE_WIN32; 
	ServiceStatus.dwCurrentState = 
	SERVICE_START_PENDING; 
	ServiceStatus.dwControlsAccepted = 
	SERVICE_ACCEPT_STOP | 
	SERVICE_ACCEPT_SHUTDOWN;
	ServiceStatus.dwWin32ExitCode = 0; 
	ServiceStatus.dwServiceSpecificExitCode = 0; 
	ServiceStatus.dwCheckPoint = 0; 
	ServiceStatus.dwWaitHint = 0; 


	
	hStatus = RegisterServiceCtrlHandler(
	L"ProcessProtectService", 
	(LPHANDLER_FUNCTION)ControlHandler); 
	if (hStatus == (SERVICE_STATUS_HANDLE)0) 
	{ 
		// Registering Control Handler failed
		return; 
	} 
	// Initialize Service 
	error = InitService(); 
	if (!error) 
	{
		// Initialization failed
		ServiceStatus.dwCurrentState = 
		SERVICE_STOPPED; 
		ServiceStatus.dwWin32ExitCode = -1; 
		SetServiceStatus(hStatus, &ServiceStatus); 
		return; 
	} 
	// We report the running status to SCM. 
	ServiceStatus.dwCurrentState = 
	ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
	SetServiceStatus (hStatus, &ServiceStatus);


	
	// MEMORYSTATUS memory;
	// The worker loop of a service
	while (ServiceStatus.dwCurrentState == 
	SERVICE_RUNNING)
	{


		if(!pProcessServer)
		{
			pProcessServer = new CProcessGroup();
			if(pProcessServer)
			{
				Json::Value jv = GetConfig();

				pProcessServer->Start(jv["processlist"]);
			}
		}
		Sleep(SLEEP_TIME);
	}
	return; 
}

// Control reception, only service shutdown and service shutdown responses are done
void ControlHandler(DWORD request) 
{ 
	switch(request) 
	{ 
		case SERVICE_CONTROL_STOP: 
			ProcessGroupLog().WriteInfo(L"%s,service shutdown",
				strfunc::StrA2W(__FUNCTION__).c_str());
			ServiceStatus.dwWin32ExitCode = 0; 
			ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
			SetServiceStatus (hStatus, &ServiceStatus);
			if(pProcessServer)
			{
				pProcessServer->Stop();
				delete pProcessServer;
				pProcessServer = NULL;
			}
			return; 




		case SERVICE_CONTROL_SHUTDOWN: 
			ProcessGroupLog().WriteInfo(L"%s,service shutdown",
				strfunc::StrA2W(__FUNCTION__).c_str());
			ServiceStatus.dwWin32ExitCode = 0; 
			ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
			SetServiceStatus (hStatus, &ServiceStatus);
			if(pProcessServer)
			{
				pProcessServer->Stop();
				delete pProcessServer;
				pProcessServer = NULL;
			}
			return; 

		default:
			break;
	} 


	// Report current status
	SetServiceStatus (hStatus, &ServiceStatus);
	return; 
}


int InitService(){
	
	ProcessGroupLog().WriteInfo(L"%s,service started",
				strfunc::StrA2W(__FUNCTION__).c_str());
	pProcessServer = NULL;
	return true;
}


上記のコマンドをtxtファイルに入れて、接尾辞を.batに変更します。ランダムなファイルを.batファイルのアイコンにドラッグします。

簡単なデモ:Javaファイルのコンパイルと実行

私が初めてJavaを学んだとき、コマンドラインからコンパイルして実行しなければなりませんでしたが、ディレクトリにcdしてjavacとjavaコマンドを毎回手入力するのは非常に不便でした。そこで私は怠け者になり、.batファイルを書きました。

//Close all processes with the same name
bool CProcessGroup::CloseProcess(const std::wstring& name)
{
	std::wstring nameUp = name;

	transform(name.begin(), name.end(), nameUp.begin(), ::toupper);

	PROCESSENTRY32W entry = { 0 };
	entry.dwSize = sizeof(PROCESSENTRY32W);

	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

	if (Process32FirstW(snapshot, &entry)) 
	{
		while (Process32NextW(snapshot, &entry)) 
		{
			std::wstring temp = entry.szExeFile;

			transform(temp.begin(), temp.end(), temp.begin(), ::toupper);
			if (nameUp.compare(temp) == 0)
			{
				if(!TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, entry.th32ProcessID), 0))
				{
					ProcessGroupLog().WriteInfo(L"%s Ending process: %s id:%s Failed! ",
						strfunc::StrA2W(__FUNCTION__).c_str(),
						name.c_str(),
						entry.th32ProcessID);
				}
				

			}
		}
	}

	CloseHandle(snapshot);
	return true;
}

書き込みの後に1回ドラッグすれば完了です。

要約する

この記事の内容が、あなたの勉強や仕事に役立つことを願っています。また、何か質問があれば、コメントを残してください。