バットコードを共有し、ドラッグ&ドロップでファイル情報を取得可能
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回ドラッグすれば完了です。
要約する
この記事の内容が、あなたの勉強や仕事に役立つことを願っています。また、何か質問があれば、コメントを残してください。
関連
-
バッチスクリプトによる特定ディレクトリでのGit-Bashウィンドウの立ち上げ
-
DOSコマンドラインからHaoZipでファイルを圧縮する方法
-
cmdコマンドのリダイレクト出力 2>&1 解説
-
Windowsのcmdコマンドラインの入出力リダイレクト問題
-
プリントキャッシュをクリアして、プリントサービスを再起動する(dos環境)。
-
cmdでdドライブまたはdドライブ内のフォルダーを入力する
-
リテラシーのためのDosバッチ処理コマンド
-
Batはforfilesを使って期限切れのファイルを自動的に一括削除する
-
certutilを使ったHex2BinとBase64の暗号化方式
-
カオスな雨を実現するバッチプロセス(マトリクス効果)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
cmdでファイル名をフィルタリングする2つの方法
-
bat バッチビット操作のサンプルコード
-
DOS比較演算子(LSS,LEQ,GTR,GEQ,EQU,NEQ)
-
batファイルのpause delayのスクリプトコードを説明する。
-
Windows一括検索・コピー/カットファイルの例
-
指定したディレクトリにある全ファイルの一覧を取得するバッチ処理(bat)です。
-
指定されたディレクトリからファイル名を一括で抽出します。
-
DOSバッチ処理による時限式シャットダウン操作の方法詳細
-
DOSバッチコマンド For loopコマンド詳細説明
-
dosコマンドでWindowsのスケジュールタスクをインポート/エクスポート