拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです
※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう
過去スレ
%14 https://mevius.5ch.net/test/read.cgi/tech/1597442426/
%13 https://mevius.2ch.net/test/read.cgi/tech/1542779527/
%12 https://mevius.2ch.net/test/read.cgi/tech/1489207631/
%11 https://echo.2ch.net/test/read.cgi/tech/1424858999/
%10 https://peace.2ch.net/test/read.cgi/tech/1374205515/
%9 https://toro.2ch.net/test/read.cgi/tech/1335015478/
%8 https://toro.2ch.net/test/read.cgi/tech/1315844420/
%7 https://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6 https://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5 https://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4 https://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3 https://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2 https://pc11.2ch.net/test/read.cgi/tech/1197881068/
【.cmd】 バッチファイルスクリプト %1 【.bat】
https://pc11.2ch.net/test/read.cgi/tech/1178281991/
バッチファイルプログラミング 3.bat
https://pc11.2ch.net/test/read.cgi/tech/1148485555/
バッチファイルプログラミング 2.bat
https://pc8.2ch.net/test/read.cgi/tech/1104911889/
バッチファイルプログラミング質問スレ
https://pc5.2ch.net/test/read.cgi/tech/1040614686/
探検
【.cmd】 バッチファイルスクリプト %15 【.bat】
2022/09/14(水) 20:04:01.36ID:XL8H98jz
2デフォルトの名無しさん
2022/09/16(金) 00:28:41.18ID:9kvq1ahn 助けてください。
変数HOGEをキー入力してsplit()的な区切り文字列で分割する挙動を取りたいのですが
なぜかファイルが見つかりませんとなります。
リテラルでSET HOGE=1,2,3と記述していれば希望の動作となります。
半日困って今日は会社にお泊りです。誰か教えてください。
REM キー入力でHOGEに"1,2,3"と入力する
SET /P HOGE=
FOR /f "tokens=1,2 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
OUTPUT ファイル 0_0 がみつかりません。
変数HOGEをキー入力してsplit()的な区切り文字列で分割する挙動を取りたいのですが
なぜかファイルが見つかりませんとなります。
リテラルでSET HOGE=1,2,3と記述していれば希望の動作となります。
半日困って今日は会社にお泊りです。誰か教えてください。
REM キー入力でHOGEに"1,2,3"と入力する
SET /P HOGE=
FOR /f "tokens=1,2 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
OUTPUT ファイル 0_0 がみつかりません。
3デフォルトの名無しさん
2022/09/16(金) 00:29:57.20ID:9kvq1ahn FOR /f "tokens=1,2,3 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
の間違いでした。だれか助けて〜
ECHO %%a %%b %%c
)
の間違いでした。だれか助けて〜
2022/09/16(金) 00:32:46.68ID:/mniU0r8
for /?
for /f
(ファイル)
("文字列")
('コマンド')
for /f
(ファイル)
("文字列")
('コマンド')
5デフォルトの名無しさん
2022/09/16(金) 00:42:16.15ID:9kvq1ahn6デフォルトの名無しさん
2022/09/25(日) 20:41:32.40ID:0LVDTkG9 set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=%hoge1%+%hoge2%
echo %hoge3%
hoge3のところには単に「+」と表示され、
echoのところにはなにも表示されず、
その次に「オペラントがありません」と表示されます。
これはなにが起こっているのでしょうか…
set /a hoge2=%random%
set /a hoge3=%hoge1%+%hoge2%
echo %hoge3%
hoge3のところには単に「+」と表示され、
echoのところにはなにも表示されず、
その次に「オペラントがありません」と表示されます。
これはなにが起こっているのでしょうか…
2022/09/26(月) 00:15:07.76ID:7oxCYWvG
if とか for のブロックの中?
https://otnx.jp/CMD/?%C1%B4%C8%CC/%B9%BD%CA%B8%B2%F2%C0%CF
https://otnx.jp/CMD/?%C1%B4%C8%CC/%B9%BD%CA%B8%B2%F2%C0%CF
8デフォルトの名無しさん
2022/09/26(月) 00:46:39.21ID:ou4YDIZU >>7
御明察です!理由が分かって安心しました。ありがとうございます。
forループの中で、このような処理を書くことはできないのでしょうか。毎回ランダムで少し変えて実行する、という処理を書きたいのですが…
御明察です!理由が分かって安心しました。ありがとうございます。
forループの中で、このような処理を書くことはできないのでしょうか。毎回ランダムで少し変えて実行する、という処理を書きたいのですが…
2022/09/26(月) 01:01:52.99ID:3mhNpNjH
for文の展開で解釈が一回多く入るから1回目の解釈後も環境変数として残すようにする
%%hoge%% → %hoge% → 環境変数hogeの中身に置換
上の方法はトリッキーなので正規には遅延環境変数展開を使う(setlocal /?)
setlocal EnableDelayedExpansion
%%hoge%% → %hoge% → 環境変数hogeの中身に置換
上の方法はトリッキーなので正規には遅延環境変数展開を使う(setlocal /?)
setlocal EnableDelayedExpansion
10デフォルトの名無しさん
2022/09/26(月) 01:47:37.41ID:ou4YDIZU >>9
ありがとうございます!できました!
setlocal enabledelayedexpansion
forループの初め
set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=!hoge1!+!hoge2!
echo !hoge3!
forループの終わり
という風にしたら、動きました。
デフォルトではforループ全体が一気に読み込まれるので、変数への代入が実行される前に変数の内容が確定してしまうという仕様なんですね。それを回避するために、!を付けて展開遅延変数を用いる、ということですね。
ただ、ランダムにしたはずなのに、毎回同じ値が表示されますね…
何故…
ありがとうございます!できました!
setlocal enabledelayedexpansion
forループの初め
set /a hoge1=%random%
set /a hoge2=%random%
set /a hoge3=!hoge1!+!hoge2!
echo !hoge3!
forループの終わり
という風にしたら、動きました。
デフォルトではforループ全体が一気に読み込まれるので、変数への代入が実行される前に変数の内容が確定してしまうという仕様なんですね。それを回避するために、!を付けて展開遅延変数を用いる、ということですね。
ただ、ランダムにしたはずなのに、毎回同じ値が表示されますね…
何故…
2022/09/26(月) 01:54:43.87ID:yGyQXERn
%random%
じゃなくて
!random!
じゃなくて
!random!
2022/09/26(月) 05:19:01.77ID:L5dyrqoL
そういえば、181系って、完全に揃った編成ってあったんだろうか?
台車違いの編入車や、485系仕様の編入車・新製車とかで、
いつも凸凹でちぐはぐだったイメージしかない
もし、153系の前面が165系の塗りになったら
足回りとか見慣れた目にはやっぱり違和感あるんだろうなぁ
クハ164は塗装変更しないで正解だったと思うわ
台車違いの編入車や、485系仕様の編入車・新製車とかで、
いつも凸凹でちぐはぐだったイメージしかない
もし、153系の前面が165系の塗りになったら
足回りとか見慣れた目にはやっぱり違和感あるんだろうなぁ
クハ164は塗装変更しないで正解だったと思うわ
2022/09/26(月) 05:19:38.74ID:L5dyrqoL
誤爆失礼!
2022/09/26(月) 11:49:53.74ID:7oxCYWvG
>>10
set /a hoge1=!random!, hoge2=!random!, hoge3=hoge1+hoge2
set /a は , 区切りで複数の式を指定可
環境変数は展開せずとも計算可能。その場合存在しない変数名は0として扱われ、展開した場合(多くはエラーになる)とは違ってくるので意図した計算になっていない事に気付き難い事に注意が必要
random などの特殊環境変数は環境変数としては存在せず、展開時に代入されるので展開が必要
setlocal enabledelayedexpansion
for /L %%i in (1,1,4) do (
set /a a=!random!, b=!random!, c=a+b
echo !c!
)
pause
こんな風にも書ける
set /a c=(a=!random!)+(b=!random!)
echo !a! + !b! = !c!
「遅延環境変数」という名称はそういう変数が別にあるのかと紛らわしくて良く無いと思うわ
環境変数
特殊変数
標準展開、事前展開、%展開 (展開されてから構文解析)
遅延展開、!展開 (構文解析されてからコマンド実行直前に展開)
用いるなら「環境変数の遅延展開」だろう
set /a hoge1=!random!, hoge2=!random!, hoge3=hoge1+hoge2
set /a は , 区切りで複数の式を指定可
環境変数は展開せずとも計算可能。その場合存在しない変数名は0として扱われ、展開した場合(多くはエラーになる)とは違ってくるので意図した計算になっていない事に気付き難い事に注意が必要
random などの特殊環境変数は環境変数としては存在せず、展開時に代入されるので展開が必要
setlocal enabledelayedexpansion
for /L %%i in (1,1,4) do (
set /a a=!random!, b=!random!, c=a+b
echo !c!
)
pause
こんな風にも書ける
set /a c=(a=!random!)+(b=!random!)
echo !a! + !b! = !c!
「遅延環境変数」という名称はそういう変数が別にあるのかと紛らわしくて良く無いと思うわ
環境変数
特殊変数
標準展開、事前展開、%展開 (展開されてから構文解析)
遅延展開、!展開 (構文解析されてからコマンド実行直前に展開)
用いるなら「環境変数の遅延展開」だろう
2022/09/26(月) 12:58:23.71ID:3mhNpNjH
英語だと
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
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
2022/09/26(月) 17:38:32.28ID:dNpEj5o9
set /a a=random
は0なんやな
一般変数と処理が違うんだ
は0なんやな
一般変数と処理が違うんだ
2022/09/28(水) 11:14:01.39ID:RG22wEyx
>>16
> 一般変数と処理が違うんだ
違わない
set a=
set random=
set /a b=a, c=random
echo %b%, %c%, %random% #set /a では環境変数として定義されていない文字列は0として扱われる
set a=1
set random=1
set /a b=a, c=random
echo %b%, %c%, %random% #特殊変数は環境変数として定義されると環境変数が優先され特殊変数としては機能しなくなる
set random=
echo %random% #環境変数を削除すれば元通り
pause
> 一般変数と処理が違うんだ
違わない
set a=
set random=
set /a b=a, c=random
echo %b%, %c%, %random% #set /a では環境変数として定義されていない文字列は0として扱われる
set a=1
set random=1
set /a b=a, c=random
echo %b%, %c%, %random% #特殊変数は環境変数として定義されると環境変数が優先され特殊変数としては機能しなくなる
set random=
echo %random% #環境変数を削除すれば元通り
pause
2022/09/28(水) 12:04:21.93ID:Cg5haYXb
>>16
set /a a=%random%
set /a a=%random%
2022/09/29(木) 13:35:46.81ID:ezl+1hvw
確かに違わないんだけど、どう違わないのか勝手に補足。
set /?に基づくここでの用語定義:
・「環境変数」(一般変数)
… 値が一旦決まれば勝手には値が変わらない普通の環境変数。Windowsの機能がベース。
・「動的な環境変数」(dynamic environment variables)(特殊変数)
…「RANDOM」「ERRORLEVEL」など。cmdの独自機能。
仕様仮定(私の認識):
・set /a での名前だけで値を参照できる機能は「環境変数」だけ対象としている。
・cmdの構文解釈による「%〜%」で値を参照できる機能は
「環境変数」と「動的な環境変数」を対象としている。
以上を踏まえたうえで
「set /a a=random」の「random」は「動的な環境変数」ではなく「環境変数」であり、
『他の「環境変数」の扱い』と「違わない」。
「一般変数と処理が違う」のはcmdによる構文解釈の「%〜%」での扱い。
また、「set /a a=%random%」での「%random%」は
まずcmdの構文解釈により「動的な環境変数」として「123」のように展開され
「set /a a=123」となり、setには「環境変数」すら使われていないように見える。
※cmdの内部コマンドである「set」からは「動的な環境変数」も見えてもいいのにね。
同じく内部コマンドの「if」からは見えてるみたいだし。
set /?に基づくここでの用語定義:
・「環境変数」(一般変数)
… 値が一旦決まれば勝手には値が変わらない普通の環境変数。Windowsの機能がベース。
・「動的な環境変数」(dynamic environment variables)(特殊変数)
…「RANDOM」「ERRORLEVEL」など。cmdの独自機能。
仕様仮定(私の認識):
・set /a での名前だけで値を参照できる機能は「環境変数」だけ対象としている。
・cmdの構文解釈による「%〜%」で値を参照できる機能は
「環境変数」と「動的な環境変数」を対象としている。
以上を踏まえたうえで
「set /a a=random」の「random」は「動的な環境変数」ではなく「環境変数」であり、
『他の「環境変数」の扱い』と「違わない」。
「一般変数と処理が違う」のはcmdによる構文解釈の「%〜%」での扱い。
また、「set /a a=%random%」での「%random%」は
まずcmdの構文解釈により「動的な環境変数」として「123」のように展開され
「set /a a=123」となり、setには「環境変数」すら使われていないように見える。
※cmdの内部コマンドである「set」からは「動的な環境変数」も見えてもいいのにね。
同じく内部コマンドの「if」からは見えてるみたいだし。
21デフォルトの名無しさん
2022/10/05(水) 15:17:30.50ID:NmGDxxah 質問です。
ファイルのフルパスを表示するときに、
このコマンド使っていますよ、という意味で
rem %0
echo %0
と買いているんですが、remの方の変数まで展開されてしまいます。
展開させずに文字列のまま表示するにはどうしたらよいでしょうか?
ファイルのフルパスを表示するときに、
このコマンド使っていますよ、という意味で
rem %0
echo %0
と買いているんですが、remの方の変数まで展開されてしまいます。
展開させずに文字列のまま表示するにはどうしたらよいでしょうか?
2022/10/05(水) 15:28:26.09ID:yuT90fin
rem %%0
23デフォルトの名無しさん
2022/10/05(水) 16:34:14.38ID:NmGDxxah >>22
出来ました!ありがとうございます。
出来ました!ありがとうございます。
24デフォルトの名無しさん
2022/10/08(土) 17:33:40.37ID:zk6uj/6h C:\test>"C:\test\app.exe"
というコマンドを間違えて実行したらapp.exeが0バイトに書き変わったのですがなぜでしょうか
というコマンドを間違えて実行したらapp.exeが0バイトに書き変わったのですがなぜでしょうか
2022/10/08(土) 17:43:53.04ID:f2a8Snt9
空の標準出力をリダイレクトで書き込んでるからだろう
2022/10/08(土) 17:48:05.02ID:R/0NVeNc
なぞなぞじゃね?
2022/10/08(土) 18:00:30.98ID:zk6uj/6h
コマンドプロンプトからバッチファイルにコピペしたら間違えて作業フォルダが付いてしまって
何かのコマンドなのでしょうか
何かのコマンドなのでしょうか
2022/10/08(土) 18:59:40.31ID:f2a8Snt9
オカルトかな?
ん?お前のパソコン何かおかしくね?
ん?お前のパソコン何かおかしくね?
2022/10/08(土) 21:15:53.37ID:4RiXxOsU
>>27
日本語でOK
日本語でOK
2022/10/08(土) 21:20:11.87ID:NCKRr8hU
エラーになってもリダイレクトは実行されちゃうんだな
バグとちゃうか
バグとちゃうか
2022/10/08(土) 21:31:19.08ID:bRwGYufv
プロンプトまでバッチにコピペするなよ
2022/10/09(日) 11:18:46.47ID:yk0ofCIK
>>30
指定された実行対象ファイルがない、
というのは実行時エラーなので(構文エラーではない)
そのエラーメッセージをファイルリダイレクトして記録できる事は有益。
なのでバグ(仕様バグ)ではないと思われる。
指定された実行対象ファイルがない、
というのは実行時エラーなので(構文エラーではない)
そのエラーメッセージをファイルリダイレクトして記録できる事は有益。
なのでバグ(仕様バグ)ではないと思われる。
2022/10/09(日) 12:38:18.26ID:r7gKIzvL
一貫性のある動きだよな
エラー出力は欲しいけど標準出力はリダイレクト自体をなかったことにしてくれというのは無理がある
そもそもリダイレクト先がログファイルなら気にも留めないような話
びっくりする理由があるとしたらexeにリダイレクトしても容赦なく書き換えられるという点で、コマンドラインはそういう点で結構慈悲がない
ある程度はパワーユーザー向けという位置付けなので気をつけるしかない
エラー出力は欲しいけど標準出力はリダイレクト自体をなかったことにしてくれというのは無理がある
そもそもリダイレクト先がログファイルなら気にも留めないような話
びっくりする理由があるとしたらexeにリダイレクトしても容赦なく書き換えられるという点で、コマンドラインはそういう点で結構慈悲がない
ある程度はパワーユーザー向けという位置付けなので気をつけるしかない
2022/10/12(水) 04:44:03.67ID:Jko2ebMR
window-position異なる位置のバッチをそれぞれ作ってるのですが
bat2個目を起動すると1個目の起動したバッチにつられてカスケード起動します
何か対処方法ありますでしょうか?
bat2個目を起動すると1個目の起動したバッチにつられてカスケード起動します
何か対処方法ありますでしょうか?
35デフォルトの名無しさん
2022/10/13(木) 18:33:52.32ID:Fb+ro4ZF UIから起動されたCMDからのバッチなのか判別する方法ありますか?LinuxでいうTERMみたいな
2022/10/13(木) 20:39:40.77ID:tHyHHwT5
うん
過去スレで全く同じ質問してる子いるから漁っておいで
過去スレで全く同じ質問してる子いるから漁っておいで
2022/10/30(日) 06:52:23.05ID:i1fpLCEI
zipファイルに書き込むコマンドはありますか?
copy foo.txt bar.zip
とやっても「bar.zipに上書きしますか?」になるだけなんですけど
上書きがしたいんじゃなくアーカイブしたいんです。
copy foo.txt bar.zip
とやっても「bar.zipに上書きしますか?」になるだけなんですけど
上書きがしたいんじゃなくアーカイブしたいんです。
2022/10/30(日) 08:16:49.21ID:oF72FRjI
7za.exe
2022/10/30(日) 17:16:25.85ID:RObFZ+1A
compressコマンドはcabだけだったかな?
pwsh -c "gh compress-archive"参照
pwsh -c "gh compress-archive"参照
2022/10/30(日) 20:28:18.19ID:WT6dub7d
explorerで操作すると書き込めるからコマンドありそうな気がする
2022/10/30(日) 20:49:57.93ID:JhK1ASYS
zipコマンドでググれ
2022/10/31(月) 15:34:40.68ID:aCuyX04T
pwsh -c "Get-help -name compress-archive"
2022/10/31(月) 22:51:09.43ID:HZxZgtz6
>>40
Explorerと同じ圧縮処理は、ExplorerのCOMオブジェクト(Shell.Application)を操作する事でできる。
確か、正式に提供した機能ではないので動作は保証しない、非推奨、みたいな扱いだった気が。
Explorerと同じ圧縮処理は、ExplorerのCOMオブジェクト(Shell.Application)を操作する事でできる。
確か、正式に提供した機能ではないので動作は保証しない、非推奨、みたいな扱いだった気が。
2022/11/02(水) 15:48:21.33ID:ZBNaiNsJ
質問失礼します。
ファイル名の一部の文字列(例:4文字目から8文字目まで)を一括削除するバッチを作りたいのですが…
[例]a1b2c3d4e5.m4a→a1b2e5.m4a
検索の結果、先頭4文字を削除するバッチ(下記)を見つけたので、アレンジしたいのですが、その方法がわからずにおります。
アレンジ方法がわかる方、もしくは別の方法でも構いませんので、教えて頂けないでしょうか?
------------------------
for %%i in (*) do (
if not "%%i"=="%~nx0" (
set vv=%%i
call ren %%i %%vv:~4%%
)
)
------------------------
参考になりそうなURLでも助かります。
ファイル名の一部の文字列(例:4文字目から8文字目まで)を一括削除するバッチを作りたいのですが…
[例]a1b2c3d4e5.m4a→a1b2e5.m4a
検索の結果、先頭4文字を削除するバッチ(下記)を見つけたので、アレンジしたいのですが、その方法がわからずにおります。
アレンジ方法がわかる方、もしくは別の方法でも構いませんので、教えて頂けないでしょうか?
------------------------
for %%i in (*) do (
if not "%%i"=="%~nx0" (
set vv=%%i
call ren %%i %%vv:~4%%
)
)
------------------------
参考になりそうなURLでも助かります。
2022/11/02(水) 16:00:09.07ID:ZBNaiNsJ
44>>
スミマセン間違えました。2行目
[誤]例:4文字目から8文字目まで
[正]例:5文字目から8文字目まで
スミマセン間違えました。2行目
[誤]例:4文字目から8文字目まで
[正]例:5文字目から8文字目まで
2022/11/03(木) 03:42:12.99ID:lhbjAvOX
rem ファイル名を変数に入れて
set FILENAME=a1b2c3d4e5.m4a
rem 4文字目から8文字目まで削除
set MODIFYNAME=%FILENAME:~0,4%%FILENAME:~8%
rem リネーム
ren %FILENAME% %MODIFYNAME%
set FILENAME=a1b2c3d4e5.m4a
rem 4文字目から8文字目まで削除
set MODIFYNAME=%FILENAME:~0,4%%FILENAME:~8%
rem リネーム
ren %FILENAME% %MODIFYNAME%
2022/11/03(木) 06:22:30.68ID:7S7IyYLz
@echo off
:x
set "a=%~n1"
ren "%~1" "%a:~0,4%%a:~8%%~x1"
shift
if not "%~1"=="" goto x
ファイル名やフォルダ名が英数字だけならこれでいけるんじゃね
:x
set "a=%~n1"
ren "%~1" "%a:~0,4%%a:~8%%~x1"
shift
if not "%~1"=="" goto x
ファイル名やフォルダ名が英数字だけならこれでいけるんじゃね
2022/11/03(木) 13:02:59.28ID:yr3S2O5F
>>45
> 5文字目から8文字目まで削除
set /?
1~4
%vv:~0,4%
9~
%vv:~8%
> set vv=%%i
> call ren %%i %%vv:~4%%
set "vv=%%~ni"
call ren "%%~i" "%%vv:~0,4%%%%vv:~8%%%%~xi"
%%~ni %%~xi のnとかxは for /?
なるべくcall使わない方が速いのでファイル名に !文字が無いなら setlocal enabledelayedexpansion して遅延展開使え
対象ファイル数が多くないとかで引数の文字数制限に掛からないのなら >>47 のやり方が入れ子にならず良い
> 5文字目から8文字目まで削除
set /?
1~4
%vv:~0,4%
9~
%vv:~8%
> set vv=%%i
> call ren %%i %%vv:~4%%
set "vv=%%~ni"
call ren "%%~i" "%%vv:~0,4%%%%vv:~8%%%%~xi"
%%~ni %%~xi のnとかxは for /?
なるべくcall使わない方が速いのでファイル名に !文字が無いなら setlocal enabledelayedexpansion して遅延展開使え
対象ファイル数が多くないとかで引数の文字数制限に掛からないのなら >>47 のやり方が入れ子にならず良い
2022/11/03(木) 13:10:19.17ID:P2O5CHdk
東京都、富山県、ネバダ州、東京都、東京都、雲南省、ネバダ州、東京都、みたいな数百行のfindの標準出力があって何種類の出力があるのかだけ欲しいんだけど何かスマートな方法ないですか
2022/11/03(木) 14:00:45.43ID:sS4Fs93N
スマートな方法なんてバッチに無いから別のスクリプトあたれ
バッチでやるなら以下みたいな感じに一意なものだけ書き出して最後に行数見るか書き出した回数を数えるか
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$"
バッチでやるなら以下みたいな感じに一意なものだけ書き出して最後に行数見るか書き出した回数を数えるか
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$"
2022/11/03(木) 15:21:55.26ID:PVTx0HrP
それほどスマートじゃないけど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
@end
var table={}, data, count=0;
while(!WScript.StdIn.AtEndOfStream) {
data = WScript.StdIn.ReadLine();
if (data.length) { table[data] += 1; WScript.Echo(data); }
}
for (i in table) { count++; }
WScript.Echo(count);
(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
@end
var table={}, data, count=0;
while(!WScript.StdIn.AtEndOfStream) {
data = WScript.StdIn.ReadLine();
if (data.length) { table[data] += 1; WScript.Echo(data); }
}
for (i in table) { count++; }
WScript.Echo(count);
2022/11/03(木) 15:28:23.28ID:/STCGL2q
46様、47様、48様
>>44です。
早速のご回答&アドバイス、ありがとうございました。
どの方法でもうまくrenameでき、とても参考になりました。
ただ、for文に組込むと、1つ目のファイルだけ、
2回処理が実行されてしまいます。
例えば、以下のバッチ
-------------------------------------------
for %%i in (*.m4a) do (
set "vv=%%~ni"
call ren "%%~i" "%%vv:~0,4%%%%vv:~8%%%%~xi"
)
-------------------------------------------
を実行すると、
a1234567890a.m4a→a123.m4a ←2回
b1234567890b.m4a→b123890b.m4a
c1234567890c.m4a→c123890c.m4a
となってしまいます。
これは、私のfor文の使用法に誤りがあると考えられ
ますので、自力解決すべく調べているのですが…
参考になりそうなサイトなどご存知でしたら、教えて頂けませんでしょうか?
何度も申し訳ありません。
>>44です。
早速のご回答&アドバイス、ありがとうございました。
どの方法でもうまくrenameでき、とても参考になりました。
ただ、for文に組込むと、1つ目のファイルだけ、
2回処理が実行されてしまいます。
例えば、以下のバッチ
-------------------------------------------
for %%i in (*.m4a) do (
set "vv=%%~ni"
call ren "%%~i" "%%vv:~0,4%%%%vv:~8%%%%~xi"
)
-------------------------------------------
を実行すると、
a1234567890a.m4a→a123.m4a ←2回
b1234567890b.m4a→b123890b.m4a
c1234567890c.m4a→c123890c.m4a
となってしまいます。
これは、私のfor文の使用法に誤りがあると考えられ
ますので、自力解決すべく調べているのですが…
参考になりそうなサイトなどご存知でしたら、教えて頂けませんでしょうか?
何度も申し訳ありません。
2022/11/03(木) 15:30:10.92ID:IcpXc6LC
powershell -Command "('東京都','富山県','ネバダ州','東京都','東京都','雲南省','ネバダ州','東京都' | Sort-Object | Get-Unique ).Count"
2022/11/03(木) 15:31:53.88ID:IcpXc6LC
findの標準出力ってことはこうだな
powershell -Command "(find 引数 | Sort-Object | Get-Unique ).Count"
powershell -Command "(find 引数 | Sort-Object | Get-Unique ).Count"
2022/11/03(木) 15:38:59.81ID:PVTx0HrP
あ、+= 1には意味なかったな
2022/11/03(木) 16:10:12.19ID:7S7IyYLz
>>52
だから for (*) do ren ~ はお勧めしない
同じファイルに複数回処理する可能性がある
ren を move にして別のフォルダに送れ
!文字がある時は for の内部で遅延展開設定、解除しろ
だから for (*) do ren ~ はお勧めしない
同じファイルに複数回処理する可能性がある
ren を move にして別のフォルダに送れ
!文字がある時は for の内部で遅延展開設定、解除しろ
2022/11/03(木) 16:37:27.42ID:7S7IyYLz
for /f "delims=" %%i in ('dir *') do (ren ~ でもいいかな
2022/11/03(木) 16:40:46.92ID:7S7IyYLz
すまんdir/bだ
2022/11/03(木) 17:36:43.52ID:sJbSZrhN
cmd には
split | sort | uniq | wc
みたいなコマンドはないの?
split | sort | uniq | wc
みたいなコマンドはないの?
2022/11/03(木) 17:41:34.26ID:7S7IyYLz
ない
2022/11/03(木) 18:18:22.55ID:P2O5CHdk
皆さんありがとうスマートっていうか単に速度の問題なのでどれが速いか競走させてみます
2022/11/03(木) 18:56:34.58ID:NbsIPyEs
2022/11/03(木) 23:17:13.75ID:0ov2k6Uz
>>49
PowerShellなりでやる内容だとは思うが、どうしてもバッチでやるなら
入力データ(findの結果)をソートして、データの変動を検知したらカウントアップ、でもできる。
ただし入力データに記号(メタキャラ)が含まれる場合はうまく動かない可能性あり。
setlocal EnableDelayedExpansion
set Count=0
set PrevLine=
for /f "delims=" %%A in ('find なんたら ^| sort') do (
if "%%A" neq "!PrevLine!" set /a Count+=1
set "PrevLine=%%A"
)
echo,!Count!
PowerShellなりでやる内容だとは思うが、どうしてもバッチでやるなら
入力データ(findの結果)をソートして、データの変動を検知したらカウントアップ、でもできる。
ただし入力データに記号(メタキャラ)が含まれる場合はうまく動かない可能性あり。
setlocal EnableDelayedExpansion
set Count=0
set PrevLine=
for /f "delims=" %%A in ('find なんたら ^| sort') do (
if "%%A" neq "!PrevLine!" set /a Count+=1
set "PrevLine=%%A"
)
echo,!Count!
2022/11/12(土) 20:19:55.55ID:/WV4ttu0
set /p で異体字セレクタ(IVS)を入力できない
IMEパッドが作動しない
いちいちメモ帳からコピペ入力するしかないのか
表示も化けてるし…
IMEパッドが作動しない
いちいちメモ帳からコピペ入力するしかないのか
表示も化けてるし…
2022/11/12(土) 20:44:49.08ID:/WV4ttu0
IMEパッドはダメなので、文字コード+F5 でいけた
2022/11/13(日) 19:33:26.85ID:sU7z5EJX
2022/11/17(木) 22:22:21.92ID:k+rrgD4B
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
c:\windows\system32\conhost.exe:
Verified: Signed
Signing date: 7:59 2022/11/05
Publisher: Microsoft Windows
Company: Microsoft Corporation
Description: Console Window Host
Product: Microsoftョ Windowsョ Operating System
Prod version: 10.0.22621.675
File version: 10.0.22621.675 (WinBuild.160101.0800)
MachineType: 64-bit
𠮷とか🐕とかのサロゲートペアも表示されるようになったし
エスケープシーケンスで画面のサイズが変えられるようになった
> sigcheck c:\windows\system32\conhost.exe
Sigcheck v2.71 - File version and signature viewer
Copyright (C) 2004-2018 Mark Russinovich
Sysinternals - www.sysinternals.com
c:\windows\system32\conhost.exe:
Verified: Signed
Signing date: 7:59 2022/11/05
Publisher: Microsoft Windows
Company: Microsoft Corporation
Description: Console Window Host
Product: Microsoftョ Windowsョ Operating System
Prod version: 10.0.22621.675
File version: 10.0.22621.675 (WinBuild.160101.0800)
MachineType: 64-bit
2022/11/18(金) 07:02:24.39ID:LiWOBYzs
2022/11/21(月) 20:53:34.41ID:+ccbL4tM
カーソルの位置を知る方法はありますか?
for /F %%E in ('cmd ^< nul /D /K prompt $E') do set esc=%%E
set /P CPR=%esc%[6n
だとenterキー待ちで止まります。enterを押せばCPRに結果が入りますが
押さずに結果を得る方法はないでしょうか。
あるいはまったく別の方法でカーソルの位置を知る方法はないでしょうか。
for /F %%E in ('cmd ^< nul /D /K prompt $E') do set esc=%%E
set /P CPR=%esc%[6n
だとenterキー待ちで止まります。enterを押せばCPRに結果が入りますが
押さずに結果を得る方法はないでしょうか。
あるいはまったく別の方法でカーソルの位置を知る方法はないでしょうか。
2022/11/21(月) 21:55:41.71ID:o6gng8CJ
手段の拘りなければこんなんとかで。
powershell -nop -c "[Console]::CursorTop; [Console]::WindowTop;"
powershell -nop -c "[Console]::CursorTop; [Console]::WindowTop;"
2022/11/22(火) 09:23:33.75ID:IBEEH7ii
過去にも似たような話があったなあ
何かでenterキーの入力を省略したいって
結局、うまい方法が見つからない
何かでenterキーの入力を省略したいって
結局、うまい方法が見つからない
7269
2022/11/22(火) 21:44:34.08ID:CBUeGsgY なるほど情報ありがとう
PowerShell なら [console]::CursorLeft と [console]::CursorTop で取得できるのを確認しました。
PowerShellを呼ぶか全部PowerShellで書くか悩ましい…
PowerShell なら [console]::CursorLeft と [console]::CursorTop で取得できるのを確認しました。
PowerShellを呼ぶか全部PowerShellで書くか悩ましい…
2022/11/25(金) 01:48:24.17ID:is72b8Mh
コンソールの座標が必要になるってことはGUIを検討すべき時がきたんじゃないか
コンソールの画面でいくらがんばっても大したことできんよ
コンソールの画面でいくらがんばっても大したことできんよ
2022/11/25(金) 20:54:30.19ID:YIxTypne
そんなたいしたことじゃなくてね
画面に合わせた出力がしたくて行数を知りたかっただけ
mode con は WindowsTerminal ではいいけど conhost ではうまくない
PowerShellで得られる [console]::WinndowHeight が欲しいのに
[console]::BufferHeight が返ってきてしまう
それなら %esc%7%esc%[999;999H%esc%[6n%esc%8 みたいなエスケープシーケンスで
カーソル位置を使って調べようかと思って
で質問した後で気づいたけど
代替画面バッファーに切り替えて mode con すればいいのな
まあ PowerShell 一発で取れるなら楽だしもういいかなって
でも他の方法があるなら知りたい
画面に合わせた出力がしたくて行数を知りたかっただけ
mode con は WindowsTerminal ではいいけど conhost ではうまくない
PowerShellで得られる [console]::WinndowHeight が欲しいのに
[console]::BufferHeight が返ってきてしまう
それなら %esc%7%esc%[999;999H%esc%[6n%esc%8 みたいなエスケープシーケンスで
カーソル位置を使って調べようかと思って
で質問した後で気づいたけど
代替画面バッファーに切り替えて mode con すればいいのな
まあ PowerShell 一発で取れるなら楽だしもういいかなって
でも他の方法があるなら知りたい
2022/11/27(日) 05:02:29.30ID:IKV/PDeN
powershellなんぞ使わずとも行数ごとき得る方法はあるぞ
昔はpowershell自体無かったんだからな
まあ具体的には思い出せないんだがぐぐれば出てくるだろ
昔はpowershell自体無かったんだからな
まあ具体的には思い出せないんだがぐぐれば出てくるだろ
2022/11/27(日) 11:26:11.98ID:nWgXfjD8
いくらぐぐってもファイルの行数を調べるとか画面の行数を変更するしか見つからない…
行数ごときというならぜひ思い出して教えてください
行数ごときというならぜひ思い出して教えてください
2022/11/27(日) 12:43:26.54ID:WeJVO7HI
powershell (get-host).ui.rawui.windowsize
powershell (get-host).ui.rawui.windowsize.height
powershell (get-host).ui.rawui.windowsize.width
powershell (get-host).ui.rawui.windowsize.height
powershell (get-host).ui.rawui.windowsize.width
2022/11/27(日) 17:27:16.98ID:fMz//05T
mode か?
2022/11/27(日) 18:49:52.00ID:WeJVO7HI
for /f "tokens=3" %%i in ('reg query HKCU\Console /f WindowSize^|findstr WindowSize') do set h=%%i
set /a h=%h:~0,-4%
echo %h%
set /a h=%h:~0,-4%
echo %h%
2022/11/27(日) 19:34:17.80ID:fMz//05T
Consoleにサブキーがいっぱいあるな
2022/11/27(日) 21:48:39.87ID:nWgXfjD8
2022/11/28(月) 00:00:04.17ID:so4XQ+4A
more で画面毎に止まってくれるが
あれはどこから画面行数情報を得ているのだろう
あれはどこから画面行数情報を得ているのだろう
2022/11/28(月) 23:31:47.71ID:YeZSlVdS
PowerShell を使っていいなら
for /F "tokens=2 delims=[;" %%L in ('pwsh -nop -c "[console]::Error.Write(\"`e7`e[999^;999H`e[6n`e8\"); [console]::Error.Flush(); do { $k = [console]::ReadKey().KeyChar; } until ($k -eq \"R\"); \"\""') do echo LINES: %%L
Windows PowerShell だと `e が使えないからもう少しごちゃっとする
for /F "tokens=2 delims=[;" %%L in ('pwsh -nop -c "[console]::Error.Write(\"`e7`e[999^;999H`e[6n`e8\"); [console]::Error.Flush(); do { $k = [console]::ReadKey().KeyChar; } until ($k -eq \"R\"); \"\""') do echo LINES: %%L
Windows PowerShell だと `e が使えないからもう少しごちゃっとする
2022/11/29(火) 22:16:00.02ID:noJ3pHan
ぐぐって出てこないならもうpowershell使うしかないんじゃね
>>83お前こんな糞コード晒す前にちょっと考えろよ頼むよ白けるわ
>>83お前こんな糞コード晒す前にちょっと考えろよ頼むよ白けるわ
2022/11/29(火) 22:25:15.99ID:WKccTgje
ウインドウの行数を調べる方法まとめ
mode(とcmd)を使う方法
for /F %%E in ('cmd ^< nul /D /K prompt $E') do (
set < nul /P =%%E[?1049h
set LINES=
for /F "tokens=2 delims=:" %%L in ('mode con') do (
if not defined LINES set /A LINES=%%L
)
set < nul /P =%%E[?1049l
)
PowerShellを使う方法
for /F %%L in ('pwsh -nop -c "[console]::WindowHeight"') do set LINES=%%L
エスケープシーケンス(とPowerShell)で頑張る方法
for /F "tokens=2 delims=[;" %%L in ('pwsh -nop -c "[console]::Error.Write(\"`e7`e[999^;999H`e[6n`e8\"); [console]::Error.Flush(); do { $k = [console]::ReadKey().KeyChar; } until ($k -eq 'R')"') do set LINES=%%L
mode(とcmd)を使う方法
for /F %%E in ('cmd ^< nul /D /K prompt $E') do (
set < nul /P =%%E[?1049h
set LINES=
for /F "tokens=2 delims=:" %%L in ('mode con') do (
if not defined LINES set /A LINES=%%L
)
set < nul /P =%%E[?1049l
)
PowerShellを使う方法
for /F %%L in ('pwsh -nop -c "[console]::WindowHeight"') do set LINES=%%L
エスケープシーケンス(とPowerShell)で頑張る方法
for /F "tokens=2 delims=[;" %%L in ('pwsh -nop -c "[console]::Error.Write(\"`e7`e[999^;999H`e[6n`e8\"); [console]::Error.Flush(); do { $k = [console]::ReadKey().KeyChar; } until ($k -eq 'R')"') do set LINES=%%L
2022/11/29(火) 23:27:39.60ID:F0R68kvV
エスケープシーケンスはwin10以前だとダメじゃなかったっけ
ansi.sysがwin8.1までは組み込まれない
ansi.sysがwin8.1までは組み込まれない
2022/12/01(木) 15:35:07.57ID:a9edrtS0
set d=%DATE:/=%
とやった後、1日前の日付にしたいのですがうまい方法・コマンドないですか
20221201 -> 20221130
20221202 -> 20221201
20220101 -> 20211231
20200301 -> 20200229
うるう年と月末年末に気を付けてif文で分けるしかないのかなと思いますが
case文ってコマンドプロンプトにないですよね
とやった後、1日前の日付にしたいのですがうまい方法・コマンドないですか
20221201 -> 20221130
20221202 -> 20221201
20220101 -> 20211231
20200301 -> 20200229
うるう年と月末年末に気を付けてif文で分けるしかないのかなと思いますが
case文ってコマンドプロンプトにないですよね
2022/12/01(木) 15:58:56.25ID:Z3Gzq7Gr
gotoがある
2022/12/01(木) 19:38:25.34ID:gTSnhqIH
計算すれば出来るんだろうけど面倒くさいのでPowerShell使ってる
2022/12/01(木) 21:59:03.06ID:CyN7Asjt
powershell -c "(get-date).adddays(-1).tostring('yyyyMMdd')"
2022/12/01(木) 22:14:49.13ID:M8gPga1Y
もうここpowershellスレにしたら
2022/12/01(木) 22:30:45.79ID:CyN7Asjt
過去スレにBATがあったと思って探してみた
何故かそのスレは過去ログに保存されてないので別サイトの方を示しとく
https://geolog.mydns.jp/www.geocities.co.jp/yggdrasil_leaf2000/log00/dos/win06.htm
ここのレス番65あたり
何故かそのスレは過去ログに保存されてないので別サイトの方を示しとく
https://geolog.mydns.jp/www.geocities.co.jp/yggdrasil_leaf2000/log00/dos/win06.htm
ここのレス番65あたり
2022/12/02(金) 07:27:12.50ID:elckNyGo
>>87
set /a d=20221201
set /a f=10000,g=100,h=8869,i=69,j=278803
set /a "n=d-1,n-=!(n%%f-g)*h,c=n/f"
set /a "a=j-!(c%%4)+!(c%%100)-!(c%%400)<<6"
set /a "n-=!(n%%g)*(i+(a>>(n%%f/g)*2&3))"
echo %n%
set /a d=20221201
set /a f=10000,g=100,h=8869,i=69,j=278803
set /a "n=d-1,n-=!(n%%f-g)*h,c=n/f"
set /a "a=j-!(c%%4)+!(c%%100)-!(c%%400)<<6"
set /a "n-=!(n%%g)*(i+(a>>(n%%f/g)*2&3))"
echo %n%
2022/12/02(金) 21:24:55.56ID:JHo2A9dA
日時の操作に関してはもう便利すぎてpowershellへ丸投げしたほうがいいな
powershellというか.NETのDateTimeのメソッドではあるが
>>93とか何してるか本当に合ってるのかわからんような事をするよりは
powershellというか.NETのDateTimeのメソッドではあるが
>>93とか何してるか本当に合ってるのかわからんような事をするよりは
2022/12/02(金) 22:23:50.58ID:elckNyGo
確かにそうだな。計算できん奴はやめとけ
2022/12/04(日) 15:45:51.56ID:xdG8GXCM
変数1の値を変数2にsetするとエラーになります。
値は文字列で不定ですが、記号文字が原因のようです。
遅延展開ではありません。
うまい方法はないですか。
値は文字列で不定ですが、記号文字が原因のようです。
遅延展開ではありません。
うまい方法はないですか。
2022/12/04(日) 20:44:29.33ID:pNrDPWEq
ダメな質問の見本になってるぞ
書ける範囲でいいから、再現性のある最低限のコードと
エラーメッセージとその時の実際の変数値を書いてくれ
書ける範囲でいいから、再現性のある最低限のコードと
エラーメッセージとその時の実際の変数値を書いてくれ
2022/12/05(月) 19:02:53.29ID:RxlUOQVH
>>96
原因の記号文字は何? ()<>&|%!"^ とか?
引用符(")が含まれていない場合は set "変数2=%変数1%"
含まれている場合はキャレット(^)で全部エスケープ
でもこれ「うまい方法」とは思えないけど
set /p 変数1=変数1=
set "変数2=" & set "CARET=^"
setlocal enabledelayedexpansion
:LOOP
set 変数2=!変数2!!CARET!!変数1:~0,1!
set 変数1=!変数1:~1!
if defined 変数1 goto LOOP
endlocal & set 変数2=%変数2%
rem 結果を確認する
set 変数1
set 変数2
原因の記号文字は何? ()<>&|%!"^ とか?
引用符(")が含まれていない場合は set "変数2=%変数1%"
含まれている場合はキャレット(^)で全部エスケープ
でもこれ「うまい方法」とは思えないけど
set /p 変数1=変数1=
set "変数2=" & set "CARET=^"
setlocal enabledelayedexpansion
:LOOP
set 変数2=!変数2!!CARET!!変数1:~0,1!
set 変数1=!変数1:~1!
if defined 変数1 goto LOOP
endlocal & set 変数2=%変数2%
rem 結果を確認する
set 変数1
set 変数2
2022/12/05(月) 23:44:59.81ID:Xw9Qnajp
「変数1の値を変数2にset」という意味では良い方法だと思う。
でも変数間でコピーだけして終わりって事はまずないから
あとは>>96が自分のコードにどう馴染ませて組み込んだりヒントにできるかだろうなぁ。
でも変数間でコピーだけして終わりって事はまずないから
あとは>>96が自分のコードにどう馴染ませて組み込んだりヒントにできるかだろうなぁ。
100デフォルトの名無しさん
2022/12/06(火) 10:31:46.97ID:VnO+filq いやこれだめだろ
試した?
試した?
101デフォルトの名無しさん
2022/12/06(火) 11:36:48.90ID:vjJKyhqV 続きはpowershellで
レスを投稿する
ニュース
- 高市総理の周辺「小さな火種が火事になりかけている。早く鎮火しないといけない」 ★4 [Hitzeschleier★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る [蚤の市★]
- 早大名誉教授が高市早苗首相の発言に言及「台湾も迷惑だと言っている」… [BFU★]
- 「影響これから」不安募るインバウンド関連業界 中国の訪日自粛要請 [蚤の市★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 【映画】『クレヨンしんちゃん』 中国で公開延期 対日報復、エンタメに波及 [冬月記者★]
- Xのネトウヨ「高市首相が日本から中国人を追い出した!!勝った!!」 [805596214]
- 【んな専🏡】姫森ルーナ(・o・🍬)総合スレッド🏰【ホロライブ▶】
- 愛国者「台湾有事になったらこれだけの国が台湾側で参戦するぞ!」→6万いいね [834922174]
- 【実況】博衣こよりのえちえち雀魂1位耐久🧪★2
- 高市早苗の経済損失、数十兆円〜数百兆円か [931948549]
- 高市経済ブレーン「経済対策28兆円必要」「円安急速すぎる、為替介入を」「来年1月の利上げも不要」 [237216734]
