【.cmd】 バッチファイルスクリプト %15 【.bat】 (970レス)
1-

951
(3): 04/13(月)15:09 ID:2xoIGF5V(1) AAS
set DrvList=DEFGHIJKLMNOPQRSTUVWXYZ
:input
choice /c DEFGHIJKLMNOPQRSTUVWXYZ /n /m "リカバリーUSBブートドライブ を作成しますか? ドライブ文字( 半角1文字 D-Z )"
if ERRORLEVEL 255 goto :eof
if ERRORLEVEL 1 goto :chkDrv
if ERRORLEVEL 0 goto :eof

:chkDrv
set /a index=%ERRORLEVEL%-1
call set Drv=%%DrvList:~%index%,1%%
echo %Drv%
省6
952
(1): 948 04/13(月)21:54 ID:3POC0siT(2/2) AAS
>>951 さん ありがとう!
それでいけました。
アスキーコード数値にできないか?とか沼りかけていたので助かりました。
953: 04/15(水)19:54 ID:r6S5gYIq(1/3) AAS
入力チェックの概念がないことに驚く
954
(1): 04/15(水)19:57 ID:r6S5gYIq(2/3) AAS
>>952
変数に初期値を設定するのは悪習慣
955
(1): 04/15(水)19:57 ID:r6S5gYIq(3/3) AAS
>>948 はよく見るとネストしまくっているド素人だな
956
(1): 04/16(木)03:45 ID:Tn//Fa1q(1) AAS
choiceの現実的な使い方

for /f "usebackq" %%i in (`choice /n /c QABC`) do set item=%%~i
957: 948 04/16(木)12:12 ID:2FlBY5v4(1) AAS
>955
ド素人です。

>>954
そうなんですか?
でも変数に初期値を設定しないと
書いた>948元のベースで複数文字の入力分岐もやっています。
入力後にメニュー戻りした次に未入力でエンターすると前回入力が残って同じ処理に入ってしまう
なので変数に初期値を設定するようにしています。

>>956
それは単1文字以外に'CLR'とか複数文字入力混在の分岐もいけますか?
958: 04/16(木)23:38 ID:UfvpdfWz(1) AAS
偉そうにいちゃもん付けてる奴はスルーでいいから
959
(1): 04/18(土)01:51 ID:wodX6Uui(1) AAS
findstrでならasciiか2バイト文字かの判別を出来るけどね
findstrの正規表現の . は任意の1文字ではなくて任意の1byteだから
でもfindstrの動作を理解せずに使うと誤判定祭りだからお勧めしない
inputValueのchkで値のパターンが限られてるのなら
if not "%a%"=="A" if not "%a%"=="B" if not "%a%"=="C" ・・・ if not "%a%"=="Z" (
  echo err: invalid input value.
  goto :INPT
)
バカみたいだけどバッチではこんな風に全パターンifで羅列するのが確実だし動作も最も速い
findstrならこんな感じ
省5
960
(1): 04/19(日)09:20 ID:wKsrhzcO(1) AAS
choiceで変な文字を入力させない、が正解だとは思うけど利用可能なドライブから選択させた方がスマートじゃない?
@echo off
for /f "tokens=1-27 delims=:\ " %%@ in ('fsutil fsinfo drives') do set "drv=%%A%%B%%C%%D%%E%%F%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z"
call set "drv=%%drv:%SystemDrive::=%=%%"
if "%drv%"=="" echo ERROR: No available drives found.&echo Check the target drive connection.&pause &exit /b 1
set /p <nul=ドライブを選択 [%drv%]:
for /f %%a in ('choice /c %drv% /n') do set drv=%%a:
echo %drv%
pause
961
(2): [age] 04/20(月)21:23 ID:UVl60nvN(1) AAS
>959
2バイト文字込み判別はぐっちゃになりそうですよねー

>>960
ありがとうございます。
そして全く理解が追い付いていないので質問ですが
C:WinOS System(SATA SSD) , D:USBメモリ , W:PCIeスロット増設 NVMe SSD というドライブ構成例で実行すると
ドライブを選択 [DW]:
(W:はリムーバブル設定にはしていないのですが) Cを除いて表示されます。
3行目%%A%〜%%Zから%%Cを除くと[D]だけとなり
ドライブを選択 [D]:
省8
962: 04/20(月)22:06 ID:ghfl+cS9(1/4) AAS
環境Win11
for変数の割り当てmapがいつの間にかShift-JIS(ANSI)からUnicodeにこっそり仕様変更されてるみたいなんだけどいつからなのか分かる人居る?
Win10の途中辺り?
963: 04/20(月)22:21 ID:ghfl+cS9(2/4) AAS
>>961
> 3行目%%A%〜%%Zから%%A%%B%%Cを除くと[C=]になります。
そこ除いたせで drv が空になって、call set "drv=%%drv:%SystemDrive::=%=%%" で%SystemDrive::=% と=だけ残ってdrvに"C="がsetされた結果だね
Cドライブ消さないなら
call set "drv=%%drv:%SystemDrive::=%=%%" の行を削除するか

以下みたいに
for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do set "drv=%%b"
set "drv=%drv:\=%"
set "drv=%drv::=%"
set "drv=%drv: =%"
省3
964: 04/20(月)22:52 ID:ghfl+cS9(3/4) AAS
システムドライブがC:ではない環境は考慮しなくてもいいのかな?
Cドライブを必ず在るものとしてCにキャンセルを割り当てるならそのままでいいけど
ドライブにCが無い環境だとCが出ないから、その場合の処理を追加して選択にCを追加するか、キャンセル出来ない仕様になる
そう面倒でもないけれど、バッチはある程度の割り切りも必要だと思うよ
アレもコレも対策してたら数行で済む簡単なバッチが数百行に膨れ上がるからね
965: 04/20(月)23:03 ID:O2Evzmwv(1) AAS
fsutilは管理者権限がいるじゃん
そんなに厳密にしないでもいいんじゃない?
951ベースならif existで存在チェックしてるので存在しないなら問答無用で再度入力に飛ばせばいいだけのような
966: 04/20(月)23:06 ID:ghfl+cS9(4/4) AAS
>>961
知らなかったからGeminiに訊いてみたら以下でリムーバブルかどうかを判別出来るらしいからリムーバブルタイプだけを選択肢に表示させることも可能だよ
wmic logicaldisk where "DeviceID='E:'" get DriveType
fsutil fsinfo drivetype E:
967: 04/21(火)08:48 ID:t9MRVHfI(1) AAS
やってみた。netwrkドライブがあると管理者権限が必要になるかも知れない
wmicでも同様かは分からない
でもブータブルUSB作成ならどうせ権限必要だろうし
外部リンク:pastebin.com
968: 04/21(火)19:32 ID:fTCusT8W(1) AAS
ドライブ名を入力させるものなんて誰が使う想定なんだろうか?
969: 948 961 04/21(火)22:20 ID:nFogp4jA(1) AAS
現状は >951 をベースにしています。
もう晒してしま・・・
外部リンク:www.%41xfc.%4Eet/u/4123910?key=ENQ
(そのままだとNGワードの為コード置き換え)
更新すると旧版は削除していっています。
BatPsSecureBootCheck.bat を右クリックメニューから管理者として実行

:UsbRecovery 部分です
970: 04/22(水)04:04 ID:XdxgzwWb(1) AAS
for %%a in (ProductName DisplayVersion CurrentBuild EditionID UBR) do for /f "tokens=2*" %%b in ('
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v %%a 2^>nul ^| find "%%a"
') do set "%%a=%%c"

:: 確認用echo
for %%a in (ProductName DisplayVersion CurrentBuild EditionID UBR) do call echo %%%%a%%

if not defined UBR goto :WINVERR
if not defined DisplayVersion goto :WINVERR

pause &exit /b

:WINVERR
echo 対象は以下のバージョン以上です。
省7
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.022s