X

【.cmd】 バッチファイルスクリプト %15 【.bat】

2022/09/14(水) 20:04:01.36ID:XL8H98jz
拡張子が .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/
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 がみつかりません。
3デフォルトの名無しさん
垢版 |
2022/09/16(金) 00:29:57.20ID:9kvq1ahn
FOR /f "tokens=1,2,3 delims=," %%a in (%HOGE%) do (
ECHO %%a %%b %%c
)
の間違いでした。だれか助けて〜
2022/09/16(金) 00:32:46.68ID:/mniU0r8
for /?

for /f
(ファイル)
("文字列")
('コマンド')
5デフォルトの名無しさん
垢版 |
2022/09/16(金) 00:42:16.15ID:9kvq1ahn
>>4
ありがとうございます!
神!
6デフォルトの名無しさん
垢版 |
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のところにはなにも表示されず、
その次に「オペラントがありません」と表示されます。

これはなにが起こっているのでしょうか…
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
8デフォルトの名無しさん
垢版 |
2022/09/26(月) 00:46:39.21ID:ou4YDIZU
>>7
御明察です!理由が分かって安心しました。ありがとうございます。

forループの中で、このような処理を書くことはできないのでしょうか。毎回ランダムで少し変えて実行する、という処理を書きたいのですが…
2022/09/26(月) 01:01:52.99ID:3mhNpNjH
for文の展開で解釈が一回多く入るから1回目の解釈後も環境変数として残すようにする
%%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ループ全体が一気に読み込まれるので、変数への代入が実行される前に変数の内容が確定してしまうという仕様なんですね。それを回避するために、!を付けて展開遅延変数を用いる、ということですね。

ただ、ランダムにしたはずなのに、毎回同じ値が表示されますね…
何故…
2022/09/26(月) 01:54:43.87ID:yGyQXERn
%random%
じゃなくて
!random!
2022/09/26(月) 05:19:01.77ID:L5dyrqoL
そういえば、181系って、完全に揃った編成ってあったんだろうか?
台車違いの編入車や、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!

「遅延環境変数」という名称はそういう変数が別にあるのかと紛らわしくて良く無いと思うわ
環境変数
特殊変数
標準展開、事前展開、%展開 (展開されてから構文解析)
遅延展開、!展開 (構文解析されてからコマンド実行直前に展開)
用いるなら「環境変数の遅延展開」だろう
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
2022/09/26(月) 17:38:32.28ID:dNpEj5o9
set /a a=random
は0なんやな
一般変数と処理が違うんだ
17デフォルトの名無しさん
垢版 |
2022/09/26(月) 21:36:40.64ID:ou4YDIZU
>>11
>>14

ありがとうございます。
うまく動きました!
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
2022/09/28(水) 12:04:21.93ID:Cg5haYXb
>>16
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」からは見えてるみたいだし。
21デフォルトの名無しさん
垢版 |
2022/10/05(水) 15:17:30.50ID:NmGDxxah
質問です。
ファイルのフルパスを表示するときに、
このコマンド使っていますよ、という意味で
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バイトに書き変わったのですがなぜでしょうか
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
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にリダイレクトしても容赦なく書き換えられるという点で、コマンドラインはそういう点で結構慈悲がない
ある程度はパワーユーザー向けという位置付けなので気をつけるしかない
2022/10/12(水) 04:44:03.67ID:Jko2ebMR
window-position異なる位置のバッチをそれぞれ作ってるのですが
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に上書きしますか?」になるだけなんですけど
上書きがしたいんじゃなくアーカイブしたいんです。
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"参照
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)を操作する事でできる。
確か、正式に提供した機能ではないので動作は保証しない、非推奨、みたいな扱いだった気が。
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でも助かります。
2022/11/02(水) 16:00:09.07ID:ZBNaiNsJ
44>>
スミマセン間違えました。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%
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

ファイル名やフォルダ名が英数字だけならこれでいけるんじゃね
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 のやり方が入れ子にならず良い
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$"
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);
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文の使用法に誤りがあると考えられ
ますので、自力解決すべく調べているのですが…
参考になりそうなサイトなどご存知でしたら、教えて頂けませんでしょうか?
何度も申し訳ありません。
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"
2022/11/03(木) 15:38:59.81ID:PVTx0HrP
あ、+= 1には意味なかったな
2022/11/03(木) 16:10:12.19ID:7S7IyYLz
>>52
だから 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

みたいなコマンドはないの?
2022/11/03(木) 17:41:34.26ID:7S7IyYLz
ない
2022/11/03(木) 18:18:22.55ID:P2O5CHdk
皆さんありがとうスマートっていうか単に速度の問題なのでどれが速いか競走させてみます
2022/11/03(木) 18:56:34.58ID:NbsIPyEs
>>59
少なくとも標準では無いね
まあ使いたいならwslに行くか同等の機能をPowerShellで書くとかかな
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!
2022/11/12(土) 20:19:55.55ID:/WV4ttu0
set /p で異体字セレクタ(IVS)を入力できない
IMEパッドが作動しない
いちいちメモ帳からコピペ入力するしかないのか
表示も化けてるし…
2022/11/12(土) 20:44:49.08ID:/WV4ttu0
IMEパッドはダメなので、文字コード+F5 でいけた
2022/11/13(日) 19:33:26.85ID:sU7z5EJX
>>64
Windows Terminal
IMEパッド可
異体字(IVS)表示可(対応フォントのみ)

cmdの標準ターミナルは仕様が古いまま放置されている
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
2022/11/18(金) 07:02:24.39ID:LiWOBYzs
>>66 サンクス
入力時に文字化けするので確認できない
echoで表示されるが文字の両側のスペースが気持ち悪い
でも標準画面よりはマシかな。おれは使わないけど
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に結果が入りますが
押さずに結果を得る方法はないでしょうか。
あるいはまったく別の方法でカーソルの位置を知る方法はないでしょうか。
2022/11/21(月) 21:55:41.71ID:o6gng8CJ
手段の拘りなければこんなんとかで。
powershell -nop -c "[Console]::CursorTop; [Console]::WindowTop;"
2022/11/22(火) 09:23:33.75ID:IBEEH7ii
過去にも似たような話があったなあ
何かでenterキーの入力を省略したいって
結局、うまい方法が見つからない
7269
垢版 |
2022/11/22(火) 21:44:34.08ID:CBUeGsgY
なるほど情報ありがとう
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 一発で取れるなら楽だしもういいかなって
でも他の方法があるなら知りたい
2022/11/27(日) 05:02:29.30ID:IKV/PDeN
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
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%
2022/11/27(日) 19:34:17.80ID:fMz//05T
Consoleにサブキーがいっぱいあるな
2022/11/27(日) 21:48:39.87ID:nWgXfjD8
PowerShellを使う方法もmodeを使う方法も >>74 で既出
それ以外の方法があったと >>75 は言ってるようなのだが…
なお reg を使う >>79 は今のウインドウのサイズじゃないから失格かなあ
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 が使えないからもう少しごちゃっとする
2022/11/29(火) 22:16:00.02ID:noJ3pHan
ぐぐって出てこないならもうpowershell使うしかないんじゃね
>>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
2022/11/29(火) 23:27:39.60ID:F0R68kvV
エスケープシーケンスはwin10以前だとダメじゃなかったっけ
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文ってコマンドプロンプトにないですよね
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あたり
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%
2022/12/02(金) 21:24:55.56ID:JHo2A9dA
日時の操作に関してはもう便利すぎてpowershellへ丸投げしたほうがいいな
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
2022/12/05(月) 23:44:59.81ID:Xw9Qnajp
「変数1の値を変数2にset」という意味では良い方法だと思う。

でも変数間でコピーだけして終わりって事はまずないから
あとは>>96が自分のコードにどう馴染ませて組み込んだりヒントにできるかだろうなぁ。
2022/12/06(火) 10:31:46.97ID:VnO+filq
いやこれだめだろ
試した?
2022/12/06(火) 11:36:48.90ID:vjJKyhqV
続きはpowershellで
2022/12/06(火) 22:47:20.75ID:LWPkE6+S
setlocal enabledelayedexpansion
for /f "delims=" %%i in ("set var2=!var1!") do endlocal & %%i
2022/12/07(水) 08:08:54.78ID:6/SG3KPg
>>100
不具合は無さそう
>>102
これシンプルでいいね。エスケープ不要だし
2022/12/07(水) 14:11:06.83ID:CzrTyJD4
何でも答えてくれるChatGPTに質問して教えてもらう時代になるかも
2022/12/17(土) 08:43:39.74ID:P7hTh7GB
%*を他の変数に入れる方法あります?
2022/12/17(土) 13:02:14.02ID:z3eWXHPR
set
2022/12/17(土) 13:56:37.78ID:hGrODwcv
>>97
2022/12/18(日) 11:04:55.68ID:3jhv+1oP
batch.cmd を batch.cmd echo ' ^& echo ^" ^& echo ! として実行した場合の
%*を他の変数に入れる方法あります?
2022/12/18(日) 14:23:46.88ID:8FmKOvk1
方法は無いよ。たぶん
引数はやめてファイルで渡すか、set /p で入力したら
2022/12/19(月) 21:25:44.08ID:OdY4312I
もしかして遅延展開が有効だったら
set VAR1=!VAR2!
は特殊文字おかまいなしの万能?
2022/12/21(水) 21:17:40.11ID:yR9jaPsy
よくわからんけど >>102 でいけるなら

setlocal enabledelayedexpansion
for /f "delims=" %%i in ("!var1!") do endlocal & set var2=%%i

もいけそうで、それなら

for /f "tokens=1* delims==" %%i in ('set var1') do if %%i==var1 set var2=%%j

でもいけそう
2022/12/21(水) 22:08:11.62ID:DgZmdBnN
上のは値の先頭が ; だと消える
eol^= にすればいい
下のは値の先頭が = だとその文字が消える
2022/12/21(水) 22:13:22.39ID:DgZmdBnN
set var1 の出力は複数かもしれない
2022/12/21(水) 22:54:47.75ID:DgZmdBnN
if で確認しているのか。失礼いたしました。
2022/12/22(木) 03:20:20.56ID:rMNtcPRb
バッチファイル内でキー入力を受けとろうと思って

>SET /P YN_Check="(Y/N):"
>Echo 入力されたのは %YN_Check%

としたのですが、%YN_Check% にちゃんと入力した文字が入らないのですが、何故でしょうか…?
この2行だけのバッチファイルなら、問題なく入力した値が入るのですが、
本来その処理をしたいバッチファイル内に記述すると、とたんにおかしくなります…
Y にしても y になったり、y を入力してるのに N になったり訳が分からない。
2022/12/22(木) 08:07:54.84ID:i1WKtawW
>>115
その本来の処理がおかしいと思われる
2022/12/22(木) 09:17:11.00ID:GhJnH83b
echo onで眺めてみよう
環境変数は実行前に展開される
遅延展開という謎機能をしっているか?
2022/12/22(木) 10:18:32.17ID:DSfJPeBV
for文とかの中で入れてるとかだろう
で変な値とかは実行前の変数に残ってる値
119115
垢版 |
2022/12/22(木) 13:27:25.08ID:rMNtcPRb
「遅延展開」なんて、全く知りませんでした。
ここで質問しなかったら、永遠に解決出来ませんでした。
有り難う御座いました!
2022/12/23(金) 08:34:41.65ID:FT8V4kp7
特殊記号のドキュメントはどこで見られますか
2022/12/24(土) 00:46:30.79ID:Q5Ixgqn/
powershellに実装されてない<とか&&とか||を隠ぺいするために抹消された
2022/12/24(土) 00:55:19.42ID:oMpeQZG3
サポート対象外になったOSとかの技術情報がMSサイトから消されつつあるな
この問題を消すと増える法則が発動しないインターネットから情報消えすぎ問題と呼称したい
2022/12/26(月) 15:27:21.10ID:aZQzx7UN
Using multiple commands and conditional processing symbols
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc737438(v=ws.10)#using-multiple-commands-and-conditional-processing-symbols
2023/01/03(火) 11:08:17.44ID:2hETcG3j
最近職場でbatファイルを知った者です。
住民様にご質問がございます。

自分の仕事の中に「デジカメで撮った今日の現場の写真をPCに移す」という作業があるのですが
そちらはbatファイルで対応することは可能なのでしょうか?
xcopyでバックアップではフォルダに過去の写真を残していないと毎回膨大な写真を写すことになってしまい
職場の脆弱なPCではすぐに容量オーバーしてしまいます。
今日の写真のみをPCに移す方法がもしあるなら恐れながらご教授していただけると助かります。
何卒宜しくお願いします。
2023/01/03(火) 13:27:43.33ID:sLJn58EA
>>124
更新日時が今日以降のファイルをコピー先に今日の日付のフォルダを作ってコピー
set ymd=%date:~0,4%%date:~5,2%%date:~8,2%
robocopy コピー元 コピー先\%ymd% /S /MAXAGE:%ymd%
2023/01/03(火) 14:21:42.12ID:axWhet1W
IF の中から GOTO で外に飛ぶと、括弧の使い方が間違っている
というエラーになるのですが、どうやって回避するのでしょうか?
2023/01/03(火) 15:15:36.56ID:cXTWG1PB
>>126
コード出してみ
2023/01/03(火) 15:27:36.49ID:VP4Ca8Qj
勝手な想像だけどgoto関数かラベルの次の行がカッコになってるパターンだと思う
goto :AAA
)
とか
:AAA
)
バッチファイルは実行時に1行になって解釈されるからこういう書き方だと例えば
else (goto :AAA)
となって閉じ括弧までがラベルの一部と解釈される
簡単な回避策としては括弧の前の行にremを挿入する
2023/01/03(火) 16:15:31.69ID:JXGfY3Iz
別のところに原因があるんじゃ
コード出して
2023/01/03(火) 16:51:21.56ID:z3dTsyyT
gotoは便利かもだけど、使わないにこしたことはない
2023/01/03(火) 16:58:09.34ID:2hETcG3j
>>125
正月にもかかわらず手早い返信ありがとうございます!!!
早速組んでみます!!
ありがとうございました!!!
2023/01/03(火) 17:01:38.01ID:axWhet1W
>>128
> 勝手な想像だけどgoto関数かラベルの次の行がカッコになってるパターンだと思う
まさにそれ、でした…
これは絶対に気付かないですよ…
有難う御座いました。
2023/01/03(火) 21:56:54.70ID:krBOweAa
>>128
横から失礼。よく分からない。再現できない
134≠126
垢版 |
2023/01/04(水) 01:32:14.88ID:fBnUHAjh
>>128
それある
どうやって回避したのかもう忘れたが
参考になりました
2023/01/04(水) 03:00:17.63ID:k64eH4zi
if %1 equ 1 (goto :true) else (goto :false)
goto :eof
:true
echo true
goto :eof
:false
echo false

これでエラーにならない(閉じ括弧を改行しても)
どうやればエラーになるの?
2023/01/04(水) 04:29:15.97ID:diYqjiE/
>>135
gotoはエラーにならないね

if 1==1 (
if 2==2 goto :skip
echo test1
:skip
)
こんな感じでカッコの前にラベルおいてるとエラーになる
2023/01/04(水) 06:05:18.72ID:3FgVyKvV
https://qiita.com/yz2cm/items/f808e4380faa3bd51a98
2023/01/04(水) 10:17:12.83ID:k64eH4zi
>>136
ラベルを括弧の中に設置するなんて考えたことも無かった
2023/01/04(水) 11:17:46.87ID:lFNs7lW+
まああり得るとは思うけど俺はそんな複雑なコードをバッチで書かないから知らんかったわ
2023/01/04(水) 22:36:34.28ID:AhEOb1lW
カッコの中は全部サブルーチンにすればいいと思うの
Callで呼んだ先では何でもし放題
2023/01/09(月) 02:14:07.73ID:2yNmR2Eh
括弧と言えばコメント行に半角括弧があると誤動作するから怖いわバッチはよお
2023/01/12(木) 00:00:34.91ID:n3PiBbyH
バッチファイルの中で以下のコマンド

cmd /c 子バッチファイル.bat

でさらにバッチファイルを実行させたあと
子バッチファイルの実行中にCtrl + Cで処理を中断して

バッチ ジョブを終了しますか (Y/N)?

をYで終了させたときに、親バッチファイルでもそれを受け継いでるみたいで、また

バッチ ジョブを終了しますか (Y/N)?

と表示されてしまうのですが、親バッチファイルに戻ったときにはバッチファイルの続きを処理するようにできないものでしょうか?

ご存知の方がいらっしゃいましたらお教えください。
2023/01/12(木) 14:55:11.73ID:M53QXIM6
2回目にNを押したらいいだけじゃね
2023/01/12(木) 20:12:55.87ID:OEk4sgu+
子でCtrl+C,Yで中断したら親に戻ったらしれっと続きが動いたのでわからん
2023/01/13(金) 00:02:34.96ID:XUJfPljW
>>142
親バッチで
@echo off
start /wait "" "cmd /c %~dp0子バッチ.bat"
echo %errorlevel%
paiuse

子バッチで
@echo off
echo %~n0%~x0
ping 127.0.0.1 -n 3 > NUL 2>&1
exit /b 123

とすると子バッチがCtrl + Cで中断した場合親バッチの%errorlevel%に255、かつCtrl + Cの伝達はなし、
子バッチが最後まで終わった場合は親バッチの%errorlevel%に子バッチのexit /bの値123が返るのを確認したよ
要するにコンソールを複数出せばシグナルは伝達しない。意図した動作かは知らんけど
146デフォルトの名無しさん
垢版 |
2023/01/23(月) 17:49:53.11ID:0BNLAxAb
関係者に配布していたマクロ入りエクセルファイルがマイクロソフトの対応によって容易に開くことができなくなりました。
同じような質問でうんざりしていたので、バッチファイルを配って対応したいと思います。

マイドキュメントの中に「trustdoc」というディレクトリを作り、
このディレクトリの中にあるエクセルファイルは、信頼できるファイルだとレジストリを操作させたいと思います。
レジストリの操作方法をコマンドでどうかくか情報がなくて、アドバイスいただけたらと思います。

https://support.microsoft.com/ja-jp/office/microsoft-office-%E3%81%A7%E4%BF%A1%E9%A0%BC%E3%81%A7%E3%81%8D%E3%82%8B%E5%A0%B4%E6%89%80%E3%82%92%E8%BF%BD%E5%8A%A0-%E5%89%8A%E9%99%A4-%E3%81%BE%E3%81%9F%E3%81%AF%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-7ee1cdc2-483e-4cbb-bcb3-4e7c67147fb4
にある、「信頼できる場所を追加する」
をコマンドで表すとどういう書き方になるでしょうか?
追加するディレクトリは、
%userprofile%\Documents\trustdoc
になります。
2023/01/23(月) 18:28:05.17ID:g43oPRJS
>>146
レジストリのHKCUだかに設定箇所があるはず
信頼できる場所レジストリとかでググればすぐ出てくると思う
2023/01/23(月) 18:35:51.01ID:g43oPRJS
ああ、書き方を教えて欲しいのか
reg add レジストリキー /v 値の名前 /t 値の型 /d 値 /f
詳細はreg add /?
2023/01/23(月) 18:40:02.27ID:0BNLAxAb
ありがとうございます。調べてみます!
2023/01/23(月) 19:15:50.55ID:0BNLAxAb
あともう少しな気がします。

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Security\Trusted Locations" /v "trust Documents" /t REG_DWORD /d "%userprofile%\Documents\trustdoc" /f
151デフォルトの名無しさん
垢版 |
2023/01/23(月) 19:31:12.28ID:0BNLAxAb
これ↓でコマンドが通りましたが、
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Security\Trusted Locations" /v "trust Documents" /t REG_SZ /d "%userprofile%\Documents\trustdoc" /f

レジストリエディタみるとデータが追加されていなかったでした。
これ以上素人がレジストリをいじるのは危険かと思いましたので、GUIで説明するようにいたします。
お騒がせしてすいませんでした。
2023/01/23(月) 20:08:04.41ID:dfKZHUgs
オフィス(Excelなど)起動したまま変更しようとしたとか?
2023/01/23(月) 20:18:25.17ID:0BNLAxAb
いえ。エクセルを閉じてもやっぱり該当のレジストリに設定が追加されていませんでした。
環境変数のパスが悪いのかとも思って実際のパスに変えても同じでした。
レジストリの変更は注意しないといけないと言われていますので、
鳴れていないコマンドやバッチで対応する方法はあきらめようかと思います。
お騒がせしてすいませんでした。
2023/01/23(月) 20:22:32.26ID:dfKZHUgs
そうでしたか
適当なことを言ってすみません
2023/01/23(月) 20:26:53.26ID:0BNLAxAb
いえ。アドバイスありがとうございました。
2023/01/23(月) 20:29:44.46ID:NaDuOShR
レジストリエディタでTrusted Locationsをエクスポートした.regファイルを
余計な行が含まれてないか確認の上配布でよくね?
157デフォルトの名無しさん
垢版 |
2023/01/23(月) 20:35:10.99ID:0BNLAxAb
.regファイル!!
ちょっと調べてみます。ありがとうございます。
2023/01/23(月) 20:55:31.79ID:0BNLAxAb
エクセルアプリからの設定によるレジストリ変更は成功しました。
.regファイルを開いてみました。

----
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Security\Trusted Locations\Location6]
"Path"="C:\\%userprofile%\\Documents\\trustdocs\\"
"AllowSubfolders"=dword:00000001
"Description"="Excel emotet対応"
"Date"="01/23/2023 20:44"
----

このKeyにある「Location6」というのは、たぶんユーザーごとに違う値のような予感。
「Location1」からaddで追加されてきた名前かと思います。
折角のアドバイスですが難しい気がします。
159デフォルトの名無しさん
垢版 |
2023/01/23(月) 21:07:08.10ID:0BNLAxAb
あ。これでレジストリの追記ができました。
keyに新しい文字列「test」を後ろに付け足しました。
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Security\Trusted Locations\test" /v "trust Documents" /t REG_SZ /d "%userprofile%\Documents\trustdocs" /f

.regなるものをみてハッとしました。
皆さんアドバイスありがとうございました。
2023/01/24(火) 12:55:17.67ID:emIiCzRd
testとか適当でも良いのか
勉強になったわ
2023/01/24(火) 13:53:07.93ID:9U26EPIz
動いたのならいいけど、%userprofile%ってREG_EXPAND_SZではなくてREG_SZでも有効なんだっけ?
Excel側で環境変数を展開してるんだろうか
2023/01/24(火) 13:58:27.44ID:r0FUzBRQ
大抵のソフトは環境変数を受け付けるだろ
俺も作るときは環境変数を受け付けるように作るよ
2023/01/24(火) 14:13:23.74ID:9q3wnipD
%%userprofile%%じゃないからbatの時点で展開されてる件
2023/02/15(水) 08:54:37.01ID:SA6Um8/R
for %s in (c:\windows\system32\*.*) do @echo %random%
1つのコマンドを実行中、乱数を振り直してはくれないのね・・・
165デフォルトの名無しさん
垢版 |
2023/02/15(水) 09:43:24.57ID:TE3DoOlC
遅延環境変数でも駄目?
2023/02/15(水) 09:50:13.69ID:SA6Um8/R
あかんかった
2023/02/15(水) 12:26:54.02ID:z8T+7ef0
そんなことないやろ
!random!でばらけるで
2023/02/15(水) 13:04:59.88ID:SA6Um8/R
おお、ほんとだ
for %%s in (*.*) do (
setlocal ENABLEDELAYEDEXPANSION
echo !random!
endlocal
)

しかし、これはダメ
setlocal ENABLEDELAYEDEXPANSION
for %s in (c:\windows\system32\*.*) do @echo !random!
endlocal

うーみゅ??
2023/02/15(水) 13:08:20.84ID:vbXbTgUC
setlocal enabledelayedexpansion
for %%f in ( *.* ) do @echo !random!

ちゃんと毎回乱数になってるぞ??
2023/02/15(水) 13:55:25.99ID:SA6Um8/R
.batファイルの中でならOK
forコマンド直打ちはNG
なのね
2023/02/15(水) 21:53:53.82ID:2801FI6C
dir あいう!えお.txt → 確認OK
for %%i in ( dir ”*.txt” ) do (
echo ”%%~nxi” →❶
dir ”%%~nxi” →➋
)

❶→あいうえお.txt
➋→ファイル無し

この問題(for文の内部で半角!文字が含まれたファイル名で、!が消えた名前に変わってしまう)の回避方法をご教示いただければ幸いです。
(「あいう!えお.txt」のファイル有りきで…)
172デフォルトの名無しさん
垢版 |
2023/02/16(木) 11:33:08.40ID:Pi7fCiR3
引用符が全角?
173デフォルトの名無しさん
垢版 |
2023/02/16(木) 12:30:36.05ID:Pi7fCiR3
SETLOCAL DISABLEDELAYEDEXPANSION
for %%i in (*.txt) do (
echo "%%~nxi"
)
2023/02/16(木) 13:25:19.43ID:tOoYyZel
! が消えるって自分も前に経験して困ったことあるけど今適当に試しても消えないな
どういう書き方したら消えるんだっけか
2023/02/16(木) 22:08:46.71ID:tOoYyZel
setlocal enabledelayedexpansionを使うと駄目なんだっけか
173のレスをコピペして試してたから再現しなかった
回避方法はこの辺読めばいいんじゃないかな>>171
https://qiita.com/yz2cm/items/4983be006116c369d08b
2023/02/18(土) 13:12:03.68ID:S+SrMYX3
>>171
doの中身をcall使ってサブルーチンにする
サブルーチンの先でDisableDelayedExpansionを行って
一時的に遅延環境変数展開をOFFにする
ちなみにdoの括弧の中でDisableDelayedExpansionしても意味はない

コマンドが実行されるときにどこまでが1行として処理されるかよく考えてみて
2023/02/18(土) 16:15:41.68ID:nz9Z1NDi
脳死だがバッチは基本使わない対処をした方が優れている
扱う出力内容で>>171みたいな一見不可解な事が起こり易い
メモ帳で書いてUTF8で保存したり全角文字を混ぜて実行するバカもいる
こんなバッチなんて書いていられるか俺は自分の言語に戻らせてもらう
2023/02/18(土) 20:08:07.43ID:S+SrMYX3
バッチファイルのスレで何言ってるんだこいつ
2023/02/19(日) 06:53:20.13ID:B9Nm4zxk
はい、バイバーイ  ノシ
二度と戻ってこないでね
2023/02/23(木) 22:02:16.64ID:KL0E1A05
>>176
サンクス。何とか回避できたようです。
ありがとうございました。
m(_ _)m
2023/02/24(金) 06:16:27.49ID:umH2oUG6
176の方法で回避?
call しても ! 文字は消えるけど
どうやって値を渡したのか、ちゃんと報告しろ
2023/02/24(金) 06:21:19.29ID:jJ3mlMsu
なぜそんな上からなのか
2023/02/24(金) 06:50:27.38ID:umH2oUG6
そうか?
報告してください。お願いします。
2023/02/24(金) 13:07:53.45ID:xAv3d2xt
よろしい
2023/02/26(日) 02:12:26.08ID:6qO2uMR0
>>183
私も単にcallにしただけではiの文字が消えたままだったけど、
setlocalを全部外したらcallした先でi文字付きで認識できるようになった。
なんでそうなったかは正直確信が持てないが、気がついた変更はそれだった。
ハッキリ答えられずすみません…
2023/02/26(日) 07:59:37.30ID:ZRUXpLmJ
>>185
報告ありがとう
遅延展開での for 文の変数値に ! や ^ があると値が変わる事がある
遅延無しなら値が変わらない
call にするかどうかは別の話
ヘルプをよく読んで下さい
setlocal /?
for /?
引用符は半角にして下さい
質問文のバッチはそれだけで他人が問題点を再現できるものにして下さい
2023/02/26(日) 20:35:28.85ID:gahU4Yv8
なぜそんなギスギスなのか
仕事中に仕事以外の会話のできない方か
2023/02/26(日) 23:08:44.91ID:d/RsgC9o
これAIの何とかってやつが書いた文章だろ?…っての、そこら中で見るなw
2023/02/27(月) 11:42:47.10ID:JmzEtsrD
まあ好かれる人間ではないよな
たまにいる、そういう奴
2023/02/27(月) 11:47:26.81ID:MWG0Dnko
まあ対面では絶対そんな言葉使いはしないよね
2023/02/27(月) 14:46:21.47ID:+mdXvmJb
変数値が変わるわけないだろ
展開した値が元と違うだけ
192デフォルトの名無しさん
垢版 |
2023/03/01(水) 12:26:47.31ID:fuKOGN7X
すいません
超初心者的な質問なんですが、
バッチファイルって、サブルーチンを設定する時に、一度実行されてしまうんですよね?
2023/03/01(水) 13:18:49.01ID:p0dowhw3
call先で一行ずつ実行するだけ
サブルーチンの設定て何だろ
2023/03/01(水) 13:49:19.87ID:Co0n2HTo
質問が不明瞭すぎる
2023/03/01(水) 15:49:02.20ID:tZuIfIoC
>>192
バッチファイルにサブルーチンなんて無い
サブルーチン的な事したければラベル書いてそこにジャンプする
当然ジャンプじゃなくて上から来た場合も普通に実行される
それが嫌ならラベルの直前に exit/b でも書いとけ
196デフォルトの名無しさん
垢版 |
2023/03/01(水) 17:52:18.10ID:fuKOGN7X
すいません
具体的に書きます!!

@echo off

call :set_errorlevel


:set_errorlevel

echo aaaaa

exit /b

こういうのがあったとして

C:\Users\■■■>■:\1112.bat
aaaaa
aaaaa

↑なぜ二つ実行されるのか?って意味です。
2023/03/01(水) 17:54:05.48ID:68s28u+f
1回目がcallで実行
2回目がそのままの流れで実行されてる
2023/03/01(水) 18:36:49.49ID:GaouMb9c
1行ずつ逐次実行していくから
call文でラベルに飛んで実行し戻って来る
ステップが次の行に移行してcall文の次の文を実行しようとする
そこにはラベル以下があったわけだ
call文から戻ってきた所で実行を止めたければ
goto :eof
をcall文の次に書いておくといい
199デフォルトの名無しさん
垢版 |
2023/03/01(水) 18:59:16.83ID:fuKOGN7X
>>193
>>195
更新してなかったので、レスに気が付きませんでしたs。
おお!できました!
理解出来ました!
有難う御座いましたs。
200デフォルトの名無しさん
垢版 |
2023/03/01(水) 19:02:16.77ID:fuKOGN7X
>>198
>>197
おお!なるほど!それでもできました!
ありがとうございました!
201デフォルトの名無しさん
垢版 |
2023/03/01(水) 19:04:20.16ID:fuKOGN7X
なるほど
ただラベルをつけてよびだしているだけなんですね
バッチにmethodやサブルーチンって概念はないんですね!
勉強になりました1
202デフォルトの名無しさん
垢版 |
2023/03/01(水) 19:05:12.08ID:fuKOGN7X
ていうことは、うまく調整しないと、2回同じ実行することになりますね!
早めに気が付いてよかったです!
2023/03/01(水) 22:53:45.68ID:6i7MYFqO
コマンドプロンプトから
start chrome "D:/test.html?a=001"
としたのですが
D:/test.html
が開かれました。
ローカルのhtmlにクエリを付けて開く方法があればご教示頂きたいです。
2023/03/01(水) 23:15:54.48ID:8kmkGnGP
それはchromeのお話ですねえ
開発元のgoogleに聞くのが早いのでは
2023/03/02(木) 07:45:52.86ID:X0Akc+Oj
起動するとネットワークプリンタでファイルを出力できるバッチファイルて作れますか?
2023/03/02(木) 10:15:53.52ID:rYHGX+R7
ネットワークプリンタで出力されるものは印刷物です
ファイルではありません
2023/03/02(木) 10:50:24.75ID:h3FhlPC5
>>203
クエスチョンマーク以降のパラメーターを解釈するのは、Webサーバーのお仕事です
サーバーを立ち上げるか借りるかしましょう
2023/03/02(木) 11:39:56.39ID:5LS4jA2t
>>203
"file:///D:/test.html?a=001"は?
"D:/test.html?a=001"だとD:/test.html%3Fa=001を開こうとしてERR_FILE_NOT_FOUNDになるなぁ
2023/03/02(木) 12:44:28.71ID:RvyObGoZ
>>208
それでいけるね
ちゃんとクエリーデータも渡ってきてる
2023/03/02(木) 14:02:39.40ID:RvyObGoZ
>>207
クエリーパラメタはURLの解釈の部分だと思われる(window.location.search)ので
サーバーの仕事というよりHTMLの実行部分(エンジン)の仕事なんだろうね
211デフォルトの名無しさん
垢版 |
2023/03/03(金) 14:20:26.65ID:cfdc5Bpc
あぐえ
212デフォルトの名無しさん
垢版 |
2023/03/03(金) 14:22:08.63ID:cfdc5Bpc
ぼうけ
213デフォルトの名無しさん
垢版 |
2023/03/07(火) 15:36:52.13ID:aaO7s6EJ
「作成日時が30日以上前」を条件としてフォルダ内のファイルを削除したいのですが、方法はありますか?

forfiles だと更新日時が条件となってしまいます、、、
2023/03/07(火) 16:49:23.24ID:/8dYORgk
作成日時は頑張れば取得できるけどコマンドプロンプトでは時間計算ができないから
PowerShellのスクリプトを書いたほうがいいと思う
2023/03/07(火) 17:27:20.76ID:GAVJiBto
@echo off
for /f "usebackq" %%i in (`powershell -c "([datetime](get-date)).AddDays(-30).tostring('yyyyMMdd')"`) do set now=%%i

for /f "tokens=1-5* skip=4 delims=/ " %%i in ('dir /tc /od /a-d') do (
if %%i%%j%%k gtr %now% goto:eof
if "%%n" neq "" echo delete --- %%n
)
216デフォルトの名無しさん
垢版 |
2023/03/07(火) 18:08:36.87ID:aaO7s6EJ
>>214
簡単に取得できないんですね、、、
forfileに変わるような便利なコマンドがあれば良かったんですけどね、、、
ありがとうございます。
2023/03/07(火) 19:20:35.55ID:UPk4pcGD
自分でexe作るよろし
2023/03/07(火) 19:39:11.17ID:trxvq/2q
前月の同日以前にしたら
2023/03/08(水) 05:54:33.72ID:AsCwI7z1
Ruby なら、glob, birthtime を使う。
ただし、DryRun なので実際には削除されません

require 'fileutils'
require 'date'

Prev_day_30 = Date.today - 30 # 今日の30日前

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/test/*"

Dir.glob( glob_pattern ).select do |full_path|
stat = File.stat full_path
date = stat.birthtime.to_date # 作成日付

# ファイルで、作成日付が今日の30日前以前のものだけ。30日前も含む
stat.file? && date <= Prev_day_30
end
.each { |full_path| FileUtils::DryRun.rm( full_path ) } # ファイルを削除
2023/03/09(木) 08:57:37.30ID:12Ly5Xlm
コマンドラインで置換するスクリプトを拾って改造したけど半角スペースや!が混ざるとうまくいかない

chcp 65001
@echo off
echo "第1引数はパス「%1」です。"
echo "第2引数は置換前「%2」です。"
echo "第3引数は置換後「%3」です。"
echo "第4引数はファイル名「%4」です。"
cd /D %1
rem "もし「file_replaced.txt」ファイルが既に存在している場合、削除しておく"
if exist backup_%4 del backup_%4
rem "元ファイルをリネームする"
rename %4 backup_%4
rem "以下の「for」ループ内で変数を変化させるための宣言"
setlocal ENABLEDELAYEDEXPANSION
rem "「for」ループで「file.txt」ファイルの内容を1行ずつ取得し、"
rem "「woman」を「girl」に置換する"
for /f "delims=" %%a in (backup_%4) do (
rem "変数「line」にファイル内容を一行ずつ代入する"
set line=%%a
rem "変数「line」内の「woman」を「girl」に置換し、"
rem "「file_replaced.txt」ファイルに書き込む"
echo !line:%2=%3!>>%4
)

endlocal
2023/03/09(木) 09:46:40.82ID:H0Wzj8XM
強いて言うなら、変数は ”” でくくる、”%%~a”、”%~1” みたいに
使うほうがトラブルが少ない、
! だけじゃなくて ^ や % などもケアする必要があるので面倒くさい、
になってくる

なので、バッチファイルでやる縛りがあるなら仕方ないかもだけど、
さすがに置換のできる何かを、使うor使えるようにした方が良くない?
今どきの PC なら PowerShell 使えるだろうからせめてそっちにするとか
2023/03/09(木) 19:15:35.15ID:eHaHoipW
外部コマンドで置換できるツールがフォーカスを奪う仕様で操作できなくなるから
VMで実行したら数時間たっても終わらなくて
別の方法を探したらこれに至った

専用ソフトが見つかり無事終わった
2023/03/10(金) 02:47:18.98ID:5g8/KHh8
Ruby なら、

re = /あい/

text = <<'EOT'
xあいxあい
yあ
いy
あい
EOT

puts dest = text.gsub( re, 'そら' )

出力
xそらxそら
yあ
いy
そら
2023/03/10(金) 03:09:52.26ID:dbCMTPvQ
チラシの裏で
2023/03/10(金) 17:32:01.38ID:eGLVllnw
散々コマンドリファレンスを読んだりググったけど分からないことを教えてください。

type data.txt | hoge.bat
みたいな事がしたいのですが、バッチスクリプトで、
・bash での read line
・VBScript での WScript.StdIn.ReadLine
のように、1行ずつ標準入力を読むことは可能でしょうか?やっぱり駄目でしょうか?
2023/03/10(金) 18:36:07.72ID:3mB0yP28
for /F
2023/03/10(金) 18:44:37.57ID:KiwyNmEo
何がやっぱりなのかわからん
もっとちゃんとググれ
2023/03/10(金) 19:12:34.24ID:eGLVllnw
>>226
ヒントありがとう。for の中であのコマンドを使うんか…。

>>227
上から目線のジジイはすっこんでろ。
どうせ分かんないんだろ。
ということで正解はここには書かん
2023/03/10(金) 19:31:43.62ID:hNo+M64i
要するに見ての通り他のコマンドからパイプで渡された標準入力をバッチファイルで受け取りたいと言う事でしょ
無理なんじゃね
2023/03/10(金) 19:46:29.11ID:vz26ACYY
やっぱり(予想通り・諦め・失望)
2023/03/10(金) 20:58:45.48ID:c3BQ1P8m
こんなのでもいいかな?
@echo off
set lines=0
for /f "tokens=*" %%i in ('more') do (
set data=%%i
call :sub
)
goto :eof
:sub
set /a lines+=1
echo %lines% - %data%
2023/03/10(金) 21:03:30.78ID:c3BQ1P8m
もちろん
forループの特性上、空白行はスキップされたりいろいろするので
finsdtrと組み合わせたり色々しないといけないけど
過去ログにその話はあったかと
2023/03/10(金) 21:21:55.47ID:c3BQ1P8m
一応表示は""で括ったほうがいいかな
データ内容次第ではエラーとか色々起きるんで
2023/03/10(金) 21:27:21.03ID:c3BQ1P8m
バッチの入力データ次第という奴はどうしようもないことは以前から何度もレスされてる
""で括ってもダメで遅延環境変数で出力するのが一番まともかも
完全ではないだろうけど
235デフォルトの名無しさん
垢版 |
2023/03/18(土) 01:36:02.39ID:iEi+ABmN
フォーいーちないのか?
236デフォルトの名無しさん
垢版 |
2023/04/13(木) 18:51:07.20ID:dCQIGdp/
>>225
bing のチャットAIに丸投げしてみた

バッチスクリプトで標準入力を1行ずつ読む方法については、以下のような方法があります¹⁴。
- `for /f %%[アルファベット1文字] in ([ファイル名]) do ([処理])` を使う方法
- `set /p 変数名=` を使う方法

例えば、以下のようなバッチスクリプトで、data.txt の内容を hoge.bat に渡すことができます。
```
@echo off
for /f %%a in (data.txt) do (
echo %%a | hoge.bat
)
```
上記の例では、data.txt の内容を1行ずつ読み込み、hoge.bat に渡しています。¹
2023/04/14(金) 12:47:02.76ID:ITYRpePX
質問は受け側のバッチの内容だろ
送り側でfor文にする意味不明
2023/04/14(金) 13:02:44.39ID:twidN+O+
処理対象がconioだった名残がたまたま残ってただけで
バッチ自体に標準入力という概念は無さそう
2023/04/16(日) 15:03:53.79ID:OSGOKcik
ループ処理やif分でもカッコ内の変数スコープがおかしくなるのはどういう原理なんです?
2023/04/16(日) 15:21:04.10ID:j/ssGNNl
実行する行の解釈の後に実行されるから
この行の解釈は(から)までは1行として一気に解釈される
つまり括弧の中の代入文があったとしても実行前の解釈の時点で(その時点の値で)展開されてしまう
2023/04/16(日) 15:36:27.49ID:j/ssGNNl
>>239
set /?
に詳しい説明があるので読んでみること
2023/04/16(日) 16:30:15.10ID:zYIf7I3E
なにをやってスコープがおかしくなったのか具体例を上げてくれないとなんとも言えないな
2023/04/16(日) 16:43:43.01ID:j/ssGNNl
いやだからスコープなんて高級な概念は存在しないんだけど
2023/04/16(日) 16:45:17.05ID:Dywad+WI
バッチファイルの言語仕様はウンコすぎるから
if ... call :foo "%~1"
for ... call :foo "%%~i"
とかやっといた方がミスが少ない
2023/04/16(日) 16:45:38.04ID:j/ssGNNl
いやsetlocalがあったか
でもそれを使ってるんならまず自分のやってることは認識してるはずなんだが
2023/04/18(火) 09:44:21.06ID:N1MfEhNS
ファイルディスクリプタの1(標準出力)と3を同時にリダイレクトすると
以降プロンプトや標準出力が表示されなくなるのはなぜでしょう?
ハング等ではなく表示されないだけで、cmdとの対話モードは続いているようです。

C:\> dir >nul 3>nul
dir  ←表示されない
dir >&2  ←表示される
winver  ←起動する
2023/04/19(水) 22:45:42.84ID:UrhLKEvZ
win11 64bitの環境でどのようなフォルダを開いても
最初からファイルの並びや表示を↓のようにしたいです。
●●●●●●●●●●●
表示は「一覧」
並び替えは「名前」で「昇順」
グループで表示は「なし」
●●●●●●●●●●●
クリーンインストール直後でもbatファイルで一発で
出来るようなの教えてください
2023/04/20(木) 22:07:04.72ID:dJqrvGvM
クリーンインストールでやる場合はISOイメージをカスタマイズする必要あると思うし
このスレの範疇をだいぶ超えてるような気がする
ひょっとすると外人ならbatファイル一発でやる「技」を持ってるかもしれないね
2023/04/21(金) 08:48:46.19ID:TBBX4m6H
>>246
ようわからんなこれ。
標準出力の向き先が3番に切り替わってる。
4番もリダイレクトすると標準エラー出力も切り替わりっぱなしになる。

バグ利用?だけどこれ利用するとデフォルトでログ出力できるな。
echo onだとプロンプトまで記録できる。

●【バッチ】**************************
@type nul 1>nul 2>nul 3>"%~f0.log" 4>&3
echo 処理開始
ver
cd aaa
echo 処理終了
@exit /b
●【画面】****************************
処理終了
続行するには何かキーを押してください . . .
●【ログ】****************************
C:\>echo 処理開始
処理開始

C:\>ver
Microsoft Windows [Version 10.0.19044.2846]

C:\>cd aaa
指定されたパスが見つかりません。

C:\>echo 処理終了
処理終了
2023/04/21(金) 08:53:12.94ID:TBBX4m6H
>>249
改行数制限に引っかかって修正した時にバッチ内容間違えた。

@type nul 1>nul 2>nul 3>"%~f0.log" 4>&3
echo 処理開始
ver
cd aaa
echo 処理終了
@echo 処理終了 >&3 & pause >&3
@exit /b
2023/04/24(月) 17:00:24.74ID:oDKRGmAI
>>247
その設定にするレジストリ教えて
252デフォルトの名無しさん
垢版 |
2023/04/26(水) 22:20:37.49ID:MVyBKPQf
---------------
@echo off
set "parent_directories=tamachi omiya"
set "sub_directories=0001 0002 0010"
setlocal enabledelayedexpansion
for %%P in (%parent_directories%) do (
for %%S in (%sub_directories%) do (
set "combined_directory=%%P%%S"
echo RewriteEngine On > !combined_directory!.htaccess
echo RewriteBase /%%P/%%S/ >> !combined_directory!.htaccess
echo. >> !combined_directory!.htaccess
echo # Redirect only short URLs >> !combined_directory!.htaccess
echo RewriteCond %%{REQUEST_FILENAME} !-f >> !combined_directory!.htaccess
echo RewriteCond %%{REQUEST_FILENAME} !-d >> !combined_directory!.htaccess
echo RewriteRule ^^(.+)$ htdocs/$1 [L] >> !combined_directory!.htaccess
)
)
上記のようなコマンドのバッチを作った。
バッチを叩くと以下のようなhtaccessをfor分だけ出力させたい。
しかし、$文字のために、バッチがすすまない。$$としてエスケープ試してみるもできなかった。
良きアイデアないだろうか?
---------------
【tamachi0001.htaccess】

RewriteEngine On
RewriteBase /tamachi/0001/

# Redirect only short URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ htdocs/$1 [L]
2023/04/26(水) 22:46:13.41ID:UfBGheQ3
>>252
$の前の)がdoの閉じカッコになっちゃってる
echo RewriteRule ^^(.+^)$ htdocs/$1 [L] >> !combined_directory!.htaccess
2023/04/26(水) 23:03:33.59ID:MVyBKPQf
>>253
ありがとう。確かにvscodeだと()対応の注意はなかったのに、sublimetextでは注意してる。
気づかないなあー。助かりました。勉強になります。
255デフォルトの名無しさん
垢版 |
2023/04/26(水) 23:43:29.63ID:MVyBKPQf
別件にて質問させてください。
バッチが出力するファイルを

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d

ではなくて、

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

としたい。
どのように修正すればよいでしょうか?


------

@echo off
set "parent_directories=tamachi omiya"
set "sub_directories=0001 0002 0010"
setlocal enabledelayedexpansion

for %%P in (%parent_directories%) do (
for %%S in (%sub_directories%) do (
set "combined_directory=%%P%%S"
echo RewriteEngine On > !combined_directory!.htaccess
echo RewriteBase /%%P/%%S/ >> !combined_directory!.htaccess
echo. >> !combined_directory!.htaccess
echo # Redirect only short URLs >> !combined_directory!.htaccess
echo RewriteCond %%{REQUEST_FILENAME} !-f >> !combined_directory!.htaccess
echo RewriteCond %%{REQUEST_FILENAME} !-d >> !combined_directory!.htaccess
)
)

------
2023/04/27(木) 00:51:53.98ID:DnKcM+QL
自己解決しました。
理屈がよくわかりませんが、!の直前に^^とすることでエスケープすることができました
echo RewriteCond %%{REQUEST_FILENAME} !-f >> !combined_directory!.htaccess
echo RewriteCond %%{REQUEST_FILENAME} !-d >> !combined_directory!.htaccess

echo RewriteCond %%{REQUEST_FILENAME} ^^!-f >> !combined_directory!.htaccess
echo RewriteCond %%{REQUEST_FILENAME} ^^!-d >> !combined_directory!.htaccess

お騒がせいたしました。
2023/04/27(木) 01:12:28.56ID:RXLaISm2
^^
2023/04/28(金) 00:51:43.20ID:aBUvFTO3
>>256
なんでだろう
^^どころか^も使わないものな
2023/05/05(金) 12:47:19.73ID:Tmh5Tg58
バッチファイルをvbsに移植してってAIに投げたらやってくれたんでPythonも頼んだらこっちも成功
妙な制限から卒業できるぞ
2023/05/05(金) 13:40:50.07ID:Aaus9EG8
c#がいいんじゃないか
pythonは入れてない人が殆どだろうし、c#ならwindows全員入ってる
まあ一旦コンパイルしないといけないけど
2023/05/05(金) 20:08:22.78ID:cXUEGYUP
だったらC#はpowershellからコンパイルなしで使えるからpowershellがいいんじゃないか
実際powershellとC#ごっちゃにして使ってるぞ
2023/05/05(金) 20:13:58.35ID:jijjo6rD
powershellはダブルクリックで動かんから個人ユーザーには向かない
2023/05/05(金) 21:08:13.64ID:oeszHJgX
いやPowershellはexe化できるからダブルクリック起動も余裕だろ
2023/05/05(金) 21:25:45.96ID:Aaus9EG8
powershellはイニシャルコストが高いんだよな
PC起動後初回起動で相当待たされる
よく使う人にはいいんだろうが、1ヶ月に数回とかだと苦痛なんだよ
2023/05/05(金) 23:33:04.65ID:VDYHFDsH
昔はVBランタイムや
.NET Frameworkも起動遅かったよなー
2023/05/06(土) 17:23:48.16ID:gRoxw4m5
jqコマンドってどっかにスレないかな
cmdでバッチ作って動かしてるんだけど
jsonで
"characterID": 1,"Level": 50, "Status": {~
"characterID": 1,"Level": 100, "Status": {~
"characterID": 2,"Level": 50, "Status": {~
"characterID": 3,"Level": 50, "Status": {~
"characterID": 3,"Level": 100, "Status": {~
みたいにキャラごとにレベル50と100があったり50しかない場合があったりするんだけど
キャラごとに100があったらそれだけなかったら50を拾うみたいな条件で引っこ抜きたいんだけど上手くいかないので何かいい方法ないかなって探してます
何かいい方法ないでしょうか
2023/05/06(土) 18:44:39.95ID:ugbjGoYF
step1 50と100の両方を抜き出す
step2 複数あったらstep1に対して100を抜き出す
2023/05/06(土) 18:48:10.77ID:ugbjGoYF
step1 100を抜き出す
step2 無ければ50を抜き出す
2023/05/06(土) 18:58:59.94ID:l5Xh2UOq
powershellで
$json_string = @'
[{"characterID": 1,"Level": 50, "Status": {"idx":1}},
{"characterID": 1,"Level": 100, "Status": {"idx":2}},
{"characterID": 2,"Level": 50, "Status": {"idx":3}},
{"characterID": 3,"Level": 50, "Status": {"idx":4}},
{"characterID": 3,"Level": 100, "Status": {"idx":5}}]
'@
$json = $json_string | ConvertFrom-Json
$json | group characterID | select @{N='ID';E={$_.Name}},@{N='MaxL';E={[int]($_.group | measure -Maximum Level).Maximum}} | %{ $id=$_.ID; $maxl=$_.MaxL; $json | ?{ $id -eq $_.characterID -and $maxl -eq $_.Level}}
出力結果
characterID Level Status
----------- ----- ------
1 100 @{idx=2}
2 50 @{idx=3}
3 100 @{idx=5}
バッチファイルから呼び出す場合
set FILENAME=test.txt
powershell -c "$json=gc %FILENAME% | ConvertFrom-Json; $json | group characterID | select @{N='ID';E={$_.Name}},@{N='MaxL';E={[int]($_.group | measure -Maximum Level).Maximum}} | %%{ $id=$_.ID; $maxl=$_.MaxL; $json | ?{ $id -eq $_.characterID -and $maxl -eq $_.Level}}"
2023/05/06(土) 19:22:29.47ID:l5Xh2UOq
こっちのが短いし判りやすいか
$hash=@{}; $json | %{ if (!$hash.Contains($_.characterID) -or $_.Level -gt $hash[$_.characterID].Level) { $hash[$_.characterID] = $_ }}; $hash.Values
2023/05/06(土) 21:10:41.34ID:UyrtVAAx
機能的にはあるっぽいよ
jq "group_by(.characterID) | map(max_by(.Level))"
※動作未確認
2023/05/06(土) 22:01:27.09ID:gRoxw4m5
>>269
powershell でできるのね
ありがとう
group characterIDでこうなって、
Count Name Group
----- ---- -----
2 1 {@{characterID=1; Level=50; Status=}, @{characterID=1; Level=100; Status=}}
1 2 {@{characterID=2; Level=50; Status=}}
2 3 {@{characterID=3; Level=50; Status=}, @{characterID=3; Level=100; Status=}}
selectの結果こうなってるみたいだけど
ID MaxL
-- ----
1 100
2 50
3 100
select内の『E={[int]($_.group | measure -Maximum Level).Maximum}』でLevelの最大値が取れる構文が理解できてない
特に.Maximumの情報が見つからなくてわかってない
measure結果のMaximumの値を取得してるってこと?
Count :
Average :
Sum :
Maximum :
Minimum :
StandardDeviation :
Property :

その後はまだ全然わかってない
『%{ $id=$_.ID; $maxl=$_.MaxL;$json | ?{ $id -eq $_.characterID -and $maxl -eq $_.Level}}』
select結果のIDとMaxLとConvertFrom-Json結果のcharacterIDとLevelが同じ値のものだけ出力しているんだと思うんだけど構文が全く理解できない
%はForEach?
?はWhere?
って思って調べてるけど記述が一致する説明を見つけられていない
2023/05/06(土) 22:02:29.33ID:gRoxw4m5
唸ってる間に>>270-271が増えてた
ありがとう
調べたり確認してみる
2023/05/07(日) 01:38:48.15ID:OzRuG3KU
> measure結果のMaximumの値を取得してるってこと?
そう。「集計プロパティ」とか「計算プロパティ」とかっていう構文。
learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_calculated_properties?view=powershell-5.1#select-object

> %はForEach?
> ?はWhere?
そう。
ForEach-Object {} = % {} = foreach {} ≠ foreach () {}
Where-Object {} = ? {} = where {} ≠ where () {}

こうも書ける。
powershell -c "(gc 〜.txt -Raw | ConvertFrom-Json) | group characterID | foreach {$_.Group | sort Level | select -Last 1} | ConvertTo-Json"
275デフォルトの名無しさん
垢版 |
2023/05/09(火) 02:15:55.11ID:ZvIGeNCt
変数の値に含まれる全角のダブルクォーテーションを
半角のダブルクォーテーションに置換するにはどうすればいいですか?

setによる置換では期待通りに動作しませんでした

set BatFileTag=”test1“
set "%BatFileTag:“="%"
set "%BatFileTag:”="%"
echo %BatFileTag%

set BatFileTag=”test2“
set %BatFileTag:“="%
set %BatFileTag:”="%
echo %BatFileTag%
276デフォルトの名無しさん
垢版 |
2023/05/09(火) 05:44:06.79ID:uZ4E3DcQ
動くのか確認してないけどBing AIに丸投げしてみたw

バッチファイルで変数の値に含まれる全角のダブルクォーテーションを半角のダブルクォーテーションに置換するには、以下のような方法があります。

- 変数を`%%`で囲んで`set`コマンドで置換する場合、`%%`の前に`~`を付けるとダブルクォーテーションが除去されます¹。例えば、

```bat
set BatFileTag=”test1“
set BatFileTag=%~BatFileTag%
echo %BatFileTag%
```

- 変数を`!`で囲んで遅延展開を有効にすると、全角のダブルクォーテーションも置換できます²。例えば、

```bat
setlocal enabledelayedexpansion
set BatFileTag=”test2“
set BatFileTag=!BatFileTag:“="!
set BatFileTag=!BatFileTag:”="!
echo !BatFileTag!
endlocal
```

- ダブルクォーテーションを含む変数を別のコマンドに渡す場合は、ダブルクォーテーションをエスケープする必要があります³。例えば、

```bat
set BatFileTag=”test3“
echo ^"%BatFileTag%^"
```
277デフォルトの名無しさん
垢版 |
2023/05/09(火) 05:44:21.88ID:uZ4E3DcQ
続き

これらの方法はどれも期待通りに動作しますか?😊

ソース: Bing との会話 2023/5/9
(1) バッチで変数にダブルクオーテーションを格納したい. https://teratail.com/questions/259883.
(2) バッチファイルで変数を複数行にわけて指定したときのダブル .... https://ja.stackoverflow.com/questions/65968/%e3%83%90%e3%83%83%e3%83%81%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%a7%e5%a4%89%e6%95%b0%e3%82%92%e8%a4%87%e6%95%b0%e8%a1%8c%e3%81%ab%e3%82%8f%e3%81%91%e3%81%a6%e6%8c%87%e5%ae%9a%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ae%e3%83%80%e3%83%96%e3%83%ab%e3%82%af%e3%82%a9%e3%83%bc%e3%83%86%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e6%8c%87%e5%ae%9a%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6.
(3) バッチファイルのダブルクォート地獄を回避する方法 - Qiita. https://qiita.com/pochy9n/items/7079f3f13849dcafb969.
278デフォルトの名無しさん
垢版 |
2023/05/09(火) 05:55:08.97ID:uZ4E3DcQ
いいえ。まだ問題があります。
サンプルのどこにも全角のダブルクォーテーションがでてきません

すみません、サンプルの全角のダブルクォーテーションは見えにくいかもしれませんが、実際にはあります。
コピーしてテキストエディタに貼り付けてみてください。
半角のダブルクォーテーションと比べると、全角のダブルクォーテーションは少し太くて長いです。😊

だそうだ
スマホだとわからんわ
279デフォルトの名無しさん
垢版 |
2023/05/09(火) 05:56:33.76ID:uZ4E3DcQ
バッチの中身もオレはちゃんと読んでないんでBingが意図を正しく理解したかも確認してない
280デフォルトの名無しさん
垢版 |
2023/05/09(火) 05:59:48.56ID:uZ4E3DcQ
リンクのコピペに失敗したやつはこれ

https://teratail.com/questions/259883?ssp=1&darkschemeovr=1&setlang=ja-JP&safesearch=moderate

https://qiita.com/pochy9n/items/7079f3f13849dcafb969?ssp=1&darkschemeovr=1&setlang=ja-JP&safesearch=moderate
2023/05/09(火) 08:56:45.57ID:bGbmh2Wb
そんな難問なのか?
set BatFileTag=“test1”
set BatFileTag
set BatFileTag=%BatFileTag:“="%
set BatFileTag=%BatFileTag:”="%
set BatFileTag
2023/05/09(火) 09:15:19.23ID:TEEc9Eeb
>>275
変換結果を変数に格納してないだけじゃん
set BatFileTag=”test1“
set "BatFileTag=%BatFileTag:“="%"
set "BatFileTag=%BatFileTag:”="%"
echo %BatFileTag%

set BatFileTag=”test2“
set BatFileTag=%BatFileTag:“="%
set BatFileTag=%BatFileTag:”="%
echo %BatFileTag%
283デフォルトの名無しさん
垢版 |
2023/05/09(火) 12:45:29.09ID:ZvIGeNCt
>変換結果を変数に格納してないだけじゃん

おっしゃる通りでした、そのコードで期待通り動作しました。
ありがとうございました。
2023/05/09(火) 12:54:13.19ID:0Hn95uhF
ケアレスミスやね
自分もよくある
2023/05/09(火) 15:10:57.87ID:cxHUCWoc
見覚えのある変数名だと思ったらDTV板の人か
286デフォルトの名無しさん
垢版 |
2023/05/10(水) 02:46:49.16ID:7WScgW4R
>>276
変数を`%%`で囲んで`set`コマンドで置換する場合、`%%`の前に`~`を付けるとダブルクォーテーションが除去されます

え、ホント?と思って やってみたら

バッチ パラメーターの置き換えで、パス演算子の次の使用法は無効です:
%~BatFileTag%

と出力されたんですが、できないですよね?

>>285
EDCBの 録画タグ の話でした。。
2023/05/10(水) 03:43:26.68ID:fIRqc6o3
>>266
Ruby なら、

require 'json'

# 改行を削除する。削除しなくても同じ結果
input_json_str = <<'JSON'.delete( "\n" )
[{"ID": 1,"Level": 50, "Status": {"idx":1}},
{"ID": 1,"Level": 100, "Status": {"idx":2}},
{"ID": 2,"Level": 50, "Status": {"idx":3}},
{"ID": 3,"Level": 50, "Status": {"idx":4}},
{"ID": 3,"Level": 100, "Status": {"idx":5}}]
JSON

input_json_obj = JSON.parse( input_json_str )

# ID でグループ化して、最大Level のものを取得する
result = input_json_obj.group_by { |hash| hash[ "ID" ] }.map do |row|
row[ 1 ].max_by { |hash| hash[ "Level" ] }
end

p result

出力
[ {"ID"=>1, "Level"=>100, "Status"=>{"idx"=>2}},
{"ID"=>2, "Level"=>50, "Status"=>{"idx"=>3}},
{"ID"=>3, "Level"=>100, "Status"=>{"idx"=>5}} ]
2023/05/10(水) 07:27:54.84ID:7bNTa4KZ
>>286
エラー表示で 「CALL /?」または「FOR /?」 とあるだろ
それ見ると %~ の使い方がわかるよ
どちらにせよ全角の引用符は消えない

AIがまだポンコツだし、その翻訳もおかしいので
あまり参考にならない
289デフォルトの名無しさん
垢版 |
2023/05/10(水) 17:07:25.20ID:7WScgW4R
>>288
ありがとうございます、ヘルプを参照しました。

%~0 で 周りを囲んだダブルクォーテーションは除去できる、

%~BatFileTag% は 構文エラー、ですね。
2023/05/10(水) 19:56:46.59ID:8YKnH4aX
for文の%%iみたいな変数に入れても%0とかと同じように操作できるよ。
いずれにしても全角ダブルクォーテーションは除去できないけど
291デフォルトの名無しさん
垢版 |
2023/05/10(水) 23:36:37.50ID:7WScgW4R
バッチスクリプトの引数参照(?)の展開を 通常の変数でも使いたい時ありますよね。
forを使えば、わざわざ関数に渡さなくていいってことですよね。覚えておきます。
2023/05/14(日) 01:53:53.57ID:4Al5Gork
ばっちこーい!
2023/05/21(日) 15:26:18.55ID:/zBPnU/J
Sendtoに置いたバッチがある。
ここに複数のファイルを送り、それぞれのパスをプログラムに送りたい。
送った複数のファイル、はどう表現すればいいのでしょうか。
@echo off
for %%F in (*.jpg) do call :sub "%%F"
goto :EOF
:sub
echo "C:\hoge.exe" "%~dpnx1"
goto :EOF

sub以下は様子見コード
2023/05/21(日) 15:31:45.83ID:WLjUQB8s
shift /?
2023/05/21(日) 16:33:43.21ID:uxeKp44S
何したいか若干よくわからないけど、
hoge.exeに引数全部一気に与えたいなら%*と書くと全部与えられる。

そうじゃなくて、
hoge.exe %1
hoge.exe %2
...
とそれぞれを1つずつ与えたいなら
shiftを使ってずらして%1の中身が無くなるまでループさせる。
2023/05/21(日) 17:33:53.16ID:/zBPnU/J
>>295
ありがとう、それがわからなかった。

何がやりたいのかわからないのはたぶん echoとpauseのところですよね(^^;
もともとはググって見つけたフォトショ関係のバッチのコピペで、「複数ファイルできます!」って
書いてあるのに1つ送っても2つ送ってもそのファイルのフォルダ全部処理しちゃうので
様子見のために書き換えて、%%Fがおかしいんじゃ?とたどり着いて詰んだところでした。
2023/05/21(日) 18:06:23.90ID:/vzELmbQ
*.jpg を %* でも良さそう?
2023/05/29(月) 17:17:55.21ID:MDtfdjpW
head abc.txt はエラーになるが
head abc,txt >con とすると実行できた、なぜだろう?

head.exeは2003年のもの
2023/05/30(火) 09:18:57.94ID:8/1/VW9e
環境もエラーメッセージも書いてくれてないしコマンドはtypoっぽいしでさっぱりだが
head.exeの標準入出力処理やらコンソール描画エリアサイズ取得やらに問題があるが
標準出力がリダイレクトされてることでその問題のある処理をスキップできてるとかじゃないの
2023/05/30(火) 09:27:21.04ID:bxkrR6Df
別のhead.exeを持ってくれば?
俺のPCに入ってた
msysの奴(2004/03/16)
Gitの奴(2017/02/14)
ではどっちもhead file名で表示される
2023/05/30(火) 09:59:41.15ID:flkBlmPK
>>300
ありがとう
古すぎたんだ、取り替えよう
302デフォルトの名無しさん
垢版 |
2023/06/08(木) 04:51:39.25ID:qSJ8V+Su
初心者です
一桁のだけ出力されません
set m=1 と出すにはどうしたらいいでしょうか?
よろしくお願いいたします

echo off
set MEMO_OUT=memo.bat

echo set m=333>%MEMO_OUT%
echo set m=22>>%MEMO_OUT%
echo set m=1>>%MEMO_OUT%
echo set メモ>>%MEMO_OUT%
pause

----sub.batの結果-----
set m=333
set m=22
set m=
set メモ
------------------------
303デフォルトの名無しさん
垢版 |
2023/06/08(木) 04:54:13.59ID:qSJ8V+Su
こちらでした

----memo.batの結果-----
set m=333
set m=22
set m=
set メモ
------------------------
2023/06/08(木) 05:51:11.43ID:/rH9ZSQw
set m=^1>>%MEMO_OUT%
set "m=1">>%MEMO_OUT%
305デフォルトの名無しさん
垢版 |
2023/06/08(木) 07:04:40.20ID:qSJ8V+Su
304様♪
echo set m=^1>>%MEMO_OUT% で無事に解決できました!
本当にありがとうございました(*- -)(*_ _)ペコリ
2023/06/08(木) 08:47:23.51ID:vkPB32fx
echo 2>>hoge.txt
みたいな事したくてハマったの思い出した
2023/06/08(木) 10:00:57.29ID:OrtrngoT
自分は前置する事が多い。少数派みたいだけど。
> %MEMO_OUT% echo set m=333
>> %MEMO_OUT% echo set m=22
>> %MEMO_OUT% echo set m=1
>> %MEMO_OUT% echo set メモ
2023/06/08(木) 23:07:14.14ID:5yq6DBkZ
(echo set m=1)>>%MEMO_OUT%
for %%i in ("m=333" "m=22" "m=1" "メモ") do echo set %%~i>>%MEMO_OUT%
2023/06/09(金) 07:12:36.29ID:XYYWFLgO
>>307
(´・∀・`)ヘー これは初見
利用の際の注意点は無いの?
2023/06/09(金) 14:04:54.27ID:du40Kh/C
マイナーってこと以外の注意点はないと思う。
しいて言えばコマンドプロンプト上だと
プロンプトの「C:\>」とくっついて見づらくなるくらい。
2023/06/09(金) 14:10:41.30ID:iiwkTFZp
今までこのスレか関連スレで何度かは出てきてはいるけどね
312デフォルトの名無しさん
垢版 |
2023/06/10(土) 00:40:56.87ID:ZROvKvT1
バッチファイルでIPアドレスの変更をしようとしており、
変更前に現在設定されているアドレスを表示させたいです。
本来であればipconfigから抽出すれば良いのですが、ネットワーク接続されていない状況では表示されません。
netsh interface ipv4 show ipaddress "イーサネット"でIPアドレスが表示されることまでは分かったのですが、
その他とmanualで2種類表示されてしまい、manualのIPアドレスのみ抽出したいです。
また、サブネットマスクも表示させたいですが何か表示できるコマンドをご存じないでしょうか。

皆様のお力をお貸しいただきたいです。
2023/06/10(土) 10:54:45.64ID:DPE/PSj9
>>312
固定IPならレジストリに保存されてるけど、抽出がめんどくさいですね。
HKLM\system\CurrentControlSet\control\network 配下から(イーサネットとか)インターフェース名のGUIDを拾って
HKLM\system\CurrentControlSet\services\Tcpip\Parameters\Interfaces 配下でGUID検索する
2023/06/10(土) 15:04:03.48ID:FuIdwErj
>>309
The redirection can come anywhere on the line, so watch out for those spaces
https://devblogs.microsoft.com/oldnewthing/20170731-00/?p=96715
2023/06/10(土) 16:12:52.95ID:v3IkKBaD
>>314
勉強になりました
2023/06/10(土) 17:59:46.69ID:Yvl44ooC
>>313
GUID検索出てくるともうpowershellでちゃんとやった方がええな
うまくすると数行で書けるし
317デフォルトの名無しさん
垢版 |
2023/06/11(日) 00:20:40.75ID:8nVmCa0A
>>313
312です。ご教示いただきありがとうございます。
レジストリを確認すると確かにGUIDに応じて固定IPが設定されているのを確認できました。
しかし初心者過ぎてどうすれば値を引っ張ってこれる文になるのか分かりません。
もし可能であれば”イーサネット”のIPを引いてこれる文を教えていただけませんでしょうか。
スレ違い、勉強不足で申し訳ありません。よろしくお願いいたします。
2023/06/11(日) 01:18:07.90ID:ficsZH/3
"イーサネット"もOSで別のネットワークアダプタとして認識されると末尾に番号が付くから決め打ちは危険かも
2023/06/12(月) 07:36:14.80ID:+mHefy5G
PowerShell で、

$guid = "{GUID-1 〜 XXX}"

$a = "HKLM\SYSTEM\CurrentControlSet\Control\Network\{GUID-2 〜 YYY}\"+ $guid +"\Connection";
$b = "HKLM\system\CurrentControlSet\services\Tcpip\Parameters\Interfaces\" + $guid

reg query $a /v "Name";
reg query $b /v "DhcpSubnetMask"

出力
Name REG_SZ イーサネット
DhcpSubnetMask REG_SZ 255.255.255.0
2023/06/13(火) 10:09:20.96ID:RNzu8ICZ
ググっても書式バラバラだわ実行したらエラーメッセージ出るわ、もうわからん助けて・・・。

やりたいこと:ファイル名ごとに渡すプログラムを変えたい。
わからないこと:
if 変数==内容(分岐処理)でいいのか、if 変数==内容 分岐処理なのかサイトによってバラバラだし
どっちにしてもelseなんて定義されてねーよばーかって出てしまう。
条件分岐の書式を教えてください。
参考にしたサイトの1つ:www.javadrive.jp/command/bat/index8.html
希望する処理内容:
処理用フォルダを丸ごとBatファイルにSendto
ファイル名にcoが含まれるJPG、Webp、PNGは、cov.exeに投げる
ファイル名にautoが含まれるJPG、Webp、PNGは、auro.exeに投げる
ファイル名にrecが含まれるJPG、Webp、PNGは、rec.exeに投げる
今書いてる内容:これでelse?は?と言われる
https://imepic.jp/20230613/364730
2023/06/13(火) 10:11:36.00ID:RNzu8ICZ
まちがえた、こっち
https://imepic.jp/20230613/366750
2023/06/13(火) 10:14:16.97ID:sYfPkaoR
C++でランチャー作るほうが楽そう
2023/06/13(火) 10:19:37.96ID:v41Gwse2
>>320
画像が見えないけど
多分、if文が終了しててelseが単独で出てくるのでエラーになってるんだと思う
下のように書けば問題ないはず
if 変数==文字列 (
処理群
) else (
処理群
)
if 変数==文字列 処理 else 処理
if 変数==文字列 処理 else (
処理群
)

こういうのはエラーになる
if 変数==文字列 (処理)
else (命令)
2023/06/13(火) 10:23:02.74ID:xwoVSiEY
見えんけどbatの分岐はgoto使え
325320
垢版 |
2023/06/13(火) 10:32:32.52ID:RNzu8ICZ
ごめんー(::)
https://imepic.jp/20230613/377460

GOTOまぜちゃってるせいかな・・・
(これも実は初めて知った処理だったりする・・・
2023/06/13(火) 10:36:13.21ID:RNzu8ICZ
書式いろいろあるんですね・・・
Perl風にelsifって書いてみたりしました(苦笑)
>if 変数==文字列 処理 else 処理
>if 変数==文字列 処理 else (
>処理群
>)
処理が1行で終わる場合は上、複数行にわたるなら下という理解でいいですか?
2023/06/13(火) 10:52:25.04ID:xwoVSiEY
素人に()を使いこなすのは無理
if で * なんか使えるわけね~だろ
もっと高級な言語で作ってから出直せ
2023/06/13(火) 11:10:48.21ID:RNzu8ICZ
>>327
そうなんですねorz
その辺ググっても取っ散らかってて情報が・・・なんかもう・・・ごめん
Batファイルはファイルの移動・コピー・フォルダ一括作成・formatくらいしか使ったことなくてねorz

エクスプローラでファイル名検索→複数のBatファイルとかやってるのすら面倒になったところなんだが
堪能に使えるプログラム言語はないのでもうしょうがないかなorz
2023/06/13(火) 11:28:39.90ID:v41Gwse2
>>328
こんな感じでいいのでは?
:loop
set fname=%~1
shift
if not defined fname goto :eof
if "%fname:~0,2%" equ "ac" "c:\cov.exe" ~
if "%fname:~0,2%" equ "au" "c:\auro.exe" ~
timeout 1
goto :loop

又は
if "%fname:ac=%" neq "%fname%" "c:\cov.exe" ~
2023/06/13(火) 13:37:35.35ID:lkLOH6hL
素直にif文書くとこんなん。※インデントは全角スペース
:loop_begin
if "%~1" == "" goto loop_end
echo,%~nx1| findstr /ri /c:"co" >nul 2>nul
if not errorlevel 1 (
  cov.exe "%~dpnx1"
) else (
  echo,%~nx1| findstr /ri /c:"auto" >nul 2>nul
  if not errorlevel 1 (
    auto.exe "%~dpnx1"
  ) else (
    echo,%~nx1| findstr /ri /c:"rec" >nul 2>nul
    if not errorlevel 1 (
      rec.exe "%~dpnx1"
    )
  )
)
shift & goto loop_begin
:loop_end

Perl知ってるなら大丈夫だと思うけど
「を含む」じゃなくて「で始まる」なら>>329か「^」を付け「/c:"^co"」とかに。
2023/06/13(火) 13:47:29.71ID:lkLOH6hL
「&&」と「||」使うとこう。※記述量は減るがマイナー。
echo,%~nx1| findstr /ri /c:"co" >nul 2>nul && (
  cov.exe "%~dpnx1"
) || (
  echo,%~nx1| findstr /ri /c:"auto" >nul 2>nul && (
    auto.exe "%~dpnx1"
  ) || (
    echo,%~nx1| findstr /ri /c:"rec" >nul 2>nul && (
      rec.exe "%~dpnx1"
    )
  )
)

フラグ使うとこう。
set result=
for %%A in (rec auto co) do (
  echo,%~nx1| findstr /ri /c:"%%A" >nul 2>nul && set result=%%A
)
if "!result!" == "co" cov.exe "%%~dpnx1"
if "!result!" == "auto" auto.exe "%%~dpnx1"
if "!result!" == "rec" rec.exe "%%~dpnx1"

複数マッチする事がない、または複数マッチして複数実行してよいなら
バッチにディレクトリパス渡してこう。(gotoのループ無し)
for %%A in ("%~1\*co*") do (cov.exe "%%~A")
for %%A in ("%~1\*auto*") do (auto.exe "%%~A")
for %%A in ("%~1\*rec*") do (rec.exe "%%~A")
2023/06/13(火) 16:32:40.78ID:3egukpPD
文字列に特定の文字列が含まれるかを見たいときに私なら

if not "%aaa%"=="%aaa:foo=%" (処理)

と、元の文字列の入った変数から特定の文字列を抜き取ったときに
イコールにならないことで含まれてることを判断してるんだけど
これってマイナーなのかな?
2023/06/13(火) 18:38:43.90ID:lkLOH6hL
>>329もその方法だし、マイナーって事はないと思う。

if文本体だとANDとかORを表現し辛くて自分はfindstrにしがち。
今回だと拡張子の条件(jpg, jpeg, webp, png?)のいずれかにマッチしたら目的の処理、
またはいずれにもマッチしなかったらgoto next_loop、みたいな場合に楽。
2023/06/13(火) 19:02:49.89ID:/Xa1+9fb
>>331
「&&」と「||」ってそういう書き方出来るんだ知らなかった
335328
垢版 |
2023/06/14(水) 00:17:35.54ID:l4KAyHVD
>>329-333

いろんな書き方があるんですね・・・ありがとうございます。
(1)とか(2)があるとスルーされるので、また調べます。
感謝!
2023/06/14(水) 01:04:20.11ID:8vZ7BVQu
PowerShell を使いな

漏れは、Ruby だけど
2023/06/15(木) 07:11:35.58ID:VQiSmQhF
terapadなつい
テキストコピペでいいのになぜ画像
338デフォルトの名無しさん
垢版 |
2023/06/29(木) 22:56:13.24ID:2AoYQptZ
あるフォルダの中のファイルにたいして定期的にプログラムを実施したいのですが、前回実行したあと追加されたファイルに実施というロジックだとどのように実装するのがリーズナブルでしょうか?
2023/06/29(木) 23:31:28.60ID:xErdDB4N
ぜんぜんわからん
まず質問をリーズナブルに書け
2023/06/29(木) 23:50:20.15ID:v2Nfxu0l
>>338
プログラムを実行したファイルを削除する。
341デフォルトの名無しさん
垢版 |
2023/06/29(木) 23:59:37.76ID:2AoYQptZ
>>340
実行エラーした場合の対応が複雑になりそうで
342デフォルトの名無しさん
垢版 |
2023/06/29(木) 23:59:54.09ID:8Orz0VrB
>>338
月のはじめに自分で削除
343デフォルトの名無しさん
垢版 |
2023/06/30(金) 00:04:29.96ID:0Iq5JqfB
>>342
1時間間隔なので
2023/06/30(金) 00:26:27.50ID:5iDE7+iq
>>341
なんで?
2023/06/30(金) 00:35:49.00ID:ow+yGKXV
ファイルの総数によってもコードが変わってくるからいくつくらいのファイルを触りたいのか教えてくれ
2023/06/30(金) 07:06:37.99ID:y1MImIiE
誰かが勝手にタイムスタンプをいじったりしないって前提だけど
前回の最新タイムスタンプか、そのファイル名自体をどこかに保存しておいて
それより新しいファイルだったら処理
2023/06/30(金) 09:08:51.37ID:pv7EwXK7
「追加されたファイル」ってなあに?
余所にあった古いファイルをコピーしたら
更新日時は古いままだけど
2023/06/30(金) 10:28:33.45ID:u+TfOZmJ
実行済のファイルは別フォルダに移動が楽だろ
349デフォルトの名無しさん
垢版 |
2023/06/30(金) 12:14:39.24ID:0Iq5JqfB
>>348
ですよね。
このフォルダのファイルからデータ取ってる人もいて
調整が必要で
2023/06/30(金) 14:03:26.68ID:pv7EwXK7
処理後にarchive属性をオフにしたら?
2023/06/30(金) 15:56:39.55ID:YeFfrwhl
現れたなら聞かれた質問にくらい答えろよ
352デフォルトの名無しさん
垢版 |
2023/07/01(土) 00:26:35.37ID:xI+Y6sFQ
>>349
後だし情報
2023/07/01(土) 05:09:14.98ID:nMEzWNF9
タイムスタンプを記録しておく

初回は1970年以後で、年月日時分秒_1 以前のファイルを処理する。
次回は年月日時分秒_1 以後で、年月日時分秒_2 以前のファイルを処理する
2023/07/01(土) 09:52:48.59ID:UDkRE5jB
追加ファイルの性質でアトリブートもタイムスタンプも使えるかどうかわからん
質問してる人がいるが回答が無いので
2023/07/04(火) 17:06:41.56ID:LIey+Zab
作ってみました。行数ギリギリです。
2023/07/04(火) 17:08:44.07ID:LIey+Zab
@echo off
setlocal enabledelayedexpansion
set update=update.txt
set temp=temp.txt
set ignore=%update% %temp% %~nx0
set /A num=last=0
if exist %update% (
sort /R %update% > %temp%
set /P line=< %temp%
echo 前回更新日時 !line!
if "!line:~,16!"=="%date% %time:~0,5%" (
echo 更新が早すぎます しばらくお待ちください
:loop
if "!line:~11,5!"=="%time:~,5%" goto loop
)
set last=!line:~0,4!!line:~5,2!!line:~8,2!!line:~11,2!.!line:~14,2!
) else echo 初回更新です
dir /A-D /OD | findstr /R "^20[0-9][0-9]" | findstr /V "%ignore%" > %temp%
for /F "delims=" %%f in (%temp%) do (
set line=%%f
set ftime=!line:~0,4!!line:~5,2!!line:~8,2!!line:~12,2!.!line:~15,2!
if !last! lss !ftime! (
set fname=!line:~36!
echo [処理中] !fname! (処理をこの後に入れる)
set /A num+=1
))
if !num! equ 0 (
echo 更新ファイルはありません
) else (
echo %date% %time:~0,5% >> %update%
echo !num! のファイルを更新し %update% に更新日時を追記しました
)
2023/07/04(火) 17:38:18.81ID:LIey+Zab
ファイルのタイムスタンプが前回更新日時より後かどうかのみ見ています。
もしも、分まで同じであれば更新しません。
前回更新日時と現在日時が分まで同じなら、1分進むまで待ちます。
なんとなく、同じ日時が更新記録に残るというのが気持ち悪いからです。
2023/07/04(火) 20:16:07.96ID:dJR+6uCy
お疲れ
2023/07/04(火) 21:21:28.53ID:+24T6cXg
ファイルの取り扱いにもよるけど
タイムスタンプでの管理はあまりよくないと思う
俺は結構ちょこちょこいじっちゃうのでタイムスタンプでは新旧の区別がつかなくなることが多い
2023/07/04(火) 21:30:04.96ID:+24T6cXg
あとtmp,temp環境変数の書き換え
とくにフォルダとして使ってるものをファイル名にするのは危険
cmdの世界ではtmpがダメだがtempも使わないほうが良い
2023/07/04(火) 21:31:31.54ID:9emtMuJF
リーズナブルな実装とは何だったのか
2023/07/04(火) 23:34:33.25ID:LIey+Zab
temp の件は setlocal を使っているとはいえ、確かにタブーみたいなので変更しました。
タイムスタンプの件は、後でいじったファイルに対して再度作業を実行するかどうかの問題ですね。
そこら辺は、質問者が条件を書いてないので不明ですが、私はいじったファイルについても再度実行
するんじゃないかなと思ったので(それに簡単なので)そうしました。
1度実行したファイルには2度と実行しないのなら、終わったファイルはリネーム(例えば頭に _ を付加)
するとかして除外するか、終わったファイルリストを書き出してそれをチェックするとかですかね。
他のフォルダへ移動するのが最もいいと思うけど、なんだか都合が悪いみたいなので。
2023/07/04(火) 23:36:37.60ID:LIey+Zab
@echo off
setlocal enabledelayedexpansion
set update=update.txt
set ichiji=temp.txt
set ignore=%update% %ichiji% %~nx0
set /A num=last=0
if exist %update% (
sort /R %update% > %ichiji%
set /P line=< %ichiji%
echo 前回更新日時 !line!
set last=!line:~,4!!line:~5,2!!line:~8,2!!line:~11,2!.!line:~14,2!
if "!line:~,16!"=="!date! !time:~,5!" (
set /A sec=160-1!time:~6,2!
echo 更新が早すぎます !sec! 秒お待ちください
:loop
if "!line:~11,5!"=="!time:~,5!" goto loop
)
) else echo 初回更新です
dir /A-D /OD | findstr /R "^20[0-9][0-9]" | findstr /V "%ignore%" > %ichiji%
for /F "delims=" %%f in (%ichiji%) do (
set line=%%f
set fname=!line:~36!
set ftime=!line:~,4!!line:~5,2!!line:~8,2!!line:~12,2!.!line:~15,2!
if !last! lss !ftime! (
echo [処理中] !fname! (処理をこの後に入れる)
set /A num+=1
)
)
if !num! neq 0 (
echo %date% %time:~0,5% >> %update%
echo !num! のファイルを更新し %update% に更新日時を追記しました
) else echo 更新ファイルはありません
2023/07/05(水) 06:45:40.73ID:Ig34wRo0
time /t だと 06:00 なのに echo %time% だと 6:00:00.00 になる。
なんで、%time% だと頭の 0 がスペースになるんだよ。
おかげで余計なバグができちゃったじゃないか。
というわけで、バグ取りました。って誰も見てないか・・・。
2023/07/05(水) 06:55:43.15ID:Ig34wRo0
@echo off
setlocal enabledelayedexpansion
set dispskip=0
set update=update.txt
set ichiji=temp.txt
set ignore=%update% %ichiji% %~nx0
set /A num=last=0
if exist %update% (
sort /R %update% > %ichiji%
set /P line=< %ichiji%
echo 前回更新日時 !line!
set /A sec=160-1!time:~6,2!
if "!line:~,16!"=="!date! !time:~,5!" if sec gtr 2 echo 更新が早すぎます !sec! 秒お待ちください
:loop
if "!line:~11,5!"=="!time:~,5!" goto loop
set last=!line:~,4!!line:~5,2!!line:~8,2!.!line:~11,2!!line:~14,2!
if "!last:~9,1!"==" " set last=!last:~,9!0!last:~10!
) else echo 初回更新です
dir /A-D /OD | findstr /R "^20[0-9][0-9]" | findstr /V "%ignore%" > %ichiji%
for /F "delims=" %%f in (%ichiji%) do (
set line=%%f
set fname=!line:~36!
set ftime=!line:~,4!!line:~5,2!!line:~8,2!.!line:~12,2!!line:~15,2!
if !last! lss !ftime! (
echo [処理中] !fname! (処理をこの後に入れる)
set /A num+=1
) else if %dispskip% neq 0 echo スキップ !fname!
)
if !num! neq 0 (
echo !date! !time:~,5! >> %update%
echo !num! のファイルを更新し %update% に更新日時を追記しました
) else echo 更新ファイルはありません
2023/07/05(水) 12:49:58.80ID:Ig34wRo0
よく見ると ! ではさむのを忘れとるじゃないか。

if "!line:~,16!"=="!date! !time:~,5!" if sec gtr 2 echo 更新が早すぎます !sec! 秒お待ちください

これは正しくはこうですね。(2秒以下の場合でも表示されていただけ)

if "!line:~,16!"=="!date! !time:~,5!" if !sec! gtr 2 echo 更新が早すぎます !sec! 秒お待ちください
2023/07/05(水) 12:59:13.87ID:jlkBTxWV
powershellで書いたら1~数行だね
ふぅ
2023/07/05(水) 13:43:04.59ID:hRO8F47X
数行なら書いて差し上げたら
もう見ていないかも知れないけど
2023/07/05(水) 18:25:05.99ID:4rZ7+jZr
>>367
スレ違いとかいわないから後学のために記載して
2023/07/05(水) 23:14:29.51ID:TBtlNfRd
バッチファイル不具合あるあるの日付またぎの対処が見当たらないな
やり直し
2023/07/06(木) 00:41:50.43ID:X7484ET/
あぁ、もしかして、あれか、最後に update.txt に日付と時刻を追記する部分で、日付を取得した後、
時刻を取得する際に翌日になっているというまさに奇跡のタイミングのことを言ってるのか?
そんな時間にバッチを動かすとも思えんし、実際にその状態を発生させようと思っても起こらないだろう。
そのような超レアケースに無駄に頭と行を使うのはアホらしいが、まぁ、やってやるよ。

set date0=!date!
set time0=!time!
if not !date0!==!date! if !time0:,2! equ 0 set date0=!date!
echo !date0! !time0:~,5! >> %update%

はい、アップデート完了!
2023/07/06(木) 00:44:25.38ID:X7484ET/
ごめん、~ が抜けてた。

set date0=!date!
set time0=!time!
if not !date0!==!date! if !time0:~,2! equ 0 set date0=!date!
echo !date0! !time0:~,5! >> %update%
2023/07/06(木) 00:50:56.85ID:X7484ET/
まぁ、実際はその if 以下へたどりつくことは決してないだろうから、間違えていても同じかもな。
2023/07/06(木) 00:56:57.29ID:X7484ET/
よく考えたらこれでも同じか。

set date0=!date!
set time0=!time!
if !time0:~,2! equ 0 set date0=!date!
echo !date0! !time0:~,5! >> %update%
2023/07/06(木) 07:56:07.79ID:kQU1BcI/
考慮不要なレアケースではない。
例えば自ホストの時計がジョブスケジューラサーバ等の時計より少し遅れていると発生する。
「サンプルコードだから入れてない」なら分かる。
2023/07/06(木) 10:18:12.37ID:X7484ET/
そんなのバッチの中で対応するより、自動バッチ実行する時刻を 0時にしなければいい。

そもそも、同じシステム上の同じバッチの同じ行で、date を取得した後 time を取得したら
日付が変わっていましたなんて、レア中のレア。
チャンスは1日に1回しかないし、発生させようと思ってやってみても絶対に無理だろ。
逆に、万一発生したらお祝いのメッセージを表示させたいぐらいだわ。

set date0=!date!
set time0=!time!
if not !date0!==!date! if !time0:~,2! equ 0 (
set date0=!date!
echo すばらしい!奇跡的なタイミング!おめでとう!
echo 0123456789a | choice /C a > nul
)
echo !date0! !time0:~,5! >> %update%
2023/07/06(木) 11:06:32.28ID:X7484ET/
対策なしの 1行だった時よりも、対策して行を分けたことで、現象の発生率は上がるだろう。
それでも、実際に現象を発生させて動作検証をするのは絶対に無理だな。
まぁ、これでいいんじゃね?ただ、さすがに 10回ビープ音を鳴らすのはやりすぎたかな?
2023/07/06(木) 17:32:04.66ID:T1YQhEvz
簡単バッチ。初回は処理しない。
2回目からendより新しいファイルを処理。

@echo off & chcp 65001 & set "a=begin" & set "b=end" & set "c="
if not exist "%b%" copy nul "%b%" & timeout /t 1
copy nul "%a%"
for /f "delims="eol^= %%i in ('dir /a-d-s-h /b /o-d') do (
if "%%i"=="%b%" (goto x) else if "%%i"=="%a%" (set c=1) else (
if defined c hoge.exe "%%i"))
:x
del "%b%" & ren "%a%" "%b%" & pause
2023/07/06(木) 18:41:00.40ID:X7484ET/
それだと初回実行時より前のタイムスタンプのファイルは決して処理されないじゃん。
てか、コードページを変えたら戻しとけ。
2023/07/06(木) 18:47:20.96ID:X7484ET/
いや、それより、一番の問題はファイルを処理したらそのファイルのタイムスタンプ変わるから、
毎回同じファイルを処理してしまうんじゃね?これはひどい。
2023/07/06(木) 19:55:42.19ID:T1YQhEvz
すまん。書き直した。

@echo off & chcp 65001 & set "b=end"
for /f "delims="eol^= %%i in ('dir /a-d-s-h /b /o-d') do (
if "%%i"=="%b%" (goto x) else echo hoge.exe "%%i")
:x
copy nul "%b%" & chcp 932

これ、バッチ処理中に追加ファイルあると不味いな
2023/07/06(木) 22:30:39.49ID:X7484ET/
早速の修正お疲れ様。
今回のは処理後即画面消える以外問題ないようだね。

で、勝手にいじらせてもらってリスト方式に変えてみた。
hoge.exe で処理したファイルの名前を list.txt に追記。
再度処理したければ、list.txt のそのファイルの行をエディタで削除。
これだと、バッチ処理中の追加ファイル問題も起こらない。

@echo off
chcp 65001
rem skip したファイルの名前を表示するフラグ
set f=1
set t=list.txt
if not exist %t% copy nul %t% > nul
for /f "delims="eol^= %%i in ('dir /a-d-s-h /b') do (
find "/%%i/" %t% > nul
if errorlevel 1 (
echo hoge.exe "%%i"
rem このバッチ中で処理する場合はここに入れる
echo /%%i/>> %t%
) else if %f% neq 0 echo skip "%%i"
)
pause
chcp 932

ところで、コードページを変えている理由は何?
hoge.exe に渡すファイル名関係か何か?
2023/07/06(木) 22:32:33.96ID:gWNyo9yQ
最近はファイル名にユニコード文字を使うことも多いからなあ
2023/07/06(木) 22:54:45.39ID:T1YQhEvz
どうもありがとう。
コードページはコマンド出力に影響する。
932だとユニコード特有な文字は変数に正しく入らない。
for %%i in (*) だと問題ないけど日時ソートされないし。
コードページが変わると画面が一旦消えるのが厄介。
65001だとバッチファイルの文字コードに注意。
2023/07/06(木) 23:08:10.36ID:X7484ET/
高度なコードの解説ありがとう。
ファイル名には普通の半角文字しか使わないので知らなかった。
そういう場合については変えなくていいということかな?
2023/07/06(木) 23:12:39.29ID:T1YQhEvz
コマンドのリダイレクトで化けない文字なら問題ないはず
2023/07/07(金) 04:34:24.45ID:KFogdpBJ
おやじギャグ
2023/07/07(金) 07:40:59.89ID:T33gGQqj
こうやって、自分自身と list.txt を除外しておけばよかったわ。
他にも除外したいファイルがあったらファイル名の前後に / つけて list.txt に書き足せばいい。
一応、こんな風に / で区切れば、1行に複数のファイル名が書けるよ。
あ、もちろん、ワイルドカードは使用できませんので念のため。

if not exist %t% echo /%~nx0/%t%/> %t%
2023/07/07(金) 10:20:29.14ID:tybFBPle
誰も使わんから大丈夫だよ
2023/07/07(金) 10:41:17.49ID:EBn5GntH
特殊だよね
普通なら処理済のサブフォルダでも作って移動させとくよ
あと個人的に使うならattributeの属性でやるかもしれん
2023/07/07(金) 11:39:17.55ID:xjbAveHj
曖昧な質問にここまで労力をかけるのか
2023/07/07(金) 13:22:29.08ID:vTnbMP+F
アホだなーって思いながら見てたが
ファイルスタンプや日付関係はpowershellでやったら一瞬で終わるから検討しなよ
2023/07/07(金) 14:01:04.13ID:tybFBPle
バッチファイルが糞すぎるだけでその程度なら別にvbs(wsh)でもいいけどな
2023/07/07(金) 14:50:24.72ID:T33gGQqj
このスレへ書かれたわけだから、敢えてバッチファイル縛りのマゾプレイしてるけど、
何使ってもいいのなら、一番長く使ってきて慣れている C で書くよ。高速だし。
2023/07/07(金) 18:37:24.24ID:GxNDHmP5
俺はC++
2023/07/07(金) 18:42:51.15ID:KFogdpBJ
>>394
確かにマゾにピッタリだよ、バッチ
2023/07/07(金) 20:54:22.80ID:62nZLiJF
昔はまともなコンパイラなんて何万円もしたからな
バッチなんて使っているのはその世代だろ
2023/07/08(土) 00:17:19.33ID:7l9oEDc+
オプションや設定で1回のバッチでは指定ソフトが1回しか起動しないようにってできないでしょうか
2023/07/08(土) 01:48:11.75ID:8phSh46w
>>386
dir > con で ? 文字になるファイル名だろ
2023/07/08(土) 09:46:44.59ID:l5c+v8IK
バッチ書いてて一番むかつくのは、0 で始まる数字(0x 以外)は 8 進数扱いになる点。
だから、%time% から分や秒を取り出して計算に使おうとして、例えば
set /a s=60-%time:~6,2%
と書いたら、08秒と 09秒の時に「無効な数字です」と怒られるので
set /a s=160-1%time:~6,2%
とか書くことになる。8進数は滅多に使わないから、それより 2 進数に対応しろと言いたい。
%time% で時間の 10 の位が 0 の時スペースになるのは、8進数になるのを防ぐためだろう。
2023/07/08(土) 10:18:28.62ID:iRLmrC8y
いまさら何をいってもcmdは変わらん。署名が変わるだけ
ターミナルはwtが追加されたけど
2023/07/08(土) 19:09:21.78ID:wtJKE3gc
>>397
Zortech C++ 1.0持ってたけど
バッチはバッチ
使い分けてたよ
2023/07/08(土) 19:10:18.13ID:wtJKE3gc
mifes起動するのにいちいちspawnとか
そういうマゾプレーはしてなかった
2023/07/09(日) 07:40:38.97ID:oyETgJfu
自分が使っていたのは VZ Editor だったな。
バイトやってたところのシステムは CP/M (80) で WordMaster を使ってた。
2023/07/23(日) 13:16:59.81ID:zPqD9Olc
実現したいこと:Windowsのデバイスマネージャでデバイスの有効無効を判定した上で切り替えたい
考えたこと :devcon status [ID] で条件判定して有効無効切り替えられるのでは?
内容

devcon status [ID]
でデバイスの状態は表示される

例 有効の場合
>devcon status "USB\VID_9886&PID_0038&REV_0000&MI_00"
USB\VID_9886&PID_0038&MI_00\B&9AE5250&0&0000
Name: Astro MixAmp Pro Voice
Driver is running.
1 matching device(s) found.

例 無効の場合
devcon status "MLX4\ConnectX-3_Eth"
MLX4\CONNECTX-3_ETH\9&1A1922BF&0&01
Name: Mellanox ConnectX-3 Ethernet Adapter #2
Device is disabled.
1 matching device(s) found.


なので
Driver is running. なら devcon disable [ID] でデバイスを無効に
Device is disabled. なら devcon Enable [ID] でデバイスを有効 に切り替えたいと考えています

使い方が間違ってなければ %ERRORLEVEL% での戻り値はなさそうなので
実行した際に表示される画面等から 文字列検索かけて条件分岐みたいなことをできればいいなと思っています

別にバッチにこだわってることは無いのでもしほかに手っ取り早く実現できる方法等あったらアドバイスいただけると嬉しいです
2023/07/23(日) 21:05:51.47ID:JLqJNtpp
set id="~"
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%i IN ('devcon status !id!') DO (
set a=%%i
if "!a!" NEQ "!a:Driver is running=!" devcon disable !id! & goto :eof
if "!a!" NEQ "!a:Device is disabled=!" devcon enable !id! & goto :eof
)

管理者権限で実行
複数の matching の場合はどうなるか知らない
2023/07/24(月) 14:53:52.19ID:NSMDQXn9
もぉえぇよデブコン
2023/07/24(月) 18:12:41.71ID:BcRhQVe4
最初にデバイスマネージャを開くなら
そこで指定した方が早いんじゃね
なぜバッチ?
2023/07/24(月) 23:51:25.15ID:wZUfbAlM
WMI(CIM)が楽かな。
powershellでもVBScriptでもwmicでもお好きなもので。

PowerShell版:
$enabledCd = 0
$disabledCd = 22
$methodName = $null
$device = Get-CimInstance -Query 'select * from Win32_PnpEntity where Name = "Fax"'
if ($device.Status -eq 'OK' -and $device.ConfigManagerErrorCode -eq $enabledCd) {
  $methodName = 'Disable'
}
elseif ($device.Status -eq 'Error' -and $device.ConfigManagerErrorCode -eq $disabledCd) {
  $methodName = 'Enable'
}
if (! [string]::IsNullOrEmpty($methodName)) {
  $result = Invoke-CimMethod -InputObject $device -MethodName $methodName
  $result
}

ワンライナー版:
powershell -c "$d=gcim -cl Win32_PnpEntity -f 'Name=''Fax'''; $s,$c=$d.Status,$d.ConfigManagerErrorCode; if($n=if($s -eq 'OK' -and $c -eq 0){'Disable'}elseif($s -eq 'Error' -and $c -eq 22){'Enable'}){$d|icim -m $n}"
2023/07/24(月) 23:59:01.49ID:wZUfbAlM
「楽」って書いたけど別に楽ではないな。
devcon入ってない場合に入れなくて済むくらいか。
2023/07/25(火) 07:07:55.47ID:xE3c+p8T
>>410
pnputilもあるでよー
2023/07/25(火) 14:01:51.30ID:ES/uzWz0
vbsで動くっぽいし、それが一番軽いかな
バッチ 行解釈が遅い
PS 起動が遅い
2023/07/26(水) 01:41:27.08ID:HHyO4+3x
>>406 >>409
ありがとうございます
414デフォルトの名無しさん
垢版 |
2023/08/24(木) 17:51:23.10ID:C9P8zR3M
copyってコピー元ファイルがない時は標準出力にコピー先のフォルダがない場合は標準エラー出力にエラーメッセージ出るのか?
何のため…
2023/08/24(木) 21:56:13.39ID:W+JHQ2GG
ここはコマンド七不思議を議論するスレじゃねえんだよハゲ
416デフォルトの名無しさん
垢版 |
2023/08/25(金) 00:42:24.04ID:6hVx8Trp
シェルスレでは七不思議も話題にできるのに
2023/08/25(金) 01:13:18.62ID:icN/kxtu
ハゲじゃない人は何を議論したいのか教えて下さい
418デフォルトの名無しさん
垢版 |
2023/08/25(金) 12:27:27.06ID:8hrP4A7s
場合分け出来るので、使う人にとって便利だから
419デフォルトの名無しさん
垢版 |
2023/08/25(金) 12:27:29.53ID:8hrP4A7s
場合分け出来るので、使う人にとって便利だから
420デフォルトの名無しさん
垢版 |
2023/08/25(金) 13:01:08.75ID:6hVx8Trp
エラーはエラーなんだから標準エラー出力に出てくれないと困る
2023/08/25(金) 13:11:39.69ID:HBsggyAu
バッチに書く場合は余計な出力はnulへリダイレクトするし
エラー検出するならerrorlevelしか見ない
終わり
2023/08/25(金) 14:15:11.86ID:WAOpDjEy
でもエラーでもERRORLEVELが0以外にならないコマンドもあるんだよね。
例えば掴まれてるファイルをdelコマンドで削除しようとした場合とか。
2023/08/25(金) 15:30:23.51ID:vih/yj+S
予期していないエラーはトラップ出来ない
当たり前の事
424デフォルトの名無しさん
垢版 |
2023/08/26(土) 14:15:52.99ID:EQIr/PqP
del してエラー出てなくて
でもファイルはまだあるみたいな
どうやったら消せるねん
2023/08/31(木) 19:15:12.69ID:1WyUQh63
バッチではなくコマンドプロンプトの話なんだが、バッチを書くまでもないやってとき、
set a=
for %f in ( *.txt ) do (set a=%~nxf) & call move "%f" "%a:HOGE=HAGE%"
みたいにやるんだけど、
これやるとウィンドウタイトルが実行したcall文になってしまう
都度title cmdで戻してるけど、なんか気持ち悪いので、設定で最初からならないようにってできないだろうか
426デフォルトの名無しさん
垢版 |
2023/09/01(金) 07:05:11.31ID:HKoCoDlN
ヘルプを見ると分かるように call はバッチを呼び出すコマンドなんだよ
バッチ以外のコマンドを呼び出すとタイトルにゴミが残るんだよ
2023/09/01(金) 11:48:43.40ID:v7f2MrOL
set a=
for %f in ( *HOGE*.txt ) do (set a=%~nxf) & cmd/c move "%f" "%a:HOGE=HAGE%"
2023/09/01(金) 12:03:20.71ID:haHsElfO
俺からしたら書くまでもないやを超えてる長さに見える
429デフォルトの名無しさん
垢版 |
2023/09/01(金) 14:00:21.38ID:HKoCoDlN
call を cmd /c にするといいのか
430デフォルトの名無しさん
垢版 |
2023/09/01(金) 14:16:49.32ID:8Q6o7DlX
cmd /k
431デフォルトの名無しさん
垢版 |
2023/09/19(火) 16:40:50.05ID:w0AoFkn5
質問スレからこのスレを誘導してもらいました
誰かわかる方いたらお願いします

https://i.imgur.com/rKbomtc.png
画像の様な物を作りたいです
フォルダAとその下のa.b.cまではは既に作成されています
後から1.2.3の空フォルダ階層をまとめて追加したい状態です
コマンドプロンプトやバッチ?で簡単に作ることはできませんか?
2023/09/19(火) 17:51:31.66ID:nN7HbMfx
単に1.2.3のテンプレフォルダ&ファイルを用意して
対象フォルダにコピーするだけに聞こえるけど
コピー先となるフォルダが大量にあるから手動コピーが面倒とかそういう話?
433デフォルトの名無しさん
垢版 |
2023/09/19(火) 18:38:51.86ID:/gzRoJ4w
>>432
はい
言われた通りに手動でやっていたんですが
仰る通りabc…の量が実際にはzで終わらない数百レベルなのです
2023/09/19(火) 20:18:27.57ID:nN7HbMfx
for使ってコピー先を読み込みつつxcopyでどう。
参考:https://www.javadrive.jp/command/bat/index9.html

例えばAの下に下記バッチ置いて実行

for /d %%a in (*) do (
xcopy コピー元 %%a
)

関係ないフォルダとか色々混ざってるなら
文字列でフィルタするなり事前にテキストで
リスト作るなりした方がいいだろうけど。
2023/09/19(火) 20:19:07.60ID:nN7HbMfx
for使ってコピー先を読み込みつつxcopyでどう。
参考:https://www.javadrive.jp/command/bat/index9.html

例えばAの下に下記バッチ置いて実行
リスト作るなりした方がいいだろうけど。
for /d %%a in (*) do (
xcopy コピー元 %%a
)

関係ないフォルダとか色々混ざってるなら
文字列でフィルタするなり事前にテキストでリスト作っておくなり。
2023/09/19(火) 20:40:00.00ID:+wkqTEPn
>>431
何がしたいのかいまいちわかってないけど空フォルダ作りたいだけならこう
フォルダAをbatにD&Dして使う

cd "%~1"
for /d %%i in (*) do (
mkdir "%%~i\1"
mkdir "%%~i\2"
mkdir "%%~i\3"
)
pause
437デフォルトの名無しさん
垢版 |
2023/09/19(火) 22:27:32.71ID:gURMcAfl
うおおおおおおお!!!!
できましたありがとうございます!
お二人のおかげです!
2023/09/20(水) 00:13:50.00ID:YkzHQ7up
xcopy は知らない。
普通は、robocopy でしょ?
2023/09/20(水) 02:10:11.18ID:vY1uP1tv
そんなのMS-DOSで使えないじゃん
2023/09/20(水) 07:45:17.50ID:2uRYZGK4
それな
441デフォルトの名無しさん
垢版 |
2023/09/21(木) 07:02:31.48ID:VtU3IO45
普通のwin10で utf8のファイルに fc を使うと派手に文字化けします
文字エンコードなどはどこで指定すればよいのでしょうか?
442デフォルトの名無しさん
垢版 |
2023/09/21(木) 16:42:57.64ID:2fMT8T96
chcp 932
2023/10/03(火) 21:23:54.04ID:Z09KwkqG
神様教えて下さい

xcopy /D:[MM]/[DD]/[YY]
で指定した日付以降のファイルをコピーできるけど
x日前より新しいファイルのみコピーしたい時の方法はない?
2023/10/04(水) 11:25:24.03ID:Ru3hWGvF
Robocopy の /MAXAGE
2023/10/04(水) 12:20:07.48ID:Wr02smam
5chなんでこんなに重いん?いつまでこの重いの続くん?
2023/10/04(水) 12:29:43.90ID:UHUx/6V1
なんで俺に聞くの?
2023/10/04(水) 13:11:28.12ID:Wr02smam
いや、お前には聞いてない
2023/10/06(金) 09:10:25.11ID:u9U/aciQ
5ch攻撃してる人が飽きるまで。
2023/10/09(月) 15:26:51.31ID:gPLHWilL
神様教えて下さい

dir のオプションで/b /s 付けた時に
フルパス名が辞書順になるオプションってどれ?
/on /ogとかあるけど
思うようにならない
450デフォルトの名無しさん
垢版 |
2023/10/09(月) 17:55:27.25ID:416rm9Ab
/q
2023/10/10(火) 11:13:06.14ID:GmlcHfbX
「VBScript」は非推奨に、将来のWindowsリリースで削除
https://forest.watch.impress.co.jp/docs/news/1537619.html

batファイルはどうなる?
2023/10/10(火) 11:26:18.76ID:cUy975D5
>>451
糞過ぎる
2023/10/10(火) 11:37:38.54ID:l0kLdmnh
JScriptというかWindowsScriptHostは生き残るのか?
2023/10/10(火) 18:15:49.98ID:dUGfQnTA
なんで5chこんなに重いん?この重いのいつまで続くん?
2023/10/11(水) 07:20:10.03ID:x54NWWVS
>>451
EdgeのIEモードが2029までだからそれまでは使えるという予想があったけど
機能の有効化で使えるならどうでもいいわ
2023/10/11(水) 08:26:32.52ID:mMAmsq6k
ネットは心の鏡
お前の心が重いのだ
2023/10/11(水) 13:00:48.19ID:yI6tEEU8
textファイル1に
a
b
c
d
が入ってて
textファイル2に
1
2
3
4
が入ってて

連結して
a1
b2
c3
d4
にしたいけど
dosコマンドだけでは無理?
2023/10/12(木) 15:02:33.47ID:DS7FO2PL
>>457
無理ではないがコマンドプロンプト開いて1行のコマンドで書くのはとても面倒だからバッチファイル書いたほうがいい
2023/10/12(木) 21:58:11.30ID:ZXm8+EHB
powershell -c "gc textファイル1, textファイル2 | group readcount | foreach{$_.group -join ''}"
a1
b2
c3
d4
2023/10/13(金) 11:28:13.45ID:eHigHg14
>>459
'-join' 演算子に続けて値の式を指定する必要があります。

って警告が出ます
2023/10/13(金) 17:19:46.92ID:5yGgcXlN
「''」と「"」を見間違えてるのでは
462デフォルトの名無しさん
垢版 |
2023/10/29(日) 22:58:43.01ID:4fxrkRUI
環境変数を;区切りで改行して出力したくて
for /F "delims=;" %i in ("%PATH%") do echo %i
としたのですが最初の一つしか出力されません
何がダメなんでしょうか...
2023/10/30(月) 00:54:06.32ID:S4fhwBsv
ダブルクォーテーションで囲まれた"%PATH%"が1つの引数としてForに渡されて1つ目の区切り文字に達するまでを出力してるからそうなる

1つずつ取り出したいならダブルクォーテーションを消せば良いがそれだと半角スペースも区切り文字に判定されるから
簡単にやろうと思ったらまず半角スペースを別の文字に置換してからダブルクォーテーション無しで渡してその後半角スペースを元に戻すとかかな
2023/10/30(月) 01:46:36.18ID:dhg2pdyL
"%PATH%"が一行なのでforループも1回しか繰り返さないってだけ
2023/10/30(月) 02:13:56.37ID:dhg2pdyL
delimsの区切り記号指定は、
for /F "tokens=1-3 delims=;" %i in ("%PATH%") do echo %i,%j,%k
とか1行の中で複数項目に分ける場合に使う
区切り記号でループさせることは不可能
2023/10/30(月) 03:27:22.35ID:dhg2pdyL
興が乗ったので作ってみた
@echo off
SETLOCAL EnableDelayedExpansion
SET LF=^


SET splitted_path=%PATH:;=!LF!%
for /f "tokens=*" %%i in ("!splitted_path!") do echo,%%i
2023/10/30(月) 06:58:07.09ID:EuHHvGeq
バッチと関係ないけどpath変数のフォルダ名に
;文字が入ってたらwindowsの動作はどうなるんだろう
"で囲めばいいだけなのかな
2023/10/30(月) 13:19:36.99ID:dhg2pdyL
for文も不要だった
@echo off
setlocal EnableDelayedExpansion
for /f "delims=N" %%i in ('cmd /u /c echo 不') do set CR=%%i
set LF=^


SET splitted_path=%PATH:;=!CR!!LF!%
echo,!splitted_path!
469デフォルトの名無しさん
垢版 |
2023/10/30(月) 23:23:37.40ID:oqTBGQIx
皆さんありがとうございます参考になりました。
気軽に使いたかったのでこんな感じで雑に実現しました
@echo off
for %%i in ("%PATH:;=";"%") do echo %%i
pause

毎回環境変数ウィンドウ開くの面倒だからcliで見やすく確認できないかなーと気軽に始めたのですがbatスクリプト難しいですね
遅延展開とか初めて聞きましたw
2023/10/31(火) 06:54:11.36ID:9EMrUdB9
遅延にしたら!が変わる
!があると^も変わる
2023/10/31(火) 07:18:54.11ID:1/1CCAX6
バッチは不毛すぎる
使うのは最小限に留めろ
2023/10/31(火) 07:44:42.03ID:/7M4GG46
頑張りすぎると無毛になる
2023/10/31(火) 08:59:44.07ID:5Lja4y81
おかえり
2023/11/01(水) 10:36:13.57ID:QIr7Aj5s
バッチファイルは縛りプレイが好きな人にしか向かないよ
2023/11/12(日) 10:36:55.29ID:8jJHTm3/
batファイルの処理が終わったらスマホに何らかの通知を送りたいんですが何かいい方法は無いですか?
2023/11/12(日) 13:00:47.64ID:9doZQWI1
SMS送信するWebAPI実行
2023/11/12(日) 18:58:13.28ID:aZ7/2ZLa
NET SEND
2023/11/19(日) 15:27:06.49ID:tEMsHOKq
>>476
>>477
どちらも難しそうだったのでPowerShellでGmailを送るやり方にしました
2023/12/11(月) 17:33:41.74ID:DuarkpA3
習作でlog1.txtに格納されている文字列を1行ずつlog2.txtの中に存在しているかチェックしたいのですが、

@echo off
for /f %%a in (log1.txt) do (
set line=%%a
find "%%a" log2.txt
if %errorlevel% == "0" (
echo OK >> kekka.txt
) else (
echo NG >> kekka.txt
)
)

findで返ってくる値が0に固定されてしまい、
判定を上手く行うことが出来ずにいます
稚拙な質問でお恥ずかしいのですがどのように修正すれば良いでしょうか
2023/12/11(月) 21:12:00.54ID:WKo0W+M9
>>479
お前がなぜレスを貰えないのかchatgptに聞いてこい
2023/12/11(月) 21:23:41.62ID:ZQU2Csd1
>>479
いちばん手っ取り早いのはsetlocal enabledelayedexpansionを使うこと

@echo off
setlocal enabledelayedexpansion
for /f %%a in (log1.txt) do (
find "%%a" log2.txt >nul 2>nul
if "!errorlevel!" == "0" (echo OK) else (echo NG)
)
endlocal

遅延展開で調べてみて
ただforにdelimsとかtokensの指定ないけどそれは問題ない?
2023/12/11(月) 22:30:44.45ID:TXSKL9RJ
for文を初めて使ったものでスレ汚し紛いな質問で申し訳ないです
setlocal enabledelayedexpansionを利用して手直しし、
希望通りの結果を出力できました。ありがとうございました
483デフォルトの名無しさん
垢版 |
2023/12/12(火) 18:16:58.21ID:e+gu1Rew
こんな感じでperl起動するとして、このときwindows terminal(設定によってはコマンドプロンプト)の新しいウィンドウが開かれてperlのコードが実行されますが、既に開いているwindows terminal内で新しいタブを開いて実行できないでしょうか?

perl "aaa.txt"
exit /B
484デフォルトの名無しさん
垢版 |
2023/12/12(火) 18:55:34.45ID:e+gu1Rew
書き忘れました
バッチファイルの実行はコマンドプロンプト内ではなく、バッチファイルのアイコンをダブルクリック(おそらくエクスプローラーで実行)することを前提にしてます
2023/12/12(火) 20:27:32.49ID:I4UWTUvH
>>483
11のターミナルのタブはバグなのか仕様なのか誰も判らんから答えようがないよ
どうして11みたいな糞を恥ずかしげもなくリリースしたのかMSに聞いてこいよ
2023/12/17(日) 11:53:39.09ID:zJzmsCBl
>>483
batではなくショートカット作って
プロパティのリンク先をwt perl "スクリプトのフルパス"
作業フォルダーをスクリプトのあるフォルダ
でよくない?
487デフォルトの名無しさん
垢版 |
2024/01/18(木) 19:51:19.47ID:WajCwGEB
シンプルに指定のフォルダ内へ存在する、特定のフォルダとファイルをバッチで一括削除する場合、そう記述すれば良いでしょうか

C:\AAA\BBB\CCCの、CCCの中にある
フォルダ1、フォルダ2、ファイル1、ファイル2、ファイル3・・・をまとめて削除したいのです

バッチファイルでCCleaner v5.63の対象リストみたいな運用をしたく思っています
2024/01/18(木) 20:05:52.37ID:lPYOY/79
>シンプルに
シンプルかーよっしゃ!
>指定のフォルダ内へ存在する、特定のフォルダとファイルを
へはどっちに掛かるの?
>バッチで一括削除する
バッチスレやしな
>場合、
うん…
>そう記述すれば良いでしょうか
そうやな、
まずChatGPTにその質問内容が人間に判る文章になってるか添削してもらいな
2024/01/18(木) 21:24:27.19ID:fl7npJfZ
消したいファイルやフォルダを列挙するのが一番シンプル
フォルダ内を全部消したいのなら rmdir /s /q
ただし指定したフォルダも消えるので再度作る必要はある
490デフォルトの名無しさん
垢版 |
2024/01/18(木) 21:50:17.22ID:WajCwGEB
>>489
早々に有難うございます
ネットにある指南もかなり事前チェックした上での投稿ですが、断片的な内容が多く、それらをコピペして調整せども上手くいかなかったものでして

ひょっとすると@echo offのあとに
del C:\AAA\BBB\CCC\ファイル1
del C:\AAA\BBB\CCC\ファイル2
del C:\AAA\BBB\CCC\ファイル3
rmdir /s /q C:\AAA\BBB\CCC\DDD
rmdir /s /q C:\AAA\BBB\CCC\EEE
rmdir /s /q C:\AAA\BBB\CCC\FFF
exit

的な箇条書きで良かったりしますか?
491デフォルトの名無しさん
垢版 |
2024/01/18(木) 21:54:35.77ID:WajCwGEB
これまでよく運用してきたアットリブやサービスなどは、例を挙げると
attrib +s +h C:\Users\xxxxxx\ntuser.dat
のたった一行で完結していました
ファイルディレクトリの削除も、特別な条件を付与しない場合は上記と似たようなものでしたかね
2024/01/18(木) 22:00:03.62ID:MX5L5JEY
pushd C:\AAA\BBB\CCC
rd /s/q フォルダ1 フォルダ2 ファイル1 ファイル2 ファイル3・・
popd

…フォルダは消せてもファイル消せないか。じゃあ、

pushd C:\AAA\BBB\CCC
rd /s/q フォルダ1 フォルダ2 ファイル1 ファイル2 ファイル3・・
del /f フォルダ1 フォルダ2 ファイル1 ファイル2 ファイル3・・
popd

エラーは無視w
493デフォルトの名無しさん
垢版 |
2024/01/19(金) 05:19:53.22ID:bHDC7nyS
>>492
望むバッチが作れました
有難うございました
2024/01/19(金) 06:08:19.50ID:xbWxkRsK
>>492
フォルダ1とフォルダ2を一つの命令で消すことは出来ないのでは?
2024/01/23(火) 21:55:09.85ID:ke6XWARZ
バッチファイルから VS Code を起動しようと start で
start ”C:\apps\VSCode\Code.exe”
のようにすると、Code.exe の終了待ちになってしまいます
実行後は普通の exe のようにプロンプトに戻ってきて欲しいのですが、
バッチファイルでどうにかできるものでしょうか?
2024/01/23(火) 23:07:46.88ID:fGdUtoWj
>>495
bin\code.cmdから起動するか
set ELECTRON_NO_ATTACH_CONSOLE=true
すればすぐ戻る
2024/01/23(火) 23:27:45.51ID:ke6XWARZ
>>496
ありがとうございました
期待通りの動作になりました

微妙に訂正 >495 は start ”” ”C:\apps\VSCode\Code.exe” と書くべきでした
2024/02/02(金) 14:12:59.14ID:/quSrI1G
バッチでディレクトリの中身のファイルを別のディレクトリにコピーしたい
大量にあるから更新時刻の新しいのだけコピーしたい
robocopy以外のコマンドで可能?
2024/02/02(金) 19:39:01.90ID:wG6y7v1N
xcopy /d
では対応できない案件?
他には
forfiles
を組み合わせるとかあるけど、そもそも robocopy を避ける理由が
分からないと勧めづらい
2024/02/02(金) 19:55:07.14ID:SlEtxLWX
バッチで時刻見ながら1個1個コピーとか…可能
2024/02/02(金) 20:29:32.82ID:/quSrI1G
>>499
感謝
robocopyとcopyしか考えてなかった
robocopyはオプション間違えると消えるのが恐くて
2024/02/02(金) 23:09:26.35ID:oSMWA/4/
こういうの使った方が早いかもよ
ttps://schinagl.priv.at/nt/ln/ln.html
2024/02/03(土) 11:35:25.52ID:OZed/uKu
NASやファイルサーバの機能の重複除去を有効にすると文字通り重複してるファイルは勝手にファイルシステム内で統合されるから気にする必要事なくなるよ
2024/02/16(金) 14:00:04.95ID:xcbCRr3h
>>481
%errorlevel% という環境変数モドキのないdosでも使える
if not errorlevel 1 が正解
2024/02/16(金) 15:31:25.08ID:Pal4p53G
フォルダがいくつかあって
フォルダの名前が年月日で
「あれYYYYMMDD」形式になています
最新の日付フォルダの中身の特定のファイルだけを
別フォルダにコピーする
バッチファイル可能ですか?
2024/02/16(金) 16:31:32.99ID:1D5G9s1W
>>504cmd /c exit -1

if not errorlevel 1 echo OK
2024/02/16(金) 16:34:14.65ID:1D5G9s1W
途中で間違って書き込んじゃった。
戻り値が負数の場合に注意が必要。
2024/03/15(金) 00:37:59.57ID:exMGzLtn
住人いるのか?
2024/03/15(金) 21:32:34.28ID:cEgPx2Y0
いないよ
2024/03/15(金) 21:48:31.82ID:8BVQzeBd
>505

誰か教えて
2024/03/15(金) 21:54:53.76ID:nVSr20GQ
>>510
まずフォルダ名からYYYYMMDDの部分を抜き出して
フォルダをしらみつぶしに大小比較していく
一番大きい数値のフォルダはこれで特定できる
その中身の特定のファイルはどういった特定なのかで実現できるかどうか分かれる
2024/03/15(金) 21:59:21.24ID:8BVQzeBd
>>511
特定のファイルとは
特定のファイル名です
全てのフォルダに同じファイル名のファイルが入ってる
2024/03/15(金) 22:58:24.97ID:XS7vFeOB
>>512
こんなかんじ?

md あれ20240313 あれ20240314 あれ20240315 あれ20240316 dest
call>あれ20240316\特定のファイル

setlocal enabledelayedexpansion
call>are_list.txt
for /f %%a in ('dir /ad /b "あれ*"') do (
set "are=%%~a"
echo !are:~-8,8!>>are_list.txt
)
endlocal
sort /r are_list.txt /o are_list.txt
set /p target=<are_list.txt

copy あれ%target%\特定のファイル dest
2024/03/16(土) 08:55:44.79ID:PUBVa+tA
FOR /F %%i IN ('dir /b /o-n あれ*') DO (
copy "%%i\特定のファイル" "別フォルダ" & goto :eof)
2024/03/16(土) 09:42:46.12ID:yhWVSGDf
for /d %%i in (あれ*) do set フォルダ=%%i
copy "%フォルダ%\特定のファイル" "別フォルダ"
2024/04/08(月) 22:28:43.24ID:tYLSO2Xj
※スレ違いで誘導していただきました
https://mevius.5ch.net/test/read.cgi/tech/1687260267/507
コマンドプロンプト(robocopy)について
Windows 11 Pro 23H2です
図1のように、robocopyで「フォルダA」を「フォルダB」へミラーコピーする実行ファイルを作成しました
(フォルダA)空
(フォルダB)ファイル.txtのみ
図2の削除予定?フォルダやファイルを非表示にしたいのですが、
それらしきログオプションが分かりませんでした
(図1)https://i.imgur.com/lH5b1iq.png
(図2)https://i.imgur.com/3Ye9N5c.png
よろしくお願いいたします
517sage
垢版 |
2024/04/09(火) 14:00:57.75ID:Ugima7Hm
>>516
/lじゃなくて/quitはどう?
2024/04/09(火) 14:46:09.52ID:A/PWQBtx
HELP ATTRIB
2024/04/09(火) 20:18:46.54ID:ad5KI3J5
削除予定なら削除してからコピーを実行したら表示されないんじゃね
2024/04/09(火) 21:46:07.89ID:yR8KPsJp
/XF ファイル.txt
2024/04/10(水) 19:52:48.51ID:sNhBgYIO
>>517-520
ありがとうございます
>>517さんの /quit で意図する動作ができました!
>>518さんの事前削除もいいですね
https://i.imgur.com/iDD0vYw.png
ありがとうございました
522デフォルトの名無しさん
垢版 |
2024/04/24(水) 02:18:02.70ID:K1wg6IoP
バッチファイルでExecutablePathにToolsを含むzebedee.exeというプロセスをkillしたいのだが、

for /f "usebackq tokens=2 delims==" %%A in (`WMIC PROCESS WHERE "Name='zebedee.exe' and ExecutablePath like '%%Tools%%'" get ProcessId /VALUE ^| find "="`) do (
taskkill /F /pid %%A
)

だと
D:\Tools\zebedee>(
taskkill /F /pid 21252
)
エラー: 無効なクエリです

となってしまう。

for /f "usebackq tokens=2 delims==" %%A in (`WMIC PROCESS WHERE "Name='zebedee.exe' and ExecutablePath like '%%Tools%%'" get ProcessId /VALUE ^| find "="`) do (
set PID=%%A
)
taskkill /F /pid %PID%
だと成功する。

forの中にtaskkillて書けないの?
「エラー: 無効なクエリです」てWMICのエラーだから、forとWMICとtaskkillの問題?
2024/04/24(水) 12:53:51.62ID:cg/GbNoZ
>>522
WMICはパイプを使うと改行がCR CR LFとなって、%%A に正しく設定できていないのでだめっぽい。
SETするとCRが削除されてうまくいくようです。
というわけで、いったんリダイレクトしてファイルにするとよいでしょう。

^| find "="

^>T ^&^& find "=" T
2024/04/24(水) 19:27:30.39ID:zTq4mcuG
前にquery userってコマンドの出力を変数に入れたかったんだけど
出力に文字'>'が入っててうまく取り込めなくてその時は結局vbsだかで取り込んだ
バッチだけでやる方法ってあったのかな
525デフォルトの名無しさん
垢版 |
2024/04/26(金) 01:53:35.81ID:WIIBP3hh
>>523
for /f %%A in ('wmic process where ^( Name like 'zebedee.exe' and ExecutablePath like '%%Tools%%'^) get processid') do (
taskkill /F /pid %%A
)

これで出来た。エラーするけど。
なんでMSのコマンドって不要なものを消せないのかね。
Linuxだと情報だけを表示するオプションがあるのに。
526デフォルトの名無しさん
垢版 |
2024/04/26(金) 06:34:16.76ID:WIIBP3hh
>>525
forとtaskkillで頑張らなくても

wmic process where ( Name like 'zebedee.exe' and ExecutablePath like '%%Tools%%') delete

でよかったんだ。
527デフォルトの名無しさん
垢版 |
2024/04/28(日) 21:55:14.93ID:zlR73q8o
スレ立てあらしスクリプト対抗age
2024/05/15(水) 15:54:12.87ID:7SsR7Bys
コマンドラインからスリープ状態にするやり方調べてたけど意外と面倒くさいんだな
スリープじゃなくて休止になったり管理者権限が必要だったり
2024/05/15(水) 16:36:20.47ID:7ab9f7zE
powershellにおまかせするのが楽みたいだね
2024/06/12(水) 21:35:23.01ID:XPCO6cU9
共有フォルダの特定のファイルが不定期に更新されるので
過去のファイルを残すために
別のフォルダに保存しておきたい
更新の都度=全部は無理としても毎日1回はコピーしたい
元ファイル名にコピーする日付と時刻を追加したファイル名で
数日更新しない時もあるから
更新されてなかったらコピーしたくない
そんなバッチファイル可能?
毎日1回はタスクスケジューラで設定
2024/06/12(水) 22:35:20.23ID:09UxvqoI
>>530
両方のファイルのタイムスタンプを比較すればいいかな
for /f "tokens=*" %%i in ("foo.txt") do echo %ti
新しいかどうかじゃなくて一致するかしないかで十分だと思う
dir /t "foo.txt"
でも更新日付は求められる
xcopy "foo.txt" backup_folder /d
でも更新されたファイルのバックアップはできるが同じファイル名となる
まあ頑張ってくれ
2024/06/12(水) 22:36:29.43ID:09UxvqoI
ティルダが抜けてた
for /f "tokens=*" %%i in ("foo.txt") do echo %~ti
2024/06/12(水) 23:08:41.34ID:XPCO6cU9
>>532
明日試します
ファイル名は日付時刻だけなら何とかなりそう
元ファイル名に連結がうまくできない
2024/06/13(木) 00:35:39.15ID:V4k66q9W
>>533
ファイル名の変名の一例として foo.txt → foo_yyyymmdd-hhmm.txt にするなら
for /f "tokens=*" %%i in ("foo.txt") do set d=%%~ti
set dd=%d:~0,13%%d:~-2%
set dd=%dd:/=%
set dd=%dd: =_%
for /f "tokens=*" %%i in ("foo.txt") do echo %%~ni_%dd%%%~xi
2024/06/13(木) 01:21:37.93ID:V4k66q9W
秒も要るなら
for /f "tokens=2,3" %%i in ('where /t "foo.txt"') do set d=%%i&set t=_%%j
set dd=%d:/=%
echo %t%|findstr _[0-9]:>nul&&set t=%t:_=_0%
set tt=%t:~1,2%%t:~4,2%%t:~-2%
echo foo_%dd%-%tt%.txt
2024/06/15(土) 14:56:29.48ID:H/tJtGX+
>>534 の /f "tokens=*" は不要な気がする
2024/06/15(土) 15:08:14.13ID:UQXtemWf
ファイル名が "メモ1 買い物リスト.txt"とか十分ありえるしなあ
2024/06/15(土) 15:09:50.12ID:UQXtemWf
ああ/fが要らんのか
539デフォルトの名無しさん
垢版 |
2024/06/15(土) 21:58:33.69ID:1hp9WHhR
ファイルをコピーしてファイル名の変更すらわからない人間に教えなくてもいいと思うぞ
2024/06/15(土) 23:00:01.75ID:lwRcTmIT
超絶初心者わいがネットで拾ったバッチファイルを
自分仕様にいじってるんだけも根本的にわからない事があったので来ました
主に動画ファイルのエンコードとか処理とかです

1 複数ファイルをD&Dしてファイル作成日時の古い順から処理する
2 ファイルネームに日本語全角スペースがある場合でも読み込んで処理する

この2つの仕様をWindowsバッチファイルだけで両立可能なのでしょうか?
ChatGPTとCopilotに聞くと出来ます!こう修正してって言われてやっても
上手くいった試しがないのでそもそも両立可能なのかがわかりません
よろしくお願いします(´・ω・`)
2024/06/15(土) 23:26:37.72ID:UQXtemWf
D&Dは止めた方がいいね
最近の過去ログに無理やりやるのがあったと思うがまあ止めといたほうがいい
もっと運用を考えるべきだね
2024/06/15(土) 23:53:38.13ID:UQXtemWf
>>540
フォルダに半角空白入りの名前を付けておくのがもっとも簡単な対策
2024/06/16(日) 00:32:01.65ID:fRT17GSx
powershellへ移行しない理由は何?
2024/06/16(日) 00:49:07.80ID:/Fmpwzf6
移行できる人なら質問しないだろうよ
2024/06/16(日) 09:39:33.25ID:+73AB3cR
PowerShellって初回使用時すごい待たされるじゃん
普段使ってなくて毎日シャットダウンするような人は使おうと思ったとき待たされてストレス受けるんだよね
2024/06/16(日) 11:14:43.44ID:44t+YCVJ
毎日シャットダウンはするけど普段使ってないものとは
なぞなぞかな
547540
垢版 |
2024/06/16(日) 22:03:28.94ID:46K9PH7S
>>542
ありがとう
これはAIでは出てこない答えで感心しました

基本的にはムリっぽいという感じですかね
powershellの方が良いこともわかってはいるのですが
なにぶん物覚えが悪すぎて(´・ω・`)
2024/06/17(月) 00:26:58.20ID:BTOFB8aB
むしろpowershellのほうがググれば沢山出てくるし書きやすいと思うけどね
2024/06/17(月) 09:41:03.27ID:4dsWgq6q
%20とか名前付けるか

Pathのマルチバイト問題は解決困難だなあ
2024/06/17(月) 15:06:14.86ID:NTaBtmxu
全角スペースがある場合は
フルパスの一部にでも半角スペースが入っていれば問題が生じないので、
別名として、当該フォルダに対して、シンボリックリンクなりジャンクションを半角スペースを入れた名前で作成し、
これを経由して運用すれば、とりあえず回避はできるよ

XPの頃にさんざん苦しんだのに、未だ根本的な解決がなされていないというのはモヤモヤする

環境によっては、"#"がフルパスに入るとだめというのもあるな
2024/06/17(月) 16:53:21.50ID:A2yJgFtn
D&Dやめて日付順のリストファイルを作成したらどうかね
エクスプローラーとメモ帳で簡単にできるでしょ
552デフォルトの名無しさん
垢版 |
2024/06/17(月) 23:01:16.20ID:4L+665Jw
ドラッグアンドドロップなんてバッチ処理の発想じゃねえなw
553デフォルトの名無しさん
垢版 |
2024/06/17(月) 23:01:56.15ID:4L+665Jw
CUIをGUIの言葉で言うのは斬新すぎる
2024/06/19(水) 14:55:27.29ID:baOC8PLn
Ruby で作ってみた。
Rubyでは半角空白はエラーになるけど、全角空白は正常に動く

デスクトップにショートカットを作って、
それに対して、ファイルをdrag & drop する

ショートカットのリンク先は、
C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/script.rb"
(@は取り除いて下さい)

require 'fileutils'

Sep = '-' * 40 + "\n" # separator

# ファイル作成日時の古い順から処理する。
# ただし、File.(stat.)birthtime は、Linux では使えない
ARGV.select { |full_path| File.file?( full_path ) } # ファイルのみ
.sort_by{ |full_path| File.birthtime( full_path ) }
.each do |full_path|
puts Sep + full_path
p birthtime = File.birthtime( full_path )

# ここに処理を書く
end

sleep # 出力したコマンドプロンプト画面を閉じないようにする
2024/06/19(水) 21:41:48.63ID:AL0iJITw
バッチファイルでちまちま文字列処理するのは
C言語でちまちま文字列処理するくらい不毛だからやめとけ
2024/06/20(木) 06:56:43.32ID:oAthcLJ7
私が普段使っているドラッグアンドドロップ用バッチのサンプルです

@echo off & set a="%cmdcmdline:"=%"& set "arg="
for /f "tokens=3* delims=:" %%i in (%a%) do (set a=%%i& set b=%%j)
set "a=%a:~-1%" & set b="%b::=" "%"
for %%i in (%b%) do set b=%%i& call :x
goto y
:x
if defined arg set arg=%arg:~0,-3%"
set arg=%arg% "%a%:%b:~1%& exit /b
:y
echo コマンド %arg%
pause & exit
2024/06/20(木) 14:12:10.76ID:6cw0yeSx
PowerShellて別の文字でエラーになるとか聞いたけど本当?
2024/07/16(火) 20:58:55.86ID:Ho7KhNQA
net session /delete の後の2回のY/N選択をコマンドで自動入力したいんだけど、どうやればいいの?
2024/07/16(火) 21:44:58.97ID:PFxavJIe
>>558
応答ファイル(y+CR/LF, n+CR/LF)を作ってそれを入力とするのが常套手段だが
●Y/Nが1回の場合の例
rem ***準備
mkdir 111 2>nul
echo.>111\1.txt
rem ***応答ファイル作成
echo n>n.txt
echo y>y.txt
del Z:\111\*.*<n.txt >nul 2>&1

2回とのことなので、
echo n>n_n.txt
echo n>>n_n.txt
とするといけるかも(実行してないので結果不明)
2024/07/17(水) 06:53:17.67ID:gLjbT8+P
ahk
2024/08/12(月) 12:32:10.56ID:om8unfFL
初心者質問ですみません。ffmpegで一括再エンコードしたいと思ってバッチファイルを作ってみたのですがファイルにスペースが含まれるとエラーが出るようで困っています。どのように対処すればよいか、どなたか御教示お願い出来ませんでしょうか?
@echo off
cd /d %~dp0

for %%a in (*.mp4) do (

"C:\ffmpeg\bin\ffmpeg.exe" -i %%a -b:v 500k -c:a copy %%~na_500k.mp4
)
pause
2024/08/12(月) 14:37:08.59ID:NAcZpcdu
>>561
引数として渡されるファイル名にスペースがある場合?
それなら引数を”で囲めば行けるんじゃね?
2024/08/12(月) 19:13:11.22ID:N4nkPpmi
有難うございます。引数を""で囲んだら上手くいきました。
2024/10/03(木) 08:38:22.80ID:hcouLIA5
別のスレでも質問させていただいているのですが、こちらの方が適切かと思い投稿させていただきます。

以下をbatファイルで動かそうとしてもうまく動かないのですが、どうしたら良いでしょうか。
batファイルをダブルクリックして、PowerShellを実行しています。
PowerShellのスクリプト部分は、PowerShellで動くことを確認済です。
ランダムパスワードを生成する感じです。

https://chatgpt.com/...05-98e7-18f01918f140
2024/10/03(木) 08:39:33.18ID:hcouLIA5
リンクはこちらです
https://chatgpt.com/share/66fdc027-bb18-8005-98e7-18f01918f140
2024/10/03(木) 10:24:37.73ID:EmzEDUtK
適切だと思ったらマルチポストも辞さない
2024/10/04(金) 07:40:33.06ID:BveI+02d
以下を消したら動くようになりました。
解決です。

Param(
[int]$Length = 16,
[switch]$IncludeUppercase,
[switch]$IncludeLowercase,
[switch]$IncludeNumbers,
[switch]$IncludeSymbols
)
568デフォルトの名無しさん
垢版 |
2024/10/12(土) 02:43:46.51ID:fuP8Oeol
iris-microという便利なソフトつかって 画面明るさ色温度かえてます
バッチファイルが2種類あって この設定をきりかえつかっています
ふたつのバッチファイルを 交互に繰り返すようなスクリプト作れますか
プロセスがのこったりしてるようでもないので難しいでしょうか?
2024/10/12(土) 16:51:48.93ID:4VpnKVlz
バッチを順番に呼び出して先頭にgotoすれば交互になるような気がします
2024/10/12(土) 17:04:01.38ID:qxhXc26A
同じbatで起動するたびにサイクリックに実行する内容を切り替えるって意味じゃないかな
何か外部にフラグみたいなもの(又は実行用にbatをコピーしてそれを呼び出す)を用意するといいんじゃないかな
同時起動の排他制御とかは個人使用ならまあ不要だろう
2024/10/12(土) 17:39:10.70ID:Iy6RGAFA
状態を持たせたいならバッチの名前を変えるという荒業もできるね
2024/10/12(土) 18:07:14.49ID:qxhXc26A
自分自身の名前は変えられないので別ファイルを用意
そもそもbat名を変えたら起動の度に別bat名で起動することになり元々の2つのbatのある状態と変わらんじゃん
2024/10/12(土) 18:14:50.19ID:Iy6RGAFA
リネームは昔からあるハックだけどな
頭悪そう
2024/10/12(土) 19:31:57.02ID:d82xRt2j
echo.>stat_on
if exist stat_on
とかでチェック用ファイルで分岐するのが手っ取り早い

より汎用的にやるなら
inifile.exeみたいの作るか拾うかして状態を読み書きする
2024/11/06(水) 18:43:05.45ID:KAHjZpf+
winPCで
エクスプローラから
複数ファイルを
バッチファイルにドロップして
拡張子付きファイル名のみ(パスなし)を
1行1ファイル名で
list.txtに書き出したい
どの様に?
576デフォルトの名無しさん
垢版 |
2024/11/06(水) 19:42:12.98ID:0Z0sjFnd
てすと.com
2024/11/07(木) 07:18:54.75ID:diE3Ipx6
>>575
@echo off & chcp 65001
set a="%cmdcmdline:"=" "%"
call :x > list.txt & exit
:x
set a=%a:*.bat" =%
for %%i in (%a:""=%) do set a=%%i& call :y
exit /b
:y
if "%a:~1,1%"==" " set a=%a: =" "%
for %%i in (%a:""=%) do echo %%~nxi

list.txt は UTF-8 にしてみた
バッチの拡張子は .bat
578デフォルトの名無しさん
垢版 |
2024/11/07(木) 10:34:25.11ID:sTPvG4+T
初めからコマンドプロンプトでやればいいのに
579デフォルトの名無しさん
垢版 |
2024/11/07(木) 10:35:43.77ID:sTPvG4+T
まずは特定のフォルダにファイルを集めるという発想がないんだろうな
580デフォルトの名無しさん
垢版 |
2024/11/07(木) 11:01:23.05ID:5OQwBO7R
batファイルで=を含む置換えの時の方法教えてください。
入力は Hello World 12=34

@echo off
set /p mystringA=あいさつ:
set mystringB=%mystringA:12=34=4567%
echo %mystringB%

結果をこのようにしたい
Hello World 4567
2024/11/07(木) 12:14:54.61ID:9xnRXsv4
>>580
batだけでやるには大変(=の置換は無理)
変換前に1文字ずつ判定して=だったら普通使われない文字(=とか)に変えるとかしないとできない
別の方法としては別の言語でサポートしてやれば楽
@if (0)==(0) echo off
rem *** このブロックにbat内容を記述する
set s=Hello World 12=34
cscript //nologo /e:jscript "%~f0" "%s%"
rem for /f "tokens=*" %%i in ('cscript //nologo /e:jscript "%~f0" "%s%"') do set s=%%i
rem echo %s%
goto :eof
rem ***
@end
//これ以降はjscriptの処理部
var data=WScript.Arguments(0).replace(/12=34/g,"4567");
WScript.StdOut.WriteLine(data);
582デフォルトの名無しさん
垢版 |
2024/11/07(木) 12:33:40.59ID:5OQwBO7R
>>581
サイトによって特殊文字は^だったり"を使ったりで試して出来なかった
代案をわざわざありがとうございます^^
2024/11/07(木) 13:07:58.08ID:sK42d9tR
>>577
神様ありがとう
なんでかわからないけど動きました

list. txtを%USERPROFILE%\Desktopに作成するにはどのようにすれば?
単純に
"%USERPROFILE\Desktop\list.txt"
に変更してもダメでした
2024/11/07(木) 14:02:09.09ID:DJJuXIJX
エクスプローラーで「パスのコピー」あるの知ってる?
windows11 なら選択後に shift+ctrl+c
バッチとかいらんだろ
2024/11/07(木) 16:57:38.50ID:sK42d9tR
>>577
>583
今やったらできました
お騒がせしました

もしよろしければ
解説お願いします
586デフォルトの名無しさん
垢版 |
2024/11/08(金) 02:14:23.67ID:NHkTpL6A
del /q "C:\Users\%username%\Desktop\新しいフォルダー"

これで新しいフォルダー内が消えないのですが?
587デフォルトの名無しさん
垢版 |
2024/11/08(金) 03:03:23.20ID:NHkTpL6A
日本語のファルダだとダメなんですかね?
2024/11/08(金) 03:07:22.26ID:8ciHN7a8
文字コードが違うんじゃないですかね
589デフォルトの名無しさん
垢版 |
2024/11/08(金) 03:20:42.79ID:NHkTpL6A
なるほど理解しました
590デフォルトの名無しさん
垢版 |
2024/11/08(金) 03:24:29.70ID:NHkTpL6A
rdコマンドで親フォルダを削除しないようにするにはどう書けば良いのでしょうか?
591デフォルトの名無しさん
垢版 |
2024/11/08(金) 03:36:30.13ID:NHkTpL6A
rdコマンドで無理なら対象のフォルダ以下にあるファイルやフォルダを全て削除するものでもかまいません。
2024/11/08(金) 10:30:14.55ID:n9fsiKUu
カレント移動すれば?
2024/11/08(金) 11:10:01.65ID:PSMBlcAH
フォルダーごと削除してから新規作成したほうが簡単じゃね
2024/11/08(金) 11:27:40.63ID:IbrHrevx
俺の環境だと>>586で消えるけど、/q付けないでやったらファイル削除確認メッセージが出てるか?
出てないなら中身のファイルの属性が隠しファイルになってるとか
2024/11/08(金) 23:02:21.70ID:gP+dh+BC
del /q "新しいフォルダー\*"
for /d %%i in ("新しいフォルダー\*") do rd /s /q "%%~i"
2024/11/09(土) 11:03:02.45ID:bVsLqwPh
cd "新しいフォルダー" && 2> nul rd /s /q .
597デフォルトの名無しさん
垢版 |
2024/11/09(土) 11:39:56.84ID:L7dYAlvM
>>581
またつまづきました><
入力 12&encoding=se34 56=78

これで&encoding=seを削除したくて
set "s=%s:^&=%"

で&を通したんですが
'encoding'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されません。

となって出来ないです
set "s=%s:^encoding=%"
data = data.replace(/&encoding=se/g, "");
のように加えてもダメでした
どうすればいいですか?
2024/11/09(土) 13:08:18.35ID:q8k7iVH6
宿題は自分で考えよう
2024/11/09(土) 13:14:42.95ID:L+GgUCLJ
バッチでjscriptに渡す前に&が解釈されてるのかな?知らんけど
できないです、どうすればいいですかではなく
どこでエラーになってるか突き止めるのが先なのと
文字列処理したいなら違う言語例えばjscriptを覚えた方がよいかと
2024/11/09(土) 13:21:59.27ID:L+GgUCLJ
jscriptは>>581のようにOS標準で入ってる古いjavascript
最近の構文は一部使えないがバッチよりも動作が高速で正規表現など文字列処理にも適している
他にpowershellもある
2024/11/09(土) 14:09:23.50ID:A663IrvX
&はbatでの特殊記号であり、コマンドの区切りの意味がある
set a=aaaa&set b=bbb&set c=ccc
とか複数の命令を1行で書ける
他に&&,||もある
2024/11/09(土) 14:31:25.85ID:A663IrvX
もしかして、set /p mystringA=あいさつ:で入力したときの話か?
なら、""で括れ
set /p "mystringA=あいさつ:"
set mystringA="%mystringA:&=%"
echo "%mystringA%"
2024/11/09(土) 14:37:00.85ID:A663IrvX
set mystringA="%mystringA:&=%"→set "mystringA=%mystringA:&=%"
2024/11/09(土) 14:43:11.36ID:A663IrvX
あと>>581はデータを引数渡し("%s%")してるので、「"」をデータ内に入れることができない
ファイル渡しすれば確実だが、他に環境変数(s)で渡す場合を示しておく
data=new ActiveXObject("WScript.Shell").Environment("Process")("s").replace(/12=34/g,"4567");
2024/11/09(土) 15:04:16.22ID:A663IrvX
ついでに、&について
通常は使わなくても次の行に書けばいいが
閉じた環境からのデータを引渡ししたい場合などはどうしても使わなければならない
set a=1
call :sub
echo %a%
goto :eof
:sub
setlocal
set /a a+=1
endlocal&set a=%a%
goto :eof
2024/11/09(土) 18:43:13.91ID:L+GgUCLJ
>endlocal&set a=%a%
こんなキモい書き方した事ないな
そもそもsetlocalだかは弊害もあるから使わずに書く事を意識した方がいいね
このスレは安易に使いすぎてる
2024/11/09(土) 19:20:02.72ID:KYeqqNmx
ここはキモイ人ばっかりですから問題ないです笑
2024/11/10(日) 07:08:12.44ID:3mwMiYGo
遅延展開以外はsetlocalなんて滅多に使わんが他にどうしろと
2024/11/10(日) 10:11:26.77ID:zZSAaq07
setlocal enabledelayedexpansionは書く人多いけど
endlocalで閉じてる人見たこと無い
2024/11/10(日) 14:06:03.62ID:9SnRMU05
そりゃあ終了したら効果が無くなるんだから文法マニアくらいしか書かんだろう
2024/11/10(日) 18:35:44.79ID:i0Pkbsqf
サブルーチンでsetlocal enabledelayedexpansionを使ったら
endlocalを書かないと呼び出すたびに環境がコピーされていって
あっという間に正常に動作できなくなるさ
2024/11/10(日) 19:42:53.96ID:9SnRMU05
サブルーチンに置くというのは想定しなかったな
メインの、というかスクリプトの先頭に置く使い方しかしてないや
2024/11/10(日) 20:44:53.21ID:Hbc3IhS3
call先にsetlocalがあってもexit /bやgoto :eofで戻ると
変数復元されるのでendlocalは不要だが有ってもいい
やばいのはforやgotoでのループ内部にsetlocalしかないやつ
614デフォルトの名無しさん
垢版 |
2024/11/10(日) 21:35:28.96ID:p0BF9o8N
>>604
ありがとう。
何時間かやってるけどうまくいかないです。
@@if (0)==(0) echo off
rem ***
:start
Aset /p "ss=ss:"
Bset "ss=%ss:&=%"
Cset /p "savename=保存名:"
Dset ss=%ss% option "%savename%"
Eecho %ss%確認1
Fcscript //nologo /e:jscript "%~f0" "%URL%"
rem ***for /f "tokens=*" %%i in ('cscript //nologo /e:jscript "%~f0" "%ss%"') do set ss= %%i
Gecho %ss%確認2
goto :start
rem ***
H@end

// JScript部分
// var data = WScript.Arguments(0);
Idata=new ActiveXObject("WScript.Shell").Environment("Process")("ss");
Jdata = data.replace(/aaaaa/g, "bbbbb");
Kdata = data.replace(/12=34/g, "56=78");
Ldata = data.replace(/encoding=seg/g, "");
MWScript.StdOut.WriteLine(data);
NWScript.Quit();

これでやるとGでI〜Nが無視される。
Iにvarという変数を与えても同じ。
Iをdata = WScript.Arguments(0);にすると与えた入力が途中で途切れる(実際の入力値に”が入ってるため)
Fの代わりにfor文だとbatが落ちる(AppleWebKit/537.36 の使い方が誤っています。)
こういうのをスラスラ書ける天才たちがうらやましい。
2024/11/10(日) 22:06:03.40ID:zZSAaq07
forの中の"%ss%"を削除すれば?
2024/11/10(日) 22:08:14.92ID:cLh8//6O
うーんよく判らんけど
もう入力データはjscipt内でWScript.StdIn.ReadLine();からで拾ってきた方が早くね?とか
バッチはjsciptの呼び出し部分だけ残して全部jscriptでやった方が楽じゃね?とは思った
2024/11/10(日) 22:19:31.51ID:zZSAaq07
ファイル名として使っちゃダメな文字(又はデバイス名)ってのもあるので
そういうのが入力されたら別文字に変えるとか削除するとかしないとダメになるぞ
2024/11/10(日) 23:54:47.86ID:cLh8//6O
上で言った楽なやつね。叩き台としてどうかな
@if (0)==(0) echo off
set ss=
:start
echo %ss%確認1
rem cscript //nologo /e:jscript "%~f0" "%ss%"
for /f "tokens=*" %%i in ('cscript //nologo /e:jscript "%~f0" "%ss%"') do set ss=%%i
echo %ss%確認2
goto :start
@end
// JScript部分
var data = "";
if (WScript.Arguments.Count() > 0) { // 渡された引数がある
data = WScript.Arguments(0);
if (data != "") { WScript.StdErr.WriteLine("渡された引数:" + data); }
}
WScript.StdErr.Write("ss:"); // バッチのfor入力から除外するためプロンプトをエラー出力で表示
var ss = WScript.StdIn.ReadLine();
WScript.StdErr.Write("保存名:");
data = WScript.StdIn.ReadLine();
data = data.replace(/aaaaa/g, "bbbbb");
data = data.replace(/12=34/g, "56=78");
data = data.replace(/encoding=seg/g, "");
WScript.StdOut.WriteLine(data);
2024/11/11(月) 00:41:06.56ID:ggA4ksL2
"%ss%"を引数につけてると
入力に"を入れられると二週目からエラーとなる
2024/11/11(月) 00:55:30.51ID:ggA4ksL2
入力データから"を削除するようにしたほうがいい
ファイル名にも"は使えないから必要ないだろ
それと基本文字列を扱う場合は""で括ること
echo %ss%→echo "%ss%"
じゃないと、&|などでエラーになるし、^も消えるとかいろいろ起きる
(a^b.txtは正常なファイル名)
2024/11/11(月) 01:34:01.29ID:ggA4ksL2
"%ss%"でエラーになってるのはbatでの構文解釈時なのでjscriptでの対処云々以前の問題
622デフォルトの名無しさん
垢版 |
2024/11/11(月) 02:13:27.56ID:BY3zyfqu
みなさんありがとう。
理想なのができたので、まず、
Fをfor /f "tokens=*" %%i in ('cscript //nologo /e:jscript "%~f0" ') do set ss= %%i
>>615
ありがとう。たったこれだけだったよ

>>616,618
文字制限で入力ができなかった。
でもそういうやり方もあるんだと学べたのでありがとう

>>619,620,621
このbatの後に渡されるexeの処理に””で括っておかないとexeのほうでエラーになる
ちゃんとそこを伝えれてなかったね、ごめん
回答してくれてありがとう

これWScript.StdIn.ReadLine();をchat gptで文字制限を聞いたらAのような入力方法だったよ
とはいえ、ありがとうございました><
623デフォルトの名無しさん
垢版 |
2024/11/11(月) 03:53:20.62ID:vS/DyEQP
batというプログラミング初めてです。
初心者に良いサイト教えてください。
Windows 10です。
2024/11/11(月) 04:28:35.50ID:UKR+WOTm
>>623
www.google.co.jp
625デフォルトの名無しさん
垢版 |
2024/11/13(水) 02:26:15.40ID:AkCTz+Wd
BATでこんなすごいことできるぞってのを教えてくださいハゲども
2024/11/13(水) 02:26:54.33ID:HWwn2oWP
>>622
すっかり忘れてたけど
"tokens=*"じゃ先頭が半角スペースやタブだと消えるし、セミコロンだとスキップされるという問題があった
バッチはクセがありすぎる
eolのデフォルトが;で、しかも"eol="だと今度は"が指定されたことになるとかウソーって言いたい

for /f delims^=^ eol^= %%i in ('cscript //nologo /e:jscript "%~f0"') do set ss=%%i
627デフォルトの名無しさん
垢版 |
2024/11/14(木) 11:47:50.65ID:oC8TllJp
@echo off
set T=%tmp%\tmp.txt
type nul>%T%
for %%f in (%*) do (
>>%tmp%\tmp.txt echo %%~nxf
)
type %T% | clip

これだと正常に取得できません
正常にファイル名を取得できるようにするにはどう書けばいいでしょうか?
2024/11/14(木) 11:50:39.07ID:WvtXCkNi
他の「ふつう」の環境選ぶのがええよ
2024/11/14(木) 14:18:34.94ID:q/WsLCXM
>>627
半角空白が無くて全角空白があるファイルをドロップするとファイル名はそこで分かれる
過去ログにやり方はあるけど簡単なのは親フォルダ名のどこかに半角空白を入れておく
それ以外で正常にできないといってるのならもう少し現象を説明してもらわないと
俺達はエスパーじゃないんだから
630627
垢版 |
2024/11/14(木) 15:26:47.13ID:oC8TllJp
>>629
すいません
2つのフォルダーと2つのテキストを用意し、この4つ全てを選択してコピーしたら一つしかコピーできなかったりして正常に動作しません
2024/11/14(木) 15:48:05.37ID:X91uzdxk
>>584 見ろ
2024/11/14(木) 16:15:29.07ID:q/WsLCXM
>>630
コピーって何?
一例としてエクスプローラで複数のファイルを選択反転してbatのショートカットにD&Dしたら
選択したファイルのファイル名がクリップボードに入ってるだろ
どこにコピーする操作が加わるんだ?
633627
垢版 |
2024/11/14(木) 17:07:59.07ID:oC8TllJp
>>632
ファイル名のコピーです
2024/11/14(木) 17:19:32.22ID:q/WsLCXM
ファイル名のコピーしたならもうbatを動かすまでもなくファイル名一覧がクリップボードに入ってるじゃん
そもそもクリップボードに入ってるものを入力するようにはそのbatはできてないじゃんか
635627
垢版 |
2024/11/14(木) 17:27:06.24ID:oC8TllJp
そのファイル名のコピーがうまくいかないのです
2024/11/14(木) 17:38:15.36ID:q/WsLCXM
何をしたいのかちゃんと説明できないのなら付きあえないよ
そのbatは、引数に列記されたファイル(パス)名を順次入力してファイル名のみにして列記した一覧をクリップボードに入れるということをやってる
【オペレーション例】
コマンドプロンプトを立ち上げて
hoge.bat "c:\aa.txt" "c:\bb.txt" "c:\cc.txt"
と入力したら
aa.txt
bb.txt
cc.txt
とクリップボードに入る
637627
垢版 |
2024/11/14(木) 17:41:20.12ID:oC8TllJp
わかりました
失礼しました
638デフォルトの名無しさん
垢版 |
2024/12/11(水) 20:24:09.34ID:y+gluRXv
BATだけでパスワード生成する方法を教えてください。
生成したパスワードをクリップボードにコピーする形でお願いします。
639638
垢版 |
2024/12/11(水) 22:00:19.62ID:y+gluRXv
自己解決しました。
2024/12/12(木) 06:59:11.94ID:Qex7Xru+
パスワード生成はセキュアな乱数使った専用ツールでやれよ
641デフォルトの名無しさん
垢版 |
2024/12/17(火) 20:20:11.38ID:0qw/aoLB
コンテキストメニューにregeditで追加したbatで複数のファイルを実行したら2回実行されるんだけど、これって引数2個で1回だけ実行させる方法ありますか?
2024/12/18(水) 07:22:31.48ID:alC6IUD1
%1 %*
みたいに書くんじゃなかったか
と超適当レス
643デフォルトの名無しさん
垢版 |
2024/12/19(木) 07:22:17.49ID:jup1lTg9
BATでこんなことできるぞってのを教えてください。
2024/12/19(木) 08:07:25.40ID:i8S4J+Do
無限増殖.bat

@echo off
start "%~f0"
start "%~f0"
2024/12/19(木) 18:24:35.68ID:9yUs11tl
set /pコマンドに空欄のままエンターを押すと強制終了してしまうのですがどうしたらいいでしょうか
set InputPath=%InputPath:"=% をコメントアウトすれば空欄での強制終了は回避できるのですが
今度は""で括られたパスを入力すると強制終了してしまいます

@echo off
set /p InputPath=
set InputPath=%InputPath:"=%

if "%InputPath%"=="" (
set msg=空欄だよ
) else if exist "%InputPath%\" (
set msg=フォルダだよ
) else if exist "%InputPath%" (
set msg=ファイルだよ
) else (
set msg=不明だよ
)

echo %msg%
pause
2024/12/20(金) 00:11:16.18ID:TH9BF58b
>>645
これでbatそのまま?(処理を抜き出したもので元々はループさせたりしてない?)
またpuaseを付けるところを見るにダブルクリックとかで実行?
コマンドプロンプトで複数回実行したりしてない?

まあ説明すると
入力でそのままエンターすると変数にヌル文字が入るわけじゃなくて変数の入力自体をしない
つまり、以前に定義されてた値があればそれがそのまま入ったままだし
未定義なら未定義のままとなる

ループさせるとかなら変数の初期化をするのがいい
set InputPath=
(これでInputPathは未定義となる)
if not defiend InputPath echo msg=空欄だよ
まあ未定義なら
if "%InputPath%"=="" (
set msg=空欄だよ
のままでちゃんと「空欄だよ」となるはずだから直す必要は無いけど

それと
set InputPath=%InputPath:"=% → set "InputPath=%InputPath:"=%"
としないと、入力に a&b などと入れられると問題となる
647645
垢版 |
2024/12/20(金) 01:08:13.42ID:byrLY/tu
>>646
助言ありがとうございます

set InputPath="" を @echo off 直下に追加したところ希望通りの結果が得られました
助かりました!

ちなみにダブルクリックで1回だけ実行しループ処理は入れてません。貼った構文が全てです
2025/01/24(金) 11:47:15.87ID:zMaqlWh1
いつのころからか
cmdhome.lnk
みたいなcmd起動ショートカット作って
アイコン指定してもアイコンが反映されなくなってしまった
Win10なんだけどなんか改善方法ないんだろうか
味気なさ過ぎて悲しい
2025/01/25(土) 04:04:41.46ID:ZawpPmOr
レガシーコンソールじゃないとアイコン反映されないっぽいな
なんで退化してしまうのか
2025/01/26(日) 10:14:52.12ID:QXh9thRU
>>648=>>649なんだろうけど
ちょっと意味がわからんかったわ
画像付きでどうしたいのか説明してくれんかね
2025/01/26(日) 14:54:43.71ID:WMeA3DrY
エクスプローラー再起動で反映されない?
2025/01/26(日) 15:05:23.00ID:4xEs3XpP
バッチでHexからBase58へ変換したい
可能ですか?

参考
learnmeabitcoin.com/technical/keys/base58/
2025/01/26(日) 15:20:12.21ID:atsgMxQf
Base64ならCertUtilでできるがBase58のコマンドはない
そのリンク先にRubyのコードがあるから参考にしたら
2025/02/06(木) 21:17:32.84ID:TFp3Dqlz
batで最も重要な構文
これさえマスターすればどんな複雑な処理も書ける

set tempfn=%temp%\%random%_%random%_%random%.txt

yourcommand "%tempfn%"
or yourcommand > "%tempfn%"

for /f %%i in (%tempfn%) do call :each "%%~i"
del "%tempfn%"
goto :eof

:each
echo eachline:[%*]
goto :eof
2025/02/12(水) 16:52:19.09ID:oMyiCtXq
@echo off & setlocal enabledelayedexpansion & set "h=" & set "b="
set "a=123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
set /p "h=Hex=" & set "c=!h!a" & set "z=%a:~0,1%" & set /a n=0
:1
if defined h (set /a n+=1) else goto 2
set /a "d%n%=0x%h:~-6%" & set "h=%h:~0,-6%" & goto 1
:2
set /a e=0,f=0 & for /L %%i in (%n%,-1,1) do (
set /a "d%%i+=e<<24,e=d%%i%%58,f|=d%%i/=58")
set "b=!a:~%e%,1!%b%" & if %f% neq 0 goto 2
if "%b%"=="%z%" set "b="
:3
if "%c:~0,2%"=="00" set "b=%z%%b%" & set "c=%c:~2%" & goto 3
if defined b echo Base58=%b% & pause
2025/02/16(日) 04:09:02.74ID:Nn6kjJ7X
set
foo.exe
set
としたときにfoo.exe内で書き換えた環境変数を
呼び出し側が取り込むことってできないの?
バッチ同士ならcallで行けるけどそんな感じで
2025/02/16(日) 06:41:06.81ID:51aCbtwK
俺もよく分かってないけど、
環境変数って大本はレジストリに入ってる
で普通は各々のプロセスで環境変数のインスタンスが生成されてそれを弄ることになる
サブプロセスを生成した場合は親の環境がコピーされていてそれを弄ることになる
そうならサブプロセスが終了した後ではもう残っていないことになる
サブプロセス(foo.exe)がどこの環境変数を弄るかによる
それともレジストリを書き換えたのか?
2025/02/16(日) 08:16:27.56ID:nK83B1eq
プロセス終了後に弄った環境変数を取得?
そんなの簡単にできたらセキュリティーホールになりそう
2025/02/16(日) 11:25:20.82ID:51aCbtwK
すごいシステムの下層レベルだと出来る方法があるのかも知れないけど
通常はプロセスは各々独立してて他プロセスのメモリ空間は共有されない
2025/02/16(日) 14:24:06.62ID:51aCbtwK
Linuxだと子プロセスから親プロセスに引き継ぐことができるらしい
(親プロセスが子プロセス生成時に親プロセス側でsourceコマンドを実行)
が、やっぱりWindowsでは無いみたい
https://learn.microsoft.com/ja-jp/windows/win32/procthread/changing-environment-variables
>既定では、子プロセスは親プロセスの環境ブロックのコピーを継承します
>プロセスの作成時に子プロセスの環境変数を変更することは、1 つのプロセスが別のプロセスの環境変数を直接変更できる唯一の方法です。 プロセスは、そのプロセスの子ではない別のプロセスの環境変数を直接変更することはできません。
2025/02/16(日) 14:29:31.27ID:51aCbtwK
なので現実的な方法としては
foo.exeで渡したい情報はファイルか標準出力で親プロセスに渡せばいいと思う
2025/02/17(月) 08:27:15.30ID:oRb3RUoY
無理なのか
何が何でもという事もないので
受け渡し用tempファイルでやることにするよ
サンクス
2025/02/17(月) 23:32:14.20ID:l9ByBUai
for %%A in(*.xlsx *.xls)←ループ処理する時に、
*.xlsと*.xlsxを指定したら.xlsxは2回実行されてしまう。
*.xlsだけ指定すると1回だけ実行される。

含むではなくて、*.xlsで終わるか*.xlsxで終わるものを指定する検索はどうしたら出来ますか?
2025/02/18(火) 00:40:03.94ID:iDsz3WKD
findstrで自己解決しそう、ありがとう兄妹ノシ
2025/02/18(火) 17:36:17.24ID:GcWP7NNv
for %%A in (*.xls?) じゃダメなの?
.xlsaとか.xlsbなんてファイル普通ないでしょ
2025/02/18(火) 17:39:49.38ID:IbEo812m
>>665
*.xlsだけでも同じだぞ
DOSネームとの互換機能だぞ
2025/02/18(火) 18:45:22.20ID:TLR0SIQr
dir /b|findstrよりももしかしたら遅いかもしれんが
for /f "tokens=* delims=" %%i in ('forfiles /m *.xls') do @echo %%~i
2025/02/18(火) 19:16:46.03ID:naPa9y/a
?は付けとけ
環境に依存する
2025/02/18(火) 19:20:25.10ID:TLR0SIQr
要件とは別に.xlsと.xlsxとを区別するものを上げただけ
あとはよろしく
2025/02/20(木) 00:56:47.67ID:OIbQhS2Y
みんなありがとう
後ろに?は全然思いつかなかった。
因みにfindstrは挫折した。

>>667
これは難しくて分からんからもうちょっと調べてくる㌧
2025/02/24(月) 09:10:00.84ID:c2/p8Qwq
フォルダの中に
ファイル名にシングルクォートが入ってるファイルが複数あって
シングルクォートだけ一気に削除する簡単な方法ない?
ファイルの削除じゃなくて
2025/02/24(月) 09:14:41.39ID:K9TE8hB9
powerqueryかな
2025/02/26(水) 03:08:05.14ID:Lge+mbBz
いろいろ調べて、ファイル名の頭に更新日時を付けるバッチファイルを作りました

@ECHO OFF

:LOOP
IF "%~1" EQU "" GOTO :EOF

FOR %%F IN (%1) DO (
FOR /F "tokens=1-3 delims=/ " %%A IN ("%%~tF") DO (
REN "%~1" "%%A.%%B.%%C %%~nxF"
)
)

SHIFT
GOTO LOOP

このbatファイルにmp4動画をまとめてD&Dで
2025.02.26 動画3.mp4
2025.02.24 動画2.mp4
2025.02.15 動画1.mp4
こんな感じで動画ファイルの頭に更新日時が付くようになったのですが、
動画ファイルによっては名前が変更されず 61個中31個 が変更されませんでした。
ものによって更新日時が取り出せないのか、もしくはコードが悪いのか分かる方はいませんか?
バッチファイルを Windows10のテキストで作成して、文字コード ANSIの形式で保存しています。
2025/02/26(水) 03:14:30.37ID:dl6vXEdA
echo on
2025/02/26(水) 06:53:35.41ID:u15kjvGd
ファイル名に点とかスペース入れる奴は絶滅した方が良いと思うの
2025/02/26(水) 06:58:53.12ID:E5xeTX8Z
バッチファイルってD&Dでけるの?
良いこと聞いちゃった㌧

一部ループするのが不思議。
677673
垢版 |
2025/02/26(水) 13:01:30.47ID:Lge+mbBz
動画とバッチファイルを置いてある場所に日本語のパスが入っていたことが名前変更が出来なかった原因でした。
点とスペースを入れても大丈夫みたいでした。
上記のコードは更新日時なのですが、作成日時にしたい場合はどのような記述に変更すればいいでしょうか?
2025/02/26(水) 14:07:44.67ID:FzkkoRDx
dir /tc
for /f のskip=指定
679673
垢版 |
2025/02/26(水) 16:08:26.35ID:Lge+mbBz
>>678どうもありがとうございます。

@echo off
setlocal enabledelayedexpansion

rem ドラッグ&ドロップしたファイルを1つずつ処理
for %%i in (%*) do (

for /f %%a in ('dir /TC ^| findstr "%%~nxi"') do (
set datetime=%%a
)
set y=!datetime:~0,4!
set m=!datetime:~5,2!
set d=!datetime:~8,2!

set setdate=!y!.!m!.!d!_

ren "%%~nxi" "!setdate!%%~nxi"
echo 新しいファイル名 → "!setdate!%%~nxi"
)
endlocal
pause

新しく作り直したバッチファイルなのですが、不具合が出ました。
バッチファイルで作成日時を加えた動画名      実際の作成日時
2023.09.08_動画1.mp4               2022/06/01
2023.09.09_動画2.mp4               2022/06/02
2023.08.19_動画3.mp4               2022/04/10

こんな感じで、実際の日時と違いが出てしまいました。どこが間違っているか分かる人教えてください。
2025/02/26(水) 16:27:38.12ID:FzkkoRDx
どうして未完成中にecho offするの?
echo offは完成後にしろよ
多分findstrで複数の同名のファイルにマッチしてるんだろう
つまり別のファイルの日付を拾ってる
2025/02/26(水) 16:34:20.93ID:FzkkoRDx
又はどれにもマッチしてなくてdatetimeが以前の値を保持してるか
あと
dir /tc "%%~i"
2025/02/26(水) 16:47:49.35ID:FzkkoRDx
あとD&Dでファイルの受け渡しは完全じゃないのに注意
半角空白をパスに含まないかつ全角空白を含む
c:\data\あ い.txt
こういうのだと「c:\data\あ」と「い」の2つに分かれる
2025/02/26(水) 17:22:40.52ID:Lge+mbBz
ネットにあるサンプルコードの一部分を少し変えて試してるだけなので
アドバイスを頂いているのですが全く理解できません。
今のところ 更新日時 = 作成日時 っぽいので

@ECHO ON

:LOOP
IF "%~1" EQU "" GOTO :EOF

FOR %%F IN (%1) DO (
FOR /F "tokens=1-3 delims=/ " %%A IN ("%%~tF") DO (
REN "%~1" "%%A.%%B.%%C %%~nxF"
)
)

SHIFT
GOTO LOOP

更新日時を付けてくれるこれに頼ります。
679に書いたコードが初心者にも理解しやすいサンプルコードっぽかったのですが
ここで聞いたら欠陥だらけ見たいなのでやめときます
半角空白や全角空白や日本語パスの問題は一時的に動画ファイルを移動させて解決させます。
2025/03/07(金) 21:09:01.97ID:VgDCtbBb
バッチとは関係ないけど
たまにエクスプローラーで見ると更新日時のないファイルがあるけど
あれは何なんだろう
右クリックでプロパティを見てもないんだ
2025/03/07(金) 21:12:50.49ID:sd+opADM
>>684
アプリで消したか
違うOSからコピったか
2025/03/07(金) 23:48:55.40ID:qVctmwDB
タイムスタンプが1980/01/01 8:59:59より前だと表示されないだけ
2025/03/07(金) 23:56:21.18ID:qVctmwDB
より前→以前だった
要するに、1980/01/01 9:00:00以降でないと、エクスプローラーで表示されない
2025/03/08(土) 17:00:59.96ID:oOL+XIfI
>>686が正解
2025/03/08(土) 17:01:04.22ID:oOL+XIfI
>>686が正解
2025/03/08(土) 17:05:24.27ID:oOL+XIfI
すまん連投した
1980/1/1 0:0:1以降はプロパティ表示
2025/03/17(月) 15:46:18.20ID:HZpHcb9U
oh my posh for cmdなんてあるんだな
さすがにwtじゃないと駄目っぽいが
2025/04/19(土) 00:45:06.61ID:pkdgLcU5
set str=aaa "dd d"
echo echo1 %str%
echo echo2 "%str%"

call :callecho "%str%"
pause
goto :EOF

:callecho
echo echo3 %1
echo echo4 %~1
echo echo5 %2
echo echo6 %~2
exit /b

二重引用符括ったものを入れ子の構造と認識していない様子
"%str%"で一つの引数とするためには、どのようにエスケープすればいい?
2025/04/19(土) 08:10:38.43ID:738SS3ZO
誰か助けて
今度会社でBOXを採用して共有フォルダを廃止するらしい
batファイルで大量のファイルの移動とかコピーとかしてたけど
ブラウザではめんどくさすぎる
batファイル風に操作する方法ありますか?
2025/04/19(土) 08:17:30.95ID:pYJssLIc
>>693
社内で孤立してたりするの?
2025/04/19(土) 11:32:28.15ID:1418i819
>>692
引数の解釈で分離するから無理
参考までに
set str=aaa "dd d"
echo echo1 %str%
echo echo2 "%str%"

call :callecho str
call :callecho "%%%%str%%%%"
goto :EOF

:callecho
echo echo3 %1
call echo echo4 %%%1%%
echo echo5 %1
call echo echo6 %1
2025/04/19(土) 12:17:01.61ID:1418i819
>>692
絶対使わない文字列に一旦変換するのが良いのかも
call :callecho "%str:"=<”>%"
goto :EOF

:callecho
set arg1=%~1
set arg1=%arg1:<”>="%
echo echo3 %arg1%
2025/04/19(土) 12:35:34.33ID:738SS3ZO
>>694
はい
698692
垢版 |
2025/04/20(日) 16:57:41.77ID:MhuJCbcV
>>695
> 引数の解釈で分離するから無理
無理ですか。わかりました
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況