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

1
(1): 2022/09/14(水)20:04 ID:XL8H98jz(1) AAS
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう

過去スレ
%14 2chスレ:tech
%13 2chスレ:tech
%12 2chスレ:tech
省18
2
(1): 2022/09/16(金)00:28 ID:9kvq1ahn(1/3) AAS
助けてください。
変数HOGEをキー入力してsplit()的な区切り文字列で分割する挙動を取りたいのですが
なぜかファイルが見つかりませんとなります。
リテラルでSET HOGE=1,2,3と記述していれば希望の動作となります。
半日困って今日は会社にお泊りです。誰か教えてください。

REM キー入力でHOGEに"1,2,3"と入力する
SET /P HOGE=
省4
3
(1): 2022/09/16(金)00:29 ID:9kvq1ahn(2/3) AAS
FOR /f "tokens=1,2,3 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
の間違いでした。だれか助けて〜
4
(1): 2022/09/16(金)00:32 ID:/mniU0r8(1) AAS
for /?

for /f
(ファイル)
("文字列")
('コマンド')
5
(1): 2022/09/16(金)00:42 ID:9kvq1ahn(3/3) AAS
>>4
ありがとうございます!
神!
6: 2022/09/25(日)20:41 ID:0LVDTkG9(1) AAS
set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=%hoge1%+%hoge2%

echo %hoge3%

hoge3のところには単に「+」と表示され、
echoのところにはなにも表示されず、
その次に「オペラントがありません」と表示されます。
省1
7
(1): 2022/09/26(月)00:15 ID:7oxCYWvG(1/2) AAS
if とか for のブロックの中?
外部リンク:otnx.jp
8: 2022/09/26(月)00:46 ID:ou4YDIZU(1/3) AAS
>>7
御明察です!理由が分かって安心しました。ありがとうございます。

forループの中で、このような処理を書くことはできないのでしょうか。毎回ランダムで少し変えて実行する、という処理を書きたいのですが…
9
(1): 2022/09/26(月)01:01 ID:3mhNpNjH(1/2) AAS
for文の展開で解釈が一回多く入るから1回目の解釈後も環境変数として残すようにする
%%hoge%% → %hoge% → 環境変数hogeの中身に置換

上の方法はトリッキーなので正規には遅延環境変数展開を使う(setlocal /?)
setlocal EnableDelayedExpansion
10
(1): 2022/09/26(月)01:47 ID:ou4YDIZU(2/3) AAS
>>9
ありがとうございます!できました!

setlocal enabledelayedexpansion
forループの初め

set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=!hoge1!+!hoge2!
省6
11
(1): 2022/09/26(月)01:54 ID:yGyQXERn(1) AAS
%random%
じゃなくて
!random!
12: 2022/09/26(月)05:19 ID:L5dyrqoL(1/2) AAS
そういえば、181系って、完全に揃った編成ってあったんだろうか?
台車違いの編入車や、485系仕様の編入車・新製車とかで、
いつも凸凹でちぐはぐだったイメージしかない

もし、153系の前面が165系の塗りになったら
足回りとか見慣れた目にはやっぱり違和感あるんだろうなぁ
クハ164は塗装変更しないで正解だったと思うわ
13: 2022/09/26(月)05:19 ID:L5dyrqoL(2/2) AAS
誤爆失礼!
14
(1): 2022/09/26(月)11:49 ID:7oxCYWvG(2/2) AAS
>>10
set /a hoge1=!random!, hoge2=!random!, hoge3=hoge1+hoge2

set /a は , 区切りで複数の式を指定可
環境変数は展開せずとも計算可能。その場合存在しない変数名は0として扱われ、展開した場合(多くはエラーになる)とは違ってくるので意図した計算になっていない事に気付き難い事に注意が必要
random などの特殊環境変数は環境変数としては存在せず、展開時に代入されるので展開が必要

setlocal enabledelayedexpansion
for /L %%i in (1,1,4) do (
省13
15: 2022/09/26(月)12:58 ID:3mhNpNjH(2/2) AAS
英語だと
delayed expansion
delayed variable expansion
説明文的には
Enables the delayed environment variable expansion
Setting EnabledDelayedExpansion will cause each variable to be expanded at execution time rather than at parse time
16
(2): 2022/09/26(月)17:38 ID:dNpEj5o9(1) AAS
set /a a=random
は0なんやな
一般変数と処理が違うんだ
17: 2022/09/26(月)21:36 ID:ou4YDIZU(3/3) AAS
>>11
>>14

ありがとうございます。
うまく動きました!
18: 2022/09/28(水)11:14 ID:RG22wEyx(1) AAS
>>16
> 一般変数と処理が違うんだ
違わない

set a=
set random=
set /a b=a, c=random
echo %b%, %c%, %random% #set /a では環境変数として定義されていない文字列は0として扱われる
省7
19: 2022/09/28(水)12:04 ID:Cg5haYXb(1) AAS
>>16
set /a a=%random%
20: 2022/09/29(木)13:35 ID:ezl+1hvw(1) AAS
確かに違わないんだけど、どう違わないのか勝手に補足。

set /?に基づくここでの用語定義:
・「環境変数」(一般変数)
   … 値が一旦決まれば勝手には値が変わらない普通の環境変数。Windowsの機能がベース。
・「動的な環境変数」(dynamic environment variables)(特殊変数)
   …「RANDOM」「ERRORLEVEL」など。cmdの独自機能。

仕様仮定(私の認識):
省12
21: 2022/10/05(水)15:17 ID:NmGDxxah(1/2) AAS
質問です。
ファイルのフルパスを表示するときに、
このコマンド使っていますよ、という意味で
rem %0
echo %0
と買いているんですが、remの方の変数まで展開されてしまいます。
展開させずに文字列のまま表示するにはどうしたらよいでしょうか?
22
(1): 2022/10/05(水)15:28 ID:yuT90fin(1) AAS
rem %%0
23: 2022/10/05(水)16:34 ID:NmGDxxah(2/2) AAS
>>22
出来ました!ありがとうございます。
24: 2022/10/08(土)17:33 ID:zk6uj/6h(1/2) AAS
C:\test>"C:\test\app.exe"
というコマンドを間違えて実行したらapp.exeが0バイトに書き変わったのですがなぜでしょうか
25: 2022/10/08(土)17:43 ID:f2a8Snt9(1/2) AAS
空の標準出力をリダイレクトで書き込んでるからだろう
26: 2022/10/08(土)17:48 ID:R/0NVeNc(1) AAS
なぞなぞじゃね?
27
(1): 2022/10/08(土)18:00 ID:zk6uj/6h(2/2) AAS
コマンドプロンプトからバッチファイルにコピペしたら間違えて作業フォルダが付いてしまって
何かのコマンドなのでしょうか
28: 2022/10/08(土)18:59 ID:f2a8Snt9(2/2) AAS
オカルトかな?
ん?お前のパソコン何かおかしくね?
29: 2022/10/08(土)21:15 ID:4RiXxOsU(1) AAS
>>27
日本語でOK
30
(1): 2022/10/08(土)21:20 ID:NCKRr8hU(1) AAS
エラーになってもリダイレクトは実行されちゃうんだな
バグとちゃうか
31: 2022/10/08(土)21:31 ID:bRwGYufv(1) AAS
プロンプトまでバッチにコピペするなよ
32: 2022/10/09(日)11:18 ID:yk0ofCIK(1) AAS
>>30
指定された実行対象ファイルがない、
というのは実行時エラーなので(構文エラーではない)
そのエラーメッセージをファイルリダイレクトして記録できる事は有益。
なのでバグ(仕様バグ)ではないと思われる。
33: 2022/10/09(日)12:38 ID:r7gKIzvL(1) AAS
一貫性のある動きだよな
エラー出力は欲しいけど標準出力はリダイレクト自体をなかったことにしてくれというのは無理がある
そもそもリダイレクト先がログファイルなら気にも留めないような話
びっくりする理由があるとしたらexeにリダイレクトしても容赦なく書き換えられるという点で、コマンドラインはそういう点で結構慈悲がない
ある程度はパワーユーザー向けという位置付けなので気をつけるしかない
34: 2022/10/12(水)04:44 ID:Jko2ebMR(1) AAS
window-position異なる位置のバッチをそれぞれ作ってるのですが
bat2個目を起動すると1個目の起動したバッチにつられてカスケード起動します
何か対処方法ありますでしょうか?
35: 2022/10/13(木)18:33 ID:Fb+ro4ZF(1) AAS
UIから起動されたCMDからのバッチなのか判別する方法ありますか?LinuxでいうTERMみたいな
36: 2022/10/13(木)20:39 ID:tHyHHwT5(1) AAS
うん
過去スレで全く同じ質問してる子いるから漁っておいで
37: 2022/10/30(日)06:52 ID:i1fpLCEI(1) AAS
zipファイルに書き込むコマンドはありますか?
copy foo.txt bar.zip
とやっても「bar.zipに上書きしますか?」になるだけなんですけど
上書きがしたいんじゃなくアーカイブしたいんです。
38: 2022/10/30(日)08:16 ID:oF72FRjI(1) AAS
7za.exe
39: 2022/10/30(日)17:16 ID:RObFZ+1A(1) AAS
compressコマンドはcabだけだったかな?
pwsh -c "gh compress-archive"参照
40
(1): 2022/10/30(日)20:28 ID:WT6dub7d(1) AAS
explorerで操作すると書き込めるからコマンドありそうな気がする
41: 2022/10/30(日)20:49 ID:JhK1ASYS(1) AAS
zipコマンドでググれ
42: 2022/10/31(月)15:34 ID:aCuyX04T(1) AAS
pwsh -c "Get-help -name compress-archive"
43: 2022/10/31(月)22:51 ID:HZxZgtz6(1) AAS
>>40
Explorerと同じ圧縮処理は、ExplorerのCOMオブジェクト(Shell.Application)を操作する事でできる。
確か、正式に提供した機能ではないので動作は保証しない、非推奨、みたいな扱いだった気が。
44
(1): 2022/11/02(水)15:48 ID:ZBNaiNsJ(1/2) AAS
質問失礼します。
ファイル名の一部の文字列(例:4文字目から8文字目まで)を一括削除するバッチを作りたいのですが…
[例]a1b2c3d4e5.m4a→a1b2e5.m4a
検索の結果、先頭4文字を削除するバッチ(下記)を見つけたので、アレンジしたいのですが、その方法がわからずにおります。
アレンジ方法がわかる方、もしくは別の方法でも構いませんので、教えて頂けないでしょうか?
------------------------
for %%i in (*) do (
省7
45
(1): 2022/11/02(水)16:00 ID:ZBNaiNsJ(2/2) AAS
44>>
スミマセン間違えました。2行目
[誤]例:4文字目から8文字目まで
[正]例:5文字目から8文字目まで
46: 2022/11/03(木)03:42 ID:lhbjAvOX(1) AAS
rem ファイル名を変数に入れて
set FILENAME=a1b2c3d4e5.m4a
rem 4文字目から8文字目まで削除
set MODIFYNAME=%FILENAME:~0,4%%FILENAME:~8%
rem リネーム
ren %FILENAME% %MODIFYNAME%
47
(1): 2022/11/03(木)06:22 ID:7S7IyYLz(1/5) AAS
@echo off
:x
set "a=%~n1"
ren "%~1" "%a:~0,4%%a:~8%%~x1"
shift
if not "%~1"=="" goto x

ファイル名やフォルダ名が英数字だけならこれでいけるんじゃね
48: 2022/11/03(木)13:02 ID:yr3S2O5F(1) AAS
>>45
> 5文字目から8文字目まで削除
set /?
1~4
%vv:~0,4%
9~
%vv:~8%
省7
49
(1): 2022/11/03(木)13:10 ID:P2O5CHdk(1/2) AAS
東京都、富山県、ネバダ州、東京都、東京都、雲南省、ネバダ州、東京都、みたいな数百行のfindの標準出力があって何種類の出力があるのかだけ欲しいんだけど何かスマートな方法ないですか
50
(1): 2022/11/03(木)14:00 ID:sS4Fs93N(1) AAS
スマートな方法なんてバッチに無いから別のスクリプトあたれ
バッチでやるなら以下みたいな感じに一意なものだけ書き出して最後に行数見るか書き出した回数を数えるか
copy nul $tmp.txt
for /f %%a in (findの結果とやら) do find "%%a" $tmp.txt >nul || >>$tmp.txt echo %%a
for /f "delims=:" %%a in ('findstr /n "^" $tmp.txt') do set n=%%a
echo %n%

新大阪と大阪みたいに項目名を含む別項目があるならfindstr /r /c:"^%%a$"
51: 2022/11/03(木)15:21 ID:PVTx0HrP(1/2) AAS
それほどスマートじゃないけどWSHを(batに埋め込んで)使う方法
(WSHには連想配列の要素数をカウントするものがないのでループで回してカウント)
(powershellと使う方法がいいかもしれないがpowershellはイニシャルコストが大きいのでよく使う人向き)
@if (0)==(0) echo off
cscript //nologo /e:jscript "%~f0" < data.txt
rem findstr "." data.txt|cscript //nologo /e:jscript "%~f0"
goto :eof
省8
52
(1): 2022/11/03(木)15:28 ID:/STCGL2q(1) AAS
46様、47様、48様
>>44です。
早速のご回答&アドバイス、ありがとうございました。
どの方法でもうまくrenameでき、とても参考になりました。
ただ、for文に組込むと、1つ目のファイルだけ、
2回処理が実行されてしまいます。
例えば、以下のバッチ
省15
53: 2022/11/03(木)15:30 ID:IcpXc6LC(1/2) AAS
powershell -Command "('東京都','富山県','ネバダ州','東京都','東京都','雲南省','ネバダ州','東京都' | Sort-Object | Get-Unique ).Count"
54: 2022/11/03(木)15:31 ID:IcpXc6LC(2/2) AAS
findの標準出力ってことはこうだな
powershell -Command "(find 引数 | Sort-Object | Get-Unique ).Count"
55: 2022/11/03(木)15:38 ID:PVTx0HrP(2/2) AAS
あ、+= 1には意味なかったな
56: 2022/11/03(木)16:10 ID:7S7IyYLz(2/5) AAS
>>52
だから for (*) do ren ~ はお勧めしない
同じファイルに複数回処理する可能性がある
ren を move にして別のフォルダに送れ
!文字がある時は for の内部で遅延展開設定、解除しろ
57: 2022/11/03(木)16:37 ID:7S7IyYLz(3/5) AAS
for /f "delims=" %%i in ('dir *') do (ren ~ でもいいかな
58: 2022/11/03(木)16:40 ID:7S7IyYLz(4/5) AAS
すまんdir/bだ
59
(1): 2022/11/03(木)17:36 ID:sJbSZrhN(1) AAS
cmd には

split | sort | uniq | wc

みたいなコマンドはないの?
60: 2022/11/03(木)17:41 ID:7S7IyYLz(5/5) AAS
ない
61: 2022/11/03(木)18:18 ID:P2O5CHdk(2/2) AAS
皆さんありがとうスマートっていうか単に速度の問題なのでどれが速いか競走させてみます
62: 2022/11/03(木)18:56 ID:NbsIPyEs(1) AAS
>>59
少なくとも標準では無いね
まあ使いたいならwslに行くか同等の機能をPowerShellで書くとかかな
63: 2022/11/03(木)23:17 ID:0ov2k6Uz(1) AAS
>>49
PowerShellなりでやる内容だとは思うが、どうしてもバッチでやるなら
入力データ(findの結果)をソートして、データの変動を検知したらカウントアップ、でもできる。
ただし入力データに記号(メタキャラ)が含まれる場合はうまく動かない可能性あり。

setlocal EnableDelayedExpansion
set Count=0
set PrevLine=
省5
64
(1): 2022/11/12(土)20:19 ID:/WV4ttu0(1/2) AAS
set /p で異体字セレクタ(IVS)を入力できない
IMEパッドが作動しない
いちいちメモ帳からコピペ入力するしかないのか
表示も化けてるし…
65: 2022/11/12(土)20:44 ID:/WV4ttu0(2/2) AAS
IMEパッドはダメなので、文字コード+F5 でいけた
66
(1): 2022/11/13(日)19:33 ID:sU7z5EJX(1) AAS
>>64
Windows Terminal
IMEパッド可
異体字(IVS)表示可(対応フォントのみ)

cmdの標準ターミナルは仕様が古いまま放置されている
67: 2022/11/17(木)22:22 ID:k+rrgD4B(1) AAS
conhostも放置されずに結構手がはいってる
𠮷とか🐕とかのサロゲートペアも表示されるようになったし
エスケープシーケンスで画面のサイズが変えられるようになった

> sigcheck c:\windows\system32\conhost.exe
Sigcheck v2.71 - File version and signature viewer
Copyright (C) 2004-2018 Mark Russinovich
Sysinternals - www.sysinternals.com
省10
68: 2022/11/18(金)07:02 ID:LiWOBYzs(1) AAS
>>66 サンクス
入力時に文字化けするので確認できない
echoで表示されるが文字の両側のスペースが気持ち悪い
でも標準画面よりはマシかな。おれは使わないけど
69
(1): 2022/11/21(月)20:53 ID:+ccbL4tM(1) AAS
カーソルの位置を知る方法はありますか?

for /F %%E in ('cmd ^< nul /D /K prompt $E') do set esc=%%E
set /P CPR=%esc%[6n

だとenterキー待ちで止まります。enterを押せばCPRに結果が入りますが
押さずに結果を得る方法はないでしょうか。
あるいはまったく別の方法でカーソルの位置を知る方法はないでしょうか。
70: 2022/11/21(月)21:55 ID:o6gng8CJ(1) AAS
手段の拘りなければこんなんとかで。
powershell -nop -c "[Console]::CursorTop; [Console]::WindowTop;"
71: 2022/11/22(火)09:23 ID:IBEEH7ii(1) AAS
過去にも似たような話があったなあ
何かでenterキーの入力を省略したいって
結局、うまい方法が見つからない
72: 69 2022/11/22(火)21:44 ID:CBUeGsgY(1) AAS
なるほど情報ありがとう
PowerShell なら [console]::CursorLeft と [console]::CursorTop で取得できるのを確認しました。
PowerShellを呼ぶか全部PowerShellで書くか悩ましい…
73: 2022/11/25(金)01:48 ID:is72b8Mh(1) AAS
コンソールの座標が必要になるってことはGUIを検討すべき時がきたんじゃないか
コンソールの画面でいくらがんばっても大したことできんよ
74
(1): 2022/11/25(金)20:54 ID:YIxTypne(1) AAS
そんなたいしたことじゃなくてね
画面に合わせた出力がしたくて行数を知りたかっただけ

mode con は WindowsTerminal ではいいけど conhost ではうまくない
PowerShellで得られる [console]::WinndowHeight が欲しいのに
[console]::BufferHeight が返ってきてしまう
それなら %esc%7%esc%[999;999H%esc%[6n%esc%8 みたいなエスケープシーケンスで
カーソル位置を使って調べようかと思って
省4
75
(1): 2022/11/27(日)05:02 ID:IKV/PDeN(1) AAS
powershellなんぞ使わずとも行数ごとき得る方法はあるぞ
昔はpowershell自体無かったんだからな
まあ具体的には思い出せないんだがぐぐれば出てくるだろ
76: 2022/11/27(日)11:26 ID:nWgXfjD8(1/2) AAS
いくらぐぐってもファイルの行数を調べるとか画面の行数を変更するしか見つからない…
行数ごときというならぜひ思い出して教えてください
1-
あと 792 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.028s