batコマンドのバッチプロセスは、32ビットまたは64ビットシステムかどうかを判断するために、さまざまな方法
最初のコード: %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
そう、上記のコードは環境変数を設定するのではなく、バッチ内に一時的なローカル変数を設定するだけで、バッチを終了すると無効化されるのです。
関連
-
バッチバットは、同じ内容のtxtテキストの最初の列の最後の列に数字を追加する
-
バッチ処理における文字列分割コード
-
cmd 環境変数コマンド set 永続的な環境変数の設定 コマンド setx
-
バッチプロセスでポート135、137、445などを閉じる実装コード(ランサムウェア)
-
ワンクリックcmdでJavaの環境変数を表示、変更(上書き、追加)などを設定。
-
Windowsでbatスクリプトを使用したFTPの時間指定アップロードとダウンロード
-
cmdでdドライブまたはdドライブ内のフォルダーを入力する
-
指定したフォルダー内のファイルを遅延して削除する方法
-
FTPファイル一括アップロード
-
dosコマンドでWindowsのスケジュールタスクをインポート/エクスポート
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
batの一括出力でコードが乱れる問題の解決
-
管理者権限でbatバッチを実行させる方法
-
自動コード投入とプロジェクトデプロイメントのためのバッチファイルbatスクリプト
-
サービスが正常に稼働しているかどうかを判断するためのBATバッチ処理(バッチ処理コマンド総合アプリ)
-
システム時間抽出のためのBATバッチコード(バグ修正)
-
batファイルのpause delayのスクリプトコードを説明する。
-
cmd.exe 共通スタートアップ・パラメーター入門
-
BATとHTMLのハイブリッドプログラミングの記述方法
-
DOSのバッチ構文における%~dp0などの拡張変数について解説します。
-
DOSバッチ処理応用チュートリアル 第2章 DOSループ for コマンドの解説