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

48: 2022/11/03(木)13:02 ID:yr3S2O5F(1) AAS
>>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 のやり方が入れ子にならず良い
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
@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);
52
(1): 2022/11/03(木)15:28 ID:/STCGL2q(1) AAS
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文の使用法に誤りがあると考えられ
ますので、自力解決すべく調べているのですが…
参考になりそうなサイトなどご存知でしたら、教えて頂けませんでしょうか?
何度も申し訳ありません。
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=
for /f "delims=" %%A in ('find なんたら ^| sort') do (
if "%%A" neq "!PrevLine!" set /a Count+=1
set "PrevLine=%%A"
)
echo,!Count!
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

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
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 みたいなエスケープシーケンスで
カーソル位置を使って調べようかと思って

で質問した後で気づいたけど
代替画面バッファーに切り替えて mode con すればいいのな
まあ PowerShell 一発で取れるなら楽だしもういいかなって
でも他の方法があるなら知りたい
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
いくらぐぐってもファイルの行数を調べるとか画面の行数を変更するしか見つからない…
行数ごときというならぜひ思い出して教えてください
77: 2022/11/27(日)12:43 ID:WeJVO7HI(1/2) AAS
powershell (get-host).ui.rawui.windowsize
powershell (get-host).ui.rawui.windowsize.height
powershell (get-host).ui.rawui.windowsize.width
1-
あと 742 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.016s