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

batコマンドのバッチプロセスは、32ビットまたは64ビットシステムかどうかを判断するために、さまざまな方法

2022-02-10 20:21:43

最初のコード: %PROCESSOR_ARCHITECTURE% を渡します。

これは、cmd で以下のように渡すことができます。

        HANDLE hToken = NULL;
	TCHAR szUsername[MAX_PATH];
	TCHAR para[MAX_PATH] = {0};
	TCHAR szUsernamePath[MAX_PATH];
	DWORD dwUsernameLen = MAX_PATH;
	DWORD cursessionid;
	cursessionid = WTSGetActiveConsoleSessionId();
	log_error("WTSGetActiveConsoleSessionId() = %d\n",cursessionid);
	if(!WTSQueryUserToken(cursessionid, &hToken))
	{
		log_error("%s WTSQueryUserToken is failed\n", __FUNCTION__);
	}
	if(!ImpersonateLoggedOnUser(hToken))
	{
		log_error("%s ImpersonateLoggedOnUser is failed\n", __FUNCTION__);
	}
	DWORD UsernamePathSize = ARRAYSIZE(szUsernamePath);
	//Get the current user path
	if (!GetUserProfileDirectory(hToken,szUsernamePath,&UsernamePathSize))
	{
		log_error("%s GetUserProfileDirectory is failed\n", __FUNCTION__);
	}
        BOOL bResult = FALSE;
	PROCESS_INFORMATION pi;
	PSID psid;
	STARTUPINFO si;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = L"winsta0\\\default";
	// 
	// start the process
	//
	LPVOID environment;
	BOOL blockRet = CreateEnvironmentBlock(&environment, hToken, FALSE);
	if (!blockRet)
	{
		log_error("could not create environment block (error: %i)",
			GetLastError());
	}
	else
	{
		//TCHAR Cmdline[MAX_PATH] = _T("/c \\"C:\\Windows\\System32\\\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8\"");
		TCHAR Cmdline[MAX_PATH] = _T("/c \\"C:\Windows\\\System32\\\cleanmgr\" /sagerun:100");
		DWORD creationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;

		bResult = CreateProcessAsUser(
			hToken,
			_T("C:\\Windows\\System32\\\CMD.exe"),
			Cmdline,//_T("InetCpl.cpl,ClearMyTracksByProcess 8"),//L"\\"inetcpl.cpl,clearmytracksbyprocess 8\"",
			//L"/c \"C:\Windows\\\System32\\\cleanmgr\" /sagerun:100",
			NULL,
			NULL,
			FALSE,
			creationFlags,
			environment,
			NULL,
			&si,
			&pi
			);
		log_error("CreateProcessAsUser0 = %d",GetLastError());

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

	RevertToSelf();
	CloseHandle(hToken);  

@echo off
if exist %windir%\SysWOW64 (
 start http://www.baidu.com
) else (
 start https://www.jb51.net
)

x86は32ビット、AMD64は64ビットを意味します。

このバッチコードは非常に簡単で、32ビットシステムならScript Houseを、64ビットシステムならBaiduを開きます。

もちろん、このバッチコードに本当の使い道はなく、単なるテストです。実際には、状況に応じて異なるサービスを登録するなど、このテストはまだまだ有効です

2つ目のコード: if exist %windir%SysWOW64

コード例

@echo off
::Get system version information from system files
for /f "tokens=1* delims=[" %%a in ('ver') do set b=%%b
::Assign version information to variable b
set b=%b:* =%
::Output the specified value
echo %b:~0,4%
echo %PROCESSOR_ARCHITECTURE:~-1%
echo %b:~0,4%%PROCESSOR_ARCHITECTURE:~-1%
::Call the cmd command line corresponding to the specified value
call:%b:~0,4%%PROCESSOR_ARCHITECTURE:~-1%
pause&exit
:5.1.6
echo system version: winxp_32bit
goto:eof
:5.2.6
echo System version: win2003_32bit
goto:eof
:5.2.4
echo System version: win2003_64bit
goto:eof
:6.1.6
echo System version: win7_32bit
goto:eof
:6.1.4
echo System version: win7 or win2008_64bit

原理は、64ビットシステムで通常見られるSysWOW64ディレクトリが存在するかどうかを判断することです。

このバッチコードは非常にシンプルで、32ビットシステムであればScript Houseを、64ビットシステムであればBaiduを開きます。

以下はScript Houseの例です。

Windowsシステムが32bitか64bitかをcmdコマンドバッチで判定する。

@echo off 

IF "%PROCESSOR_ARCHITECTURE%" == "X86" (
 echo 32-bit system
) ELSE (
 echo 64-bit or higher system
)

出力は次のようになります。

引き続き追加

64ビットシステムのレジストリ。

[HKEY_LOCAL_MACHINE]
Identifier"="Intel64 Family 6 Model 62 Stepping 4"。

64ビットシステムのシステム変数です。

PROCESSOR_IDENTIFIER = Intel64 Family 6 Model 62 Stepping 4, GenuineIntel

プロセッサアーキテクチャ = amd64

systeminfo |find "x64" 

基本的にこれで、32ビットと64ビットの区別ははっきりしていますよね。

以下、もう少し詳しく説明します。

システムの32ビットか64ビットか、OSの種類を判別するバッチ処理

方法1

IF PROCESSOR_ARCHITECTURE == amd64 or PROCESSOR_ARCHITEW6432 == amd64 THEN // OS is 64bit ELSE // OS is 32bit END IF Another way to test for the same thing is: IF PROCESSOR_ARCHITECTURE == x86 AND PROCESSOR_ARCHITEW6432 NOT DEFINED THEN // OS is 32bit ELSE // OS is 64bit END IF

方法2
時にはワオを考慮する必要がある

@echo off
for /f "tokens=1* delims=[" %%a in ('ver') do set b=%%b
set b=%b:* =%
goto %b:~0,4%%PROCESSOR_ARCHITECTURE:~-1%
:5.1.6
echo xp_32λ
goto:eof

:6.1.6
echo win7_32λ
goto:eof
:6.1.4
echo win7_64λ

:6.0.6
echo vista_32
::exit

:6.0.4
echo vista_64
::exit
pause

varに格納されているデータ、PROCESSOR_ARCHITECTUREに格納されている内容

@echo off
if %PROCESSOR_ARCHITECTURE%==x86 (echo 32-bit system>c:\a.txt&xcopy /d/y/c/e/h/k "%~dp0123" "C:\Program Files\123\") else (echo 64-bit system >c:\a.txt&xcopy /d/y/c/e/h/k "%~dp0123" "C:\Program Files (x86)\123\")
pause

バッチは32ビット64ビットシステムを検出し、テキストに結果、決定し、適切なプログラムファイルまたはプログラムファイル(x86)にフォルダ123をコピーする?

32ビットか64ビットかを判定し、判定結果をc:㊤a.txtファイルに保存し、判定結果で123フォルダを32ビット系はC:㊤Program Filesフォルダに、64ビット系はC:㊦program files(x86)フォルダにコピーするバッチ処理をしています。
例えば、私は緑のソフトウェアがたくさんある、すべてのソフトウェアは、32ビットまたは64ビットかどうかを判断する必要がない、すべてだけでC:㎤プログラムファイルにコピーし、これはちょうど一時的な設定です、他のバッチファイルのコピーパスには影響しません、右か?

@echo off
if %PROCESSOR_ARCHITECTURE%==x86 (set "var=C:\Program Files") else set "var=C:\Program Files (x86)"
echo %var%
pause

または

@echo off
if %PROCESSOR_ARCHITECTURE%==x86 (set "var=C:\Program Files") else set "var=C:\Program Files (x86)"
echo %var%
pause

そう、上記のコードは環境変数を設定するのではなく、バッチ内に一時的なローカル変数を設定するだけで、バッチを終了すると無効化されるのです。