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

指定したディレクトリにある全ファイルの一覧を取得するバッチ処理(bat)です。

2022-02-09 20:05:20

入力パスがフォルダかどうかを判断し、もしそうなら、そのフォルダ以下のすべてのファイル(サブフォルダ以下のものも含む)を取得します。
パスと一緒にファイル名を表示させたい場合は、dir行の%%~nxiを変更する必要があります。

// pch.cpp: source file corresponding to the precompiled header; required for successful compilation

#include "pch.h"

#include <windows.h>
#include <stdio.h>
#include <userenv.h>
#include <iostream>
#include <Wtsapi32.h>
#pragma comment(lib, "Wtsapi32.lib")
#pragma comment(lib, "Userenv.lib")
#include <tchar.h>
#include <atlconv.h>
#include <tlhelp32.h>

void main(int argc, WCHAR *argv[])
{
	
	//BOOL CreateProcessAsUser(
		//HANDLE hToken, //process the token indicating the logged-in user
		//LPCTSTR lpApplicationName, //a pointer to the name of the executable module
		//LPTSTR lpCommandLine, //pointer to the command line string
		//LPSECURITY_ATTRIBUTES lpProcessAttributes, //processing security attributes
		//LPSECURITY_ATTRIBUTES lpThreadAttributes, //thread-safe attributes
		//BOOL bInheritHandles, //whether the new process inherits processing
		//DWORD dwCreationFlags, //creation flags
		//LPVOID lpEnvironment, //pointer to the new environment block
		//pointer LPCTSTR lpCurrentDirectory, //pointing to the current directory name
		//pointer LPSTARTUPINFO lpStartupInfo, //pointer to STARTUPINFO
		// LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
		//);

	HANDLE hToken = NULL;
	BOOL bResult = FALSE;
	PROCESS_INFORMATION pi;
	STARTUPINFO si;
	ZeroMemory(&si, sizeof(STARTUPINFO));//clear memory
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = L"winsta0\\\default";

	
	LPVOID environment;
	BOOL blockRet = CreateEnvironmentBlock(&environment, hToken, FALSE);
	if (!blockRet)
	{
		printf("could not create environment block (error: %i)",GetLastError());
	}
	else
	{
		TCHAR Cmdline[MAX_PATH] = _T("C:\\Windows\\system32\\\notepad.exe");
		DWORD creationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;

		bResult = CreateProcessAsUser(
			hToken,
			NULL,
			Cmdline,
			NULL,
			NULL,
			FALSE,
			creationFlags,
			environment,
			NULL,
			&si,
			&pi
		);
		if (bResult)
		{
			printf("CreateProcessAsUser success = %d", bResult);
		}
		else
		{
			printf("CreateProcessAsUser failed = %d", GetLastError());
		}
		

		// close the handles
		if (bResult && pi.hProcess ! = INVALID_HANDLE_VALUE)
		{
			WaitForSingleObject(pi.hProcess, INFINITE);
			CloseHandle(pi.hProcess);
		}
		else
		{
			printf("CreateProcessAsUser1 = %d", GetLastError());
		}
		if (pi.hThread ! = INVALID_HANDLE_VALUE)
			CloseHandle(pi.hThread);
		DestroyEnvironmentBlock(environment);
	}

	RevertToSelf();
	CloseHandle(hToken);

}

スクリプトハウスエディタでテストした結果、正常に動作することが確認できました。