21/08/26 16:42:40.02 LxJHntSN.net
>>342
%%%%a→%%a
363:デフォルトの名無しさん
21/08/30 09:59:58.73 2ApHZNp2.net
%FILENAME%に空白が含まれたら、最初の空白までが%1になるの当たり前じゃん
これを考え落とすって、8.3時代で頭の更新が止まったままの化石だね
364:デフォルトの名無しさん
21/08/30 10:57:48.15 cyOwxYqr.net
まあ空白とは限らないけどね
365:デフォルトの名無しさん
21/09/01 12:25:22.16 BpsqJM8W.net
複数動画ファイルをバッチにドロップしてH265で再エンコードしたいです。保存先はドロップ元と同じです。自分で作ってみたのですがうまくいきませんでした。改善点を教えてほしいです
@echo off
%~d1
cd "%~p1"
type nul > ./files.txt
SET NAME_1=%~n1
SET NAME_2=%~n2
SET NAME_3=%~n3
SET NAME_4=%~n4
SET NAME_5=%~n5
:start
IF "%~1"=="" GOTO ffmpegstart
IF "%~x1" == ".MP4" GOTO add
IF "%~x1" == ".mp4" GOTO add
GOTO next
:add
echo file "%~1" >> ./files.txt
:next
SHIFT
GOTO start
:ffmpegstart
ffmpeg.exe -i "%~p1files.txt" -c:v libx265 -c:a copy -crf 22 -tag:v hvc1 "%~p1"%NAME_1%""_k_h265.mp4"
pause
ドロップせずに、パスを書いて実行したら成功はしました。
366:デフォルトの名無しさん
21/09/01 12:38:53.45 3LGwAbit.net
たから echo onにしろっつってんだろ
367:デフォルトの名無しさん
21/09/01 16:04:27.85 rR7+iwTB.net
@echo off
:LOOP
if not exist "%~nx1" pause &exit /b
if exist "%~n1_k_h265.mp4" echo ERROR: 出力と同名のファイルが存在します&pause &exit /b
ffmpeg.exe -i "%~nx1" -c:v libx265 -c:a copy -crf 22 -tag:v hvc1 "%~n1_k_h265.mp4"
shift /1
goto :LOOP
368:デフォルトの名無しさん
21/09/01 17:15:47.13 79X4wBHs.net
>>360
ffmpeg.exe文の前にecho を付けて画面表示を見てみろ
質問の前にそれぐらい自分でやれよ
369:デフォルトの名無しさん
21/09/01 17:35:20.23 JwKVF6M3.net
@echo off って完成してからつけるものじゃないのか
最初からあるなんて随分と自信があるんだなぁ
370:デフォルトの名無しさん
21/09/01 17:36:38.68 3SVggb9G.net
だよな
371:デフォルトの名無しさん
21/09/01 21:20:41.59 CWQ1EA8H.net
>>362
ありがとうございます!
372:デフォルトの名無しさん
21/09/01 21:32:18.07 79X4wBHs.net
丸投げ質問はやめてくれ
373:デフォルトの名無しさん
21/09/01 21:55:30.34 t7KCJs9B.net
なんだ、>>362でうまくいったのか
つまりエラーは変換先のファイルが存在しててffmpegでエラーが出たってことだったのか
俺はエラー内容が書かれてなかったんで他のことを考えてたよ
"あい うえお.mp4"とかパスに半角空白が無くて全角空白がある場合とかね
374:デフォルトの名無しさん
21/09/01 21:55:32.25 MGC13/Ge.net
はいw
375:デフォルトの名無しさん
21/09/01 22:51:40.87 79X4wBHs.net
-i のところやろ
376:デフォルトの名無しさん
21/09/01 23:03:16.29 UTT/foLD.net
例えば、デスクトップにショートカットを作る。
コマンドプロンプトを起動して、Ruby スクリプト・a.rb を実行する
リンク先
C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb"
(ただし、書き込めないので、間に@を入れました)
作業フォルダ
C:\Users\Owner\Desktop
例えば、a.rb 内では、以下のようにRubyスクリプト内で、
7zip を起動して、ドロップしたファイルのSHA256 ハッシュ値を求める
command = "C:/Program Files/7-Zip/7z.exe"
option = " h -scrcsha256 "
ARGV.select { |full_path| File.file?( full_path ) } # ファイルのみ
.each do |full_path|
res = `#{ '"' + command + '"' + option + '"' + full_path + '"' }` # コマンド実行
puts full_path + res + ( "-" * 20 )
end
(ARGV は配列で、そこにコマンドライン引数・ドロップしたファイルパスが渡ってくる)
それで、ショートカットに、複数のファイルをdrag&drop すると、
コマンドプロンプトが起動して、各ファイルのハッシュ値が求められる
ただし、空白入りの実行ファイルのパスの前後を、"~" で囲む事で、
Program Files の空白文字も処理できるが、
ドロップしたファイルパスに空白文字があると、
パスの前後を、"~" で囲んでも、エラーになって処理できない
377:デフォルトの名無しさん
21/09/01 23:06:19.43 79X4wBHs.net
突然どうした?
378:デフォルトの名無しさん
21/09/01 23:11:28.11 79X4wBHs.net
ハッシュほしいならcertutilつかえば
379:371
21/09/01 23:21:55.11 UTT/foLD.net
ハッシュ値を求めるのは、単なる例え。
ffmpeg の代わりに使っただけ
Ruby スクリプト内で、別のプログラムを呼ぶと、
ドロップされたファイルパス内の空白文字で、はまると言うこと
380:デフォルトの名無しさん
21/09/01 23:24:46.32 RTATUgNE.net
こんなところにまでruby基地がw
381:デフォルトの名無しさん
21/09/02 09:08:23.07 7LFIE/54.net
偉ぶりたい底辺コーダーや引きこもりがここぞとばかりにワラワラとw
382:371
21/09/02 11:56:43.51 SBJQlu/e.net
>>371
に書いたように、コマンドプロンプトから、Ruby スクリプトを起動する方法では、
ドロップしたファイルパスに空白文字があると、バグる
PowerShell から、Ruby スクリプトを起動する方法では、
ドロップした複数のファイルパスを渡す方法が分からない
結局、以下のように、Ruby スクリプトを直接起動する方法では、
空白文字でも、複数のファイルパスでも、バグらない
ショートカットのリンク先
C:\Ruby25-x64\bin\ruby.exe C:/Users/Owner/Documents/a.rb
puts ARGV # ドロップした複数のファイルパスの配列
sleep # 出力したコマンドプロンプト画面を閉じないようにする
383:デフォルトの名無しさん
21/09/02 12:14:08.51 ctEO1PZh.net
既視感あると思ったら >>156 に同じようなのがあるね
書き方似てるし >>362 と同じ人なんだろうか
start の有無の違いはなんで?
384:デフォルトの名無しさん
21/09/02 12:46:43.02 6AISeI88.net
>>360
>>362
すみません、複数ファイルドロップしたら1つ目しかできませんでした!
あと、自分は全くプログラミングの勉強してなくて検索したものをツギハギでつくってるのでechoがどうとかよく分かってなかったです
echoをonにするとどうなんですか?
385:デフォルトの名無しさん
21/09/02 13:31:10.74 ctEO1PZh.net
>>379
URLリンク(www.google.com)
1ページ目に表示されてるサイト全部巡って読めば少しは分かるようになると思うよ
386:371
21/09/02 13:39:27.82 SBJQlu/e.net
Ruby では、>>377
に書いたように、起動引数・ARGV は配列で、
そこに、ドロップした複数のファイルパスが入ってくる
出力
C:\Users\Owner\Documents\x
C:\Users\Owner\Documents\あ.txt
フォルダx と、ファイル・あ.txt
387:デフォルトの名無しさん
21/09/02 13:48:04.44 siHMRGTz.net
>>378
知らないけどffmpegが終わるまで待ちたいのでは
388:デフォルトの名無しさん
21/09/02 14:17:42.40 D5kjhyGc.net
>>379
前の質問もそうだが、どうして現象を説明しないの?
俺らが君のPCの画面やファイルを眺められるわけないじゃん
エラーなら、入力した内容やファイル内容やどこまで実行されててどういう状態になってるとか書かないとわからんだろ
あと362なら先頭行を削除して実行すればpauseで終了時点の状態がわかるだろ
389:デフォルトの名無しさん
21/09/02 14:24:25.53 D5kjhyGc.net
あと一個とか言ったけど、以前エラーになったオペレーションだと正常になったけど
新たに別のケースが出てきたってことか?
それとも以前エラーになったものは試してないってことか?
即答でありがとうなんて書けばこっちは正常になったと勘違いするだろ
あと、エラー状態は>>368の場合に該当しなかったということでいいか?
390:デフォルトの名無しさん
21/09/02 15:55:55.97 e/2zM0cp.net
>>379
コピペったバッチはShiftJISで保存した?
ドラッグ&ドロップするファイルの上位ディレクトリの名前かファイル名に半角スペースを含めてもう一度試してみ
ファイルやパスにShiftJIS外の文字や記号を含んでいるなら削除
それでもダメだったらファイル類を「パスのコピー」してここに貼ってみな
391:デフォルトの名無しさん
21/09/02 19:03:44.33 lSTkj0Rg.net
>どうして現象を説明しないの?
馬鹿につきあって解答する馬鹿がいるからです
392:デフォルトの名無しさん
21/09/03 08:16:34.23 61QsYzlD.net
echoを理解できない初心者に説明しろと言っても無理
393:デフォルトの名無しさん
21/09/03 08:53:30.59 VqiIv6Pi.net
え、ちょっw(echo)
394:デフォルトの名無しさん
21/09/03 19:05:48.55 nhGnJ2O1.net
素直にコード貼るだけ全然優良でしょ
オレオレ用語使う、コード端折る、妙にプライドがある奴はマジで神経擦り減る
395:デフォルトの名無しさん
21/09/04 00:32:37.15 ExeocnPJ.net
ほんとにな
完全同意だわ
396:デフォルトの名無しさん
21/09/04 08:48:55.08 fYT9QIuD.net
echoなんてデバッグ用に変数の値を見たくなったときにでも覚えたら良いさ
397:デフォルトの名無しさん
21/09/05 20:59:18.22 h9G3o9Tj.net
USBデバイス(マイク)の有効/無効を切り替えるバッチファイルを書いているんですが、
forループ内でファイルパスを展開してコマンドを実行する部分で躓いています。
()内での %DEVCON% (devcon.exeの絶対パス)の展開部分ですが
''や、usebackqを使用して``とすると、にすると半角スペースごとに別文字列として展開される
``にすると絶対パスの先頭に`が付いたパスとして認識され、ファイルが見つからないエラーになる
forループの()内で変数を展開してコマンドを実行する方法が分かりません。
以下が作成したファイルの内容です。ご教示お願いします。
@echo off
:: devcon.exeのパス(64bit)
@set DEVCON="C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe"
:: マイクの無効と有効
:: AT2020USB+
:: %DEVCON% disable "USB\VID_0909&PID_001C&REV_0100&MI_00"
:: %DEVCON% enable "USB\VID_0909&PID_001C&REV_0100&MI_00"
FOR /F "tokens=3 usebackq" %%a IN (`%DEVCON% status "USB\VID_0909&PID_001C&REV_0100&MI_00" ^| find "Driver is"`) do set "STATUS=%%a"
IF "%STATUS%" == "running." (
%DEVCON% "USB\VID_0909&PID_001C&REV_0100&MI_00"
) ELSE (
%DEVCON% enable "USB\VID_0909&PID_001C&REV_0100&MI_00"
)
398:392
21/09/05 21:01:57.75 h9G3o9Tj.net
抜けがありました
14 %DEVCON% "USB\VID_0909&PID_001C&REV_0100&MI_00"
14 %DEVCON% disable "USB\VID_0909&PID_001C&REV_0100&MI_00"
399:デフォルトの名無しさん
21/09/05 21:50:58.36 qFDUcsKU.net
カレントフォルダをC:\Program Files (x86)\Windows Kits\10\Tools\x64 に移動してから
set DEVCON="devcon.exe" にしてみるとか
400:デフォルトの名無しさん
21/09/05 22:12:50.15 GdXH1yQe.net
>>392
FOR /F "tokens=3" %%a IN ('^"%DEVCON% status "USB\VID_0909&PID_001C&REV_0100&MI_00" ^| find "Driver is"^"') DO set "STATUS=%%a"
401:デフォルトの名無しさん
21/09/05 22:17:55.22 GdXH1yQe.net
>>392
あるいは>>392のFOR文のままで
@set DEVCON=C:"\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe"
402:デフォルトの名無しさん
21/09/05 23:48:28.37 UFxCuC9Y.net
漏れは、ショートカットにDrag and Drop してみた結果、
結論として、コマンドプロンプトでは、ファイルパス中の半角空白を処理できない
PowerShell(PS)でも難しいかも
漏れは結局、Ruby を使っている
特に、コマンドプロンプトだけはやめて、PSを使った方が、マシかも
403:デフォルトの名無しさん
21/09/05 23:54:22.00 GdXH1yQe.net
上のはそういう話じゃない
404:デフォルトの名無しさん
21/09/06 00:15:22.61 x7bnJBcc.net
>>396
両端に"がこなくするってのはアイデアだな
405:392
21/09/06 02:00:45.36 y69jRxqh.net
>>395-396
ありがとうございます!できました
406:デフォルトの名無しさん
21/09/06 07:15:12.30 yJI9//ND.net
ほえ~、横からだけど目からウロコだわ >>396
為になった、さんきゅう
407:デフォルトの名無しさん
21/09/17 15:37:36.70 gyqQtjrG.net
質問です。
メモ帳に「移動元のファイルの場所 移動先のファイルの場所」が絶対パスで半角スペースで区切られています。
これを読み込み指示通りにファイルを移動させたいのですがどのように書くといいでしょうか?
また、リネームする必要があるファイルもあるのですがどうするといいでしょうか?
「C:\aa\bb.jpg D:\aa\cc.jpg」
408:デフォルトの名無しさん
21/09/17 17:20:03.57 i/XCCF5h.net
forで読んでmoveで移動
もしechoの分からない人ならやめとけ
409:デフォルトの名無しさん
21/09/17 22:37:54.43 vaLPoEyz.net
「for バッチファイル」でググって訳がわからないようなら 、適当なエディタで開いて、" でくくるのを前提に
行頭、スペースとドライブ文字、行末、を置換してbatファイルとして名前を付けて保存
move "C:\aa\bb.jpg" "D:\aa\cc.jpg"
みたいになるように
なを、ファイル名にsjis
410:じゃない何かが無い前提
411:デフォルトの名無しさん
21/09/17 23:29:19.93 O1PoA15N.net
バッチは、ややこしい。
Power Shell, Ruby などでやれば?
それに、そのファイルは半角空白で区切っているけど、
Windows では、ファイルパスに半角空白も入るから、バグるので、
普通に、CSV 形式にすると良い。
その代わり、CSVパーサーが必要になるけど
タブ区切りのTSV も良い。
さすがにタブ文字・改行コードは、ファイルパスには入らないだろうから、簡単に取り出せる
412:デフォルトの名無しさん
21/09/18 00:13:27.23 q5iJ5tLu.net
for /f "tokens=1* delims= " %%a in (List.txt) do (
set ERR=
if not exist "%%~a" set /a ERR+=2
if exist "%%~b" set /a ERR+=1
if not defined ERR (move "%%~a" "%%~b") else call echo ERROR:%%ERR%% "%%~a" "%%~b">>errlog.txt
)
pause
413:デフォルトの名無しさん
21/09/18 06:22:21.02 KTV+OCDB.net
横からすまんが半角スペース入りパスだとダメだよそれ
414:デフォルトの名無しさん
21/09/18 06:34:39.03 KTV+OCDB.net
移動先フォルダがないとmdで作成してやらんとエラーになるし
移動先に同名の既存ファイルがあるかも知れないし
415:デフォルトの名無しさん
21/09/18 07:21:16.02 ALBIVGfh.net
いちいち横からイチャモン言う間あったらおまえがサクッと書いて貼れば済む話
ksの典型
>>402 が言ってもないことまで至れり尽くせりしてやる必要ねーだろ
416:デフォルトの名無しさん
21/09/18 08:54:34.49 d7JASW2c.net
>>402です。
うまくできました。
半角スペースや日本語などは使われていませんでした。
分からないところはググりながらやってみます。
ありがとうございました。
417:デフォルトの名無しさん
21/09/18 11:01:52.40 7qS0Ehxx.net
書き捨てにするようなコードを「かも知れない」で必要以上無駄に肥大化させるのはゴミ屋敷住人と同じ愚かな思考
418:デフォルトの名無しさん
21/09/18 12:50:48.70 1ehO0L4U.net
世の中にはプログラムすること自体が好きな人がいるんだよ
誰もが間違いなくその恩恵にあずかっているのに小馬鹿にするやつは
自分への軽蔑の視線に気付かない愚か者だ
419:デフォルトの名無しさん
21/09/18 21:08:19.94 OLaJCV9P.net
恩恵w
言い訳が論点ズレてく感じホンモノのガイジ臭
420:デフォルトの名無しさん
21/09/18 21:14:40.28 PJ3Z1C6G.net
こんなスレで一体、何を争う?
421:デフォルトの名無しさん
21/09/18 21:22:43.49 gRgRQYIa.net
別にこのスレでも書いてれば気にもとめないけどね
ただ今回はコードも貼らずに注文だけ言ってたからカチンとくる奴もいるだろうさ
422:デフォルトの名無しさん
21/09/19 03:42:58.81 uWgOxiqk.net
つまり自分は書けないクセに「プログラムすること自体が好きな人」とやらにネタを提供してやってるんだと
そして自分のお陰で皆が恩恵に預かれるのだから自分は良い行いをしているんだと言いたいワケか
おいおい何様だよw
423:デフォルトの名無しさん
21/09/19 06:31:47.09 K9vn79WO.net
C++と違ってideoneみたいのないからな
424:デフォルトの名無しさん
21/09/19 09:03:44.20 xPOv8IOw.net
空白付ならデリミタを:にしてツギハギでいけそう
425:デフォルトの名無しさん
21/09/19 12:51:30.97 /yxUr6Cy.net
rm -f /
だよって教えればいい
426:392
21/09/20 00:58:53.63 we+8yYct.net
-rfじゃないとほとんど何も消えないでしょ
427:デフォルトの名無しさん
21/09/22 13:43:55.48 KUdKcr1X.net
今時バッチなんて書いてるのは物好きです
おれは物好き
バッドノウハウ大好きだ♥
428:デフォルトの名無しさん
21/09/22 15:39:53.65 oingLDSY.net
バッチの利点
バッチ自体はウィルスにやられない
みんな違うから狙われにくい
429:デフォルトの名無しさん
21/09/22 18:39:59.79 1Sr76Ukf.net
ウイルスは知らんがランサムウェアで暗号化されてナイナイはされるんじゃね?
430:デフォルトの名無しさん
21/09/22 19:49:34.87 HbYg107O.net
これでバッチつくればいいぉw
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
431:デフォルトの名無しさん
21/10/13 18:17:21.36 HAnV1WZK.net
バッチ
432:デフォルトの名無しさん
21/10/13 18:25:53.79 HAnV1WZK.net
バッチの作り方聞きたくてコメントを書きこうもうとしたら、
433:デフォルトの名無しさん
21/10/13 18:26:29.06 HAnV1WZK.net
>>426
あれ、つづき・・・
434:デフォルトの名無しさん
21/10/13 18:29:35.54 HAnV1WZK.net
>>427
質問かこうとして、バッチのイメージを書くとなぜか、ERRORで弾かれる
435:デフォルトの名無しさん
21/10/13 18:36:10.32 Veybj1d9.net
cmd .exeを書いたとかそんなことか?
436:デフォルトの名無しさん
21/10/13 18:45:56.14 bhMjP/u8.net
作り方w
そこから?
437:デフォルトの名無しさん
21/10/13 18:47:46.52 HAnV1WZK.net
FOR DO
438:デフォルトの名無しさん
21/10/13 18:48:57.34 HAnV1WZK.net
しつれいしました。
fo do型式の構文を書いたらerrorになってしまう・・・
439:デフォルトの名無しさん
21/10/13 18:49:34.04 HAnV1WZK.net
for do型式でした
440:デフォルトの名無しさん
21/10/13 18:51:20.12 mAb+BQMQ.net
for /?
これ以上の説明は掲示板では不可能だからな
441:デフォルトの名無しさん
21/10/13 20:37:11.25 wdMk643f.net
ここはコマンドインジェクション対策が入ってるからコード載せたいならgistとかに上げてそのURL貼ったほうが良い
442:デフォルトの名無しさん
21/10/13 20:51:02.94 NsQsq1qz.net
for /L %i in (0.5=1=11) do echo %i
443:デフォルトの名無しさん
21/10/13 21:17:55.30 NsQsq1qz.net
cmd.exe /c command
444:デフォルトの名無しさん
21/10/14 02:43:30.00 TuHqoxKX.net
set /a a=b=c=0
こんな風にまとめて初期化出来るのは知ってたけど
set /a "c=(b=(a=400>>2)/25)>>2, a-b+c"
こんな書き方が出来る事に今更ながら気付いた
445:デフォルトの名無しさん
21/10/15 20:24:48.38 NLG7IfQt.net
UUエンコードしたらダメかな
446:デフォルトの名無しさん
21/10/15 21:13:25.70 53pJc6NQ.net
Base64の方がいいんじゃね
certutilで変換できる
447:デフォルトの名無しさん
21/10/15 22:55:44.35 NLG7IfQt.net
書込みテスト
C:\>certutil -f -encode in.bat in.b64
C:\>certutil -f -decode in.b64 out.bat
C:\>type in.b64
-----BEGIN CERTIFICATE-----
ZWNobyBoZWxsbyB3b3JsZA0K
-----END CERTIFICATE-----
C:\>
448:デフォルトの名無しさん
21/10/17 13:44:53.76 0LRNIe6v.net
>>440
certutil、知らなかった
whereしてみたらあった
449:デフォルトの名無しさん
21/10/17 17:19:52.54 R7AYOhq0.net
データだけのやつ
C:\>certutil -f -encodehex in.bat in.b64 1
C:\>certutil -f -decodehex in.b64 out.bat 1
C:\>type in.b64
ZWNobyBoZWxsbyB3b3JsZA0K
コマンド文の最後の1を4とか12にすると16進数
450:デフォルトの名無しさん
21/10/17 19:11:59.67 PSl5tmbR.net
444
451:デフォルトの名無しさん
21/10/19 15:20:48.60 RYpZUHHW.net
>>443
恥ずかしながら初めて知った
便利
452:デフォルトの名無しさん
21/10/21 01:56:17.90 3qM4VvHD.net
ダブルクリックで実行した時は最後にpauseしたいけどcmd.exeからコマンド打って実行した時はpauseを省きたい
ダブルクリックはショトカから実行するようにしてショトカに目印の引数を付けておくというのは思い付いたんだけど
それ以外、バッチ自身に判定させる方法ってありますか?
453:デフォルトの名無しさん
21/10/21 02:36:48.27 /W0Foxxl.net
>>446
起動時の引数をそのまま参照する非公式変数を見るとかで判別できるんじゃないかな
%cmdcmdline%
454:デフォルトの名無しさん
21/10/21 02:55:46.15 /W0Foxxl.net
記憶違いだった
cmd.exeを起動したオリジナルコマンドラインだ
それに非公式でもない
455:デフォルトの名無しさん
21/10/21 02:58:42.54 lVKoKJNl.net
@echo off
set a=%cmdcmdline%
echo hello
if /i not "%a:~1,1%"=="c" pause
456:デフォルトの名無しさん
21/10/21 03:54:49.34 3qM4VvHD.net
>>447-449
うひょw聞いて見るものですね。マジ感謝!
%cmdcmdline:~1,1%でセットせずとも行けるっぽいです
ありがとうございました
457:デフォルトの名無しさん
21/10/21 04:07:05.64 lVKoKJNl.net
>>450
%cmdcmdline:~1,1%
それやると、それ以降%cmdcmdline%の値が何故か変わるぞ
それ以降に%cmdcmdline%を参照しないなら問題ないがね
458:デフォルトの名無しさん
21/10/21 04:29:14.76 3qM4VvHD.net
>>451
謎な挙動しますね
echo %cmdcmdline%
として見てcmdから実行すると二度目の実行時に C となって3度目は echoはオフです となりました
if /i not "%cmdcmdline:~1.1%"=="c"
とする度にまるで
set "cmdcmdline=%cmdcmdline:~1.1%"
としてるかのような
こうならない為にわざわざ一旦setしてたんですね
なるほどです
459:デフォルトの名無しさん
21/10/21 08:32:44.52 lVKoKJNl.net
setlocal & if "%cmdcmdline:~1,1%"==":" pause
460:デフォルトの名無しさん
21/10/23 20:34:55.19 ChfdQawL.net
自分を起動した親プロセスを特定すればいいのでは
ダブルクリックならexporer.exeになるはずだしcmd。exeならcmd。exe…なのか?
461:デフォルトの名無しさん
21/10/24 03:28:13.19 3uu+VZsn.net
変数が壊れてもいいなら>>453でいいやろ。ただしsetlocalはいらん。
このif条件式だとcmd画面の2度目でも失敗しない。環境によるけど。
別変数に代入してもいいが中に&等の文字あるとエラーでこける。
462:デフォルトの名無しさん
21/10/24 22:27:44.50 jz1DejpB.net
非公式変数で解決とか後々禍根を残しそうで嫌だな
463:デフォルトの名無しさん
21/10/25 01:03:08.48 vrczGOVO.net
では禍根を残さないバッチを頼む
464:デフォルトの名無しさん
21/10/25 01:10:34.48 dZV3Jc+L.net
非公式発言は撤回してるけど?
465:デフォルトの名無しさん
21/10/29 21:51:58.64 PNXAVzCe.net
windowsで半角空白や&付ファイル名が許可されてるんだから
バッチファイルにD&Dやsendtoした時の
半角空白とか&の扱いはWindows側で何とかして欲しいなと思う。
466:デフォルトの名無しさん
21/10/29 21:54:07.20 tTd8I1wO.net
バッチファイルに変換される言語&コンパイラ
URLリンク(github.com)
467:デフォルトの名無しさん
21/10/29 23:50:23.91 +3zqc/Sp.net
>>459
これも%cmdcmdline%を参照して処理するしかない
468:デフォルトの名無しさん
21/10/30 01:01:41.85 ZgBEU8E6.net
&はわざとそういう仕様にしたんだろうけど全角空白については、んなもん知るか。なんだと思う
コマンド類もANSIしか想定してないし
日本語ヘルプの間違いを正さないのも、敢えて、だろうね
毛唐共は底意地悪いというか強く出ないと何もしない
大人しくしてるととことん図に乗りナメくさる
欠陥あっても買ってくれて文句も言わず泣き寝入りしてくれるチョロい鴨としか思ってない
469:デフォルトの名無しさん
21/10/30 01:07:02.66 ShH7fSCq.net
半角空白はまだしも、全角空白はいただけない
470:デフォルトの名無しさん
21/10/30 01:43:02.15 Y+svLIx5.net
cmdcmdlineを見て全部の引数に引用符を付ければいい話では
471:デフォルトの名無しさん
21/10/31 00:05:13.37 VJFi2hrE.net
>>464 引用符付引数表示バッチ(D&D,sendto用),拡張子はbat
@echo off & set a="%cmdcmdline:"=" "%"
for %%i in (%a:*t"=%) do if not %%i=="" set b=%%i& call :x
pause & exit
:x
if "%b:~1,1%"==" " set b=%b: =" "%
for %%j in (%b%) do if not %%j=="" echo %%j
472:デフォルトの名無しさん
21/10/31 15:03:24.36 6z99IB+f.net
自分も結局cmdcmdline読んで置換して置換して
最後のファイルパス部分だけ""で囲みなおすとかいう技で何とかした。
けど空白&付ファイルを管理者権限オプション付けたショートカットにsendtoしたら
””の付き方の関係でコマンドエラーになってそもそも
バッチファイルすら動かせないのはどうしようもなかった。
473:デフォルトの名無しさん
21/10/31 16:14:17.42 C3Zqy8ME.net
普通のファイル名に&を使うのがバカ
&使うのはトリッキーな動作させる時だけ
474:デフォルトの名無しさん
21/10/31 16:59:09.50 VJFi2hrE.net
>>466
管理者権限ではダメだね
起動しないのでバッチを弄っても意味がない
べつに & が無くても半角空白だけでもダメ
pauseだけのバッチでも起動しない
475:デフォルトの名無しさん
21/11/01 06:54:23.99 jadZUHdf.net
引数を取得してからショートカットにまわせばいいんじゃね
start kanri.lnk 引数
476:デフォルトの名無しさん
21/11/01 08:07:56.06 jadZUHdf.net
だめやな
引数に"が一個でもあるとこけるわw
477:デフォルトの名無しさん
21/11/01 08:27:08.38 jadZUHdf.net
変数もあかんしファイルで渡すしかなさそうやな
478:デフォルトの名無しさん
21/11/01 12:50:11.96 QjI9xm4a.net
自分が使うバッチにファイル群なら運用回避で何とでもなるんだけど
会社の共有フォルダとかだとなんて皆使えるように使うしどうしてもな。
まあどうしようも無ければ最後はルール化して
半角全角空白記号周りのファイル名をリネームするツール回すのみだな。
479:デフォルトの名無しさん
21/11/02 11:39:54.98 cNrRrDlB.net
>>468
ファイル名じゃなくても&付きのURLってたまに処理対象になるし
480:デフォルトの名無しさん
21/11/03 10:25:06.03 /m7gndnZ.net
>>466
1.バッチのショートカットを作成
2.「管理者として実行」に設定
3.リンク先の先頭にcmd /c を追加する
適用したらcmdはフルパスに変換される
これで動作するはず
管理者権限が不要ならcmd /c も不要
というかバッチに直接D&D,sendtoでもOK
481:デフォルトの名無しさん
21/11/03 12:58:10.31 /m7gndnZ.net
>>474は一般的な話だが
>>465の場合の管理者権限ショートカットは
リンク先はバッチファイル名を引用符で囲む必要あり
cmd /c c:"\hoge.bat"
最初の引用符の位置に注意
バッチの中で t" を参照してるので消えないようにするため
482:デフォルトの名無しさん
21/11/03 20:10:42.41 /m7gndnZ.net
>>474-475
こんな面倒なことする必要ないわ
バッチのフルパスに半角スペースがあればいいのか
管理者権限にするだけだな
483:デフォルトの名無しさん
21/11/03 20:29:31.22 /m7gndnZ.net
フルパスじゃないな
バッチファイル名に半角スペースか
よくわからん
484:デフォルトの名無しさん
21/11/06 21:15:51.20 INMdaaG1.net
set j=.body.playback
for /f "usebackq" %%a in (`curl %h%^|jq -r %j%.video_link[-1].url`)do set m=%%a
for /f "usebackq" %%a in (`curl %h%^|jq -r %j%.title`)do set t=%%a
2回もJSONに参照するのが嫌だから、1回で格納したいんだけどforを1回で回して2つ格納って出来ます?
485:デフォルトの名無しさん
21/11/07 00:37:39.03 U3IH/L/8.net
>>478
ちょっとjqを調べてみたら、いくつか使える候補が見つかった
batで使いやすいのは結果が1行で出力されるもの \(),join(""),@csv
for文で、\()とjoinは任意の区切り記号、csvは区切り記号として[,]の3つを指定する
また複数行の出力場合は擬似配列変数に代入するとかでできる
【例】
長いので、入力が{"a":{"b":"foo","c":"bar","d":"baz"}}とした場合 (※.a.bは.a|.bでも良い)
1) \()
for /f "usebackq tokens=1-2 delims=," %%i in (`curl ~^|jq -r ".a|""\(.b),\(.d)"""`) do (
set m=%%i
set t=%%j
)
2) join("")
for /f "usebackq tokens=1-2 delims=," %%i in (`curl ~^|jq -r "[.a.b,.a.d]|join("""","""")"`) do (
3) ,での出力
setlocal EnableDelayedExpansion
set n=0
for /f "usebackq tokens=*" %%i in (`curl~^|jq -r ".a.b,.a.d"`) do (
set d!n!=%%i
set /a n+=1
)
echo;%d0%
echo;%d1%
endlocal
486:デフォルトの名無しさん
21/11/07 01:01:53.46 U3IH/L/8.net
4) @csv
for /f "usebackq tokens=1-2 delims=," %%i in (`type test.json^|jq -r ".a|[.b,.d]|@csv"`) do (
set m=%%~i
set t=%%~j
)
あ、-cというのも見つけた
5) -cで配列を出力
for /f "usebackq tokens=1-2 delims=[,]" %%i in (`type test.json^|jq -c ".a|[.b,.d]"`) do (
set m=%%~i
set t=%%~j
)
487:デフォルトの名無しさん
21/11/07 01:58:35.64 DID0sM5T.net
for /f "tokens=1-2 delims=," %%a in ('curl %h%^|jq %j%.video_link[-1].url,%j%.title') do set "m=%%~a"&set t=%%~b
みたいな感じで
jqの方よく分かって無いけど、カンマ区切りで両方の要素フィルタリングしてforでトークンとカンマをデリミタ指定してやれば行けそう
だけど要素にカンマが含まれてたら失敗するかも
次案
for /f "delims=" %%a in ('curl %h%') do (
for /f "usebackq" %%b in (`echo %%a^|jq -r %j%.video_link[-1].url`)do set m=%%b
for /f "usebackq" %%c in (`echo %%a^|jq -r %j%.title`)do set t=%%c
)
488:デフォルトの名無しさん
21/11/08 16:25:54.29 Px/K8tF9.net
moveで移動するときに
指定したフォルダがないときに自動で作るとかできんの?
489:デフォルトの名無しさん
21/11/08 17:08:44.21 Wv1BXJs6.net
存在しないとリネーム
存在するとその下に移動
結果が全く違う
エラーも出ない
確認もない
たちの悪い仕様
490:デフォルトの名無しさん
21/11/08 21:36:39.36 Ev0WzRyD.net
>>479-481
ううーむ、どっちもダメだった
うまい方法は無いかー
491:デフォルトの名無しさん
21/11/08 22:36:27.76 z+jTzavH.net
>>484
どういうふうにダメなの
カンマが文字列に入ってたのなら区切り文字列を別の使われてないものにすればいけると思うけど
また3)でもいけるはずだが
492:デフォルトの名無しさん
21/11/08 22:40:00.92 z+jTzavH.net
ただ、常にダブルクォーテションで括ってやって、外さないように制御したほうがいいよ
urlによく付いてくるクエリーとかだとパラメータを&で区切って書くので
""を外すと何かとやりにくいはず
493:デフォルトの名無しさん
21/11/08 22:55:02.48 hhTd8ytG.net
うまいも何も恐らくjqコマンドの書き方の問題でしょ
494:デフォルトの名無しさん
21/11/08 22:59:09.33 Ev0WzRyD.net
すまぬ、「またまたー」と思いながらやり直したら普通に動きましたw
一応、>>479-480の例1と5で試したらしっかり動きましたw
495:デフォルトの名無しさん
21/11/09 00:35:07.87 QL8KoTXD.net
>>488
5)は区切り文字が3つもあって、どれかがurlのクエリーに使われるかもしれない
またtokens=1-2はtokens=1*にすれば2つ目(.title)にはカンマがあっても大丈夫になる
で、一番いいと思うものが区切り文字としてTABを使うもの
(まず、urlやtitleにTABコードは使わないだろう)
6) @tsv
for /f "delims=N" %%I in ('cmd /u /c echo 三') do set TAB=%%I
for /f "usebackq tokens=1* delims=%TAB%" %%i in (`type test.json^|jq -r ".a|[.b,.d]|@tsv"`) do (
set x="%%i"
set y="%%j"
)
496:デフォルトの名無しさん
21/11/09 19:41:28.06 5mYjFh+F.net
バッチファイルでコマンドプロンプトを起動して
C:\>hoge
というふうに「hoge」が入力された状態にしたいんですけどどうすればいいでしょうか
cmd /k の後がわかりません・・
497:デフォルトの名無しさん
21/11/09 20:43:47.12 pDzmJqw9.net
@cmd.exe /k "prompt C:\$Ghoge"
「入力された状態」はahkとか使わないと無理じゃないかな
498:デフォルトの名無しさん
21/11/10 01:27:11.48 f
499:aifycsG.net
500:デフォルトの名無しさん
21/11/10 02:45:03.95 lbp+J88v.net
hoge はコマンドで、途中まで入力された状態にしたいとく汲み取れるんだが
501:デフォルトの名無しさん
21/11/10 02:56:31.36 eLi1lwzp.net
コマンドの入力が面倒ってだけなら
doskeyで適当なエイリアスを設定するだけでも十分な気が
502:デフォルトの名無しさん
21/11/10 07:20:19.97 v4FfRZjw.net
あるデバイスが抜いてさし直さないと読み込めません
コマンドプロンプトで刺してある状態を解除して読み込め直すことは出来ないですか?
503:デフォルトの名無しさん
21/11/10 07:40:32.85 ZzX9Joeo.net
devconでできない?
504:デフォルトの名無しさん
21/11/20 17:53:21.19 KiGzNUkt.net
質問です。
やりたいことは
「エクスプローラーで選択したフォルダをショートカットキーを使って指定したフォルダに移動」
です。
BATファイルがショートカットキーで使えるようなので
これをなんとか使えないか調べたのですがわかりませんでした。
私のやりたいことは可能でしょうか?
505:デフォルトの名無しさん
21/11/20 21:04:55.50 mzO+cRkE.net
>>497
>BATファイルがショートカットキーで使えるようなので
そこの情報源に当たればいいじゃん
506:デフォルトの名無しさん
21/11/20 23:01:39.27 785tmrzC.net
バッチ(コマンド)だけでは無理
VBか何かで「エクスプローラーで選択」のアイテムのパスを取得出来れば可能
この辺で聞いてみたら?
VB.NET質問スレ(Part44)
スレリンク(tech板)
【VBScript】WSHについて話し合うスレ【JScript】
スレリンク(tech板)
素直に選択して右クリで「送る」するならバッチでも出来る、がCtrl+X,Ctrl+Vと手間は大して変わらん
どうしてもショートカットキーワンアクションでってならエクスプローラー諦めてそれが出来そうなファイラー探す方が早い
507:デフォルトの名無しさん
21/11/21 14:03:31.46 /SaMuAE1.net
OSに現在誰がログインしてるかSYSTEM権限のタスクのバッチから取得したいと考えてます。
ログイン中のユーザー自体はquery userコマンドで拾えることが判ったのですが、
他にもっと適当なコマンドがあったら教えてください。
508:デフォルトの名無しさん
21/11/21 14:26:02.18 /CZTlOFO.net
ナメすぎやろおまえ
知恵袋にでも逝けks
509:デフォルトの名無しさん
21/11/21 16:35:41.72 /hna8FyN.net
%USERNAME% ではだめなのか
510:デフォルトの名無しさん
21/11/21 16:48:36.14 h4R7LYQM.net
usernameってローカルログオンしてるユーザーだけじゃななかったっけな?
system権限のbatっていうのが何なのか曖昧だけど
アカウントユーザー名のSYSTEMのことだったらダメなんじゃないか?
511:デフォルトの名無しさん
21/11/21 16:54:31.46 h4R7LYQM.net
あと結果をecho表示させようとしてもSYSTEMからユーザーの画面に表示はされないので注意(ウィンドウが表示されない)
512:デフォルトの名無しさん
21/11/21 16:57:22.70 h4R7LYQM.net
念のためechoだけじゃなくNotepad等アプリ起動してもユーザー画面には現れないということ
513:デフォルトの名無しさん
21/11/21 17:20:15.98 h4R7LYQM.net
スタンドアローンPC(普通の人の環境)で試してみた
%username% → PC名$
query user → 誰かがログインしてれば、ログインしてるローカルユーザー1人のみ
サーバーだとおそらくユーザー全員のリストが出るのかな?
514:デフォルトの名無しさん
21/11/21 20:59:58.20 q48e3mil.net
query userの何が気に入らないのかを教えてくれないと
515:デフォルトの名無しさん
21/11/22 11:48:10.21 HBTqNirT.net
>>506
普通の人の環境ではそもそも query コマンド自体が無かったりするが…
516:デフォルトの名無しさん
21/11/22 19:01:18.96 YF/SUs6n.net
whoamiコマンドの結果では、systemが表示される
ダメってことだが一応報告まで
517:デフォルトの名無しさん
21/11/22 19:11:59.58 YF/SUs6n.net
さらにset userだとコンピュータ名になる
518:デフォルトの名無しさん
21/11/23 08:52:09.04 v39GCTAR.net
net session >nul 2>nul && goto super_user
519:デフォルトの名無しさん
21/11/23 18:33:43.80 tf0m1Q47.net
Driver Booster というアプリがあります。これを (バージョンに関わらず) バッチファイルから起動したいと思います。
このアプリは C:\Program Files (x86)\IObit\Driver Booster\(バージョン番号)\DriverBooster.exe が実行ファイルです。
この (バージョン番号) 部分によらず起動するために、実行ファイル DriverBooster.exe を検索して起動しようと
以下バッチファイルを書いてみましたが、肝心のファイル検索がうまく行きません。どうしたらよいでしょうか
cd /d "C:\Program Files (x86)\IObit\Driver Booster"
for /f "delims=: tokens=1" %%i in ('where /r "C:\Program Files (x86)\IObit\Driver Booster" DriverBooster.exe') do set p=%%i
echo %p% <-- いずれ start "" /b "%p%" にする予定
pause
520:デフォルトの名無しさん
21/11/23 19:09:58.73 /gWgBLyu.net
pushd "C:\Program Files (x86)\IObit\Driver Booster"
set p=
for /f "delims=" %%a in ('dir /b /s DriverBooster.exe 2^>nul') do set "p=%%~a"
if defined p (echo start "" /b "%p%"
) else ( echo File Not found.
pause
521:デフォルトの名無しさん
21/11/23 19:15:36.21 /gWgBLyu.net
> ) else ( echo File Not found.
) else ( echo File Not found.)
閉じ括弧忘れ訂正
522:デフォルトの名無しさん
21/11/23 19:37:34.23 tf0m1Q47.net
できました! 大感謝です!
523:デフォルトの名無しさん
21/11/23 22:15:56.97 QElBq1+g.net
for /r "C:\Program Files (x86)\IObit\Driver Booster" %%a in (DriverBooster.exe*) do start "" /b "%%~a"
524:デフォルトの名無しさん
21/11/23 23:38:49.10 7Kq301Hb.net
そういや
音って鳴らせないの?
特定の処理を終了したら
終了音ならしたいんだけど
525:デフォルトの名無しさん
21/11/24 00:22:26.48 GYI09rKg.net
@echo off
for /f "delims=N" %%i in ('cmd/u/c echo 万') do set bel=%%i
echo %bel%
pause
526:デフォルトの名無しさん
21/11/24 02:02:20.45 L2nveBoL.net
powershell -c (New-Object Media.SoundPlayer 'C:\WINDOWS\Media\Windows Logon.wav').playSync();
527:デフォルトの名無しさん
21/11/24 04:56:50.03 GYI09rKg.net
prompt $g^G
^G はIMEオンで 0007 + F5キー
528:デフォルトの名無しさん
21/11/24 09:12:16.85 rRXxy3T6.net
beep
529:デフォルトの名無しさん
21/11/24 13:17:12.74 xQvD3wWY.net
"C::\Windows\Media\tada.wav"
530:デフォルトの名無しさん
21/11/24 13:18:06.25 xQvD3wWY.net
typo
"C:\Windows\Media\tada.wav"
531:デフォルトの名無しさん
21/11/24 15:01:27.44 uH6oNI9g.net
すみません、質問です。
call :hoge hogehoge.py
:hoge
python -B %1
robocopy foge
del piyo
exit /b
は、
hogehoge.pyに:hoge を追加したものを実行しているという意味合いで合っていますでしょうか。
お手数おかけして恐縮ですが、教えていただければ幸いです。
532:デフォルトの名無しさん
21/11/24 15:29:52.68 L2nveBoL.net
call は ":hoge" というサブルーチンを "hogehoge.py" を引数として呼んでいる
サブルーチン":hoge "は :hoge から exit /b まで
「python -B %1」の%1は :hoge の第1引数、つまり "hogehoge.py"
":hoge"サブルーチン内で 「 python -B hogehoge.py 」と実行している
バッチ内に @echo off とあるのなら、@echo on と書き換えて実行すれば
コマンド類がどういう順、変数展開されて実行されているか見えるようになる
533:デフォルトの名無しさん
21/11/24 15:51:35.42 uH6oNI9g.net
>>525
ご教授いただきありがとうございます。
とてもわかりやすく、助かりました!
534:デフォルトの名無しさん
21/11/24 16:06:45.19 xEc1Gd+0.net
call hoge
hoge.batを呼び出す
call hoge.batと書いたほうが間違いが少ない
call :hoge
現在のbatファイル中のラベル:hogeを呼び出す
(サブルーチンのような感じであり、呼び出すbatファイルを別に用意しなくても済む)
535:デフォルトの名無しさん
21/11/28 21:32:31.71 /OsOh/FW.net
explorerから.batをクリックした時
Windows Terminalで開く設定ってどうやるの?
ショートカット作ってプロパティ設定すると
非レガシーコンソールの設定もあるけどウィンドウが透明になって^vできるだけという
536:デフォルトの名無しさん
21/11/29 14:11:09.39 lBCR2YeY.net
ショートカットを以下みたいにして出来ない?
wt new-tab --title "CMD" cmd.exe /k \"フルパス\hoge.bat\"
537:デフォルトの名無しさん
21/12/01 12:20:54.06 +U/ofie/.net
日付の計算ってvbsやパワーシェル呼び出すしかないの?
ファイル名yyyymmの今月分がなかったら先月分をリネームコピーしたいだけなんだが
538:デフォルトの名無しさん
21/12/01 12:52:49.40 jrr/ct9i.net
SETLOCAL ENABLEDELAYEDEXPANSION
SET TODAY=%DATE%
SET YY=%TODAY:~0,4%
SET MM=%TODAY:~5,2%
IF "%MM%"=="01" (
SET /A YY=%YY%-1
SET LASTMM=!YY!12
) ELSE (
SET /A MM=%MM%-1
SET MM=0!MM!
SET LASTMM=%YY%!MM:~-2!
)
ECHO %LASTMM%
539:デフォルトの名無しさん
21/12/01 13:11:55.23 eX2WGo0j.net
> 今月分がなかったら先月分をリネームコピーしたいだけ
これにどう日付計算が必要なの?そもそも日付計算くらい自前で計算出来るでしょ
今月が1月の時だけ前年の12月にするくらいだね。ifで判別すればいいだけだから計算は1月の時に"年-1"するだけ
今月の取得
set Y=%date:~0,4%
set M=%date:~5,2%
Mは頭ゼロになる
12パターンしか無いんだから if "%M%"=="01" から "%M%"=="12" までずらっと並べちまえばいい
バッチなんて頭悪い書き方(の方が|で)いいんだよ
タスクスケジューラで定期実行させるのか都度月1でダブルクリックか
先月のファイルが無い場合は?遡って順次処理?ファイル名形式に合う最後のファイルを今月に?
日付計算が必要で数値としての今月はこんな感じで取得出来る
for /f "tokens=1-3 delims=/" %%a in ("%date:~0,10%") do set /a "y=%%a, m=1%%b-100, d=1%%c-100"
UNIXTIMEもワンライナーで行ける
for /f "tokens=1-7 delims=/:. " %%a in ("%date:~0,10% %time: =0%") do set /a "y=%%a, m=1%%b-100, d=1%%c-100, h=1%%d-100, n=1%%e-100, s=1%%f-100, cs=1%%g, f=!(m/3), g=y-f, k=f*12+m-3, uTime=86400*(365*g+g/4-g/100+g/400+(306*k+4)/10+d-719469)+3600*h+60*n+s"
540:デフォルトの名無しさん
21/12/01 13:16:52.77 +U/ofie/.net
>>531
>>532
ありがとう
確かにバッチに時間かけるのもあれだな
541:デフォルトの名無しさん
21/12/01 13:53:25.27 eX2WGo0j.net
先月
for /f "tokens=1-2 delims=/" %%a in ("%date:~0,7%") do set /a "m=1%%b-101, f=!m, y=%%a-f, m=m*!f+12*f"
set m=0%m%
set m=%m:~-2%
echo %y%%m%
542:デフォルトの名無しさん
21/12/01 14:32:14.49 eX2WGo0j.net
set /a "m=101-101, f=!m, y=2022-f, m=m+12*f"
でいい
*!fはあっても問題無いけど余計だった
543:デフォルトの名無しさん
21/12/01 14:33:15.12 +U/ofie/.net
かなりシンプルになるな
544:デフォルトの名無しさん
21/12/01 14:33:29.91 eX2WGo0j.net
訂正
set /a "m=1%%b-101, f=!m, y=%%a-f, m=m+12*f"
545:デフォルトの名無しさん
21/12/01 19:30:16.15 qmJDO3Rn.net
for /f "tokens=1-7 delims=/:." %%1 in ("%date%.%time: =0%") do set DateTime=%%1%%2%%3%%4%%5%%6%%7
546:デフォルトの名無しさん
21/12/02 12:24:38.70 xcTRUvQf.net
for /f "tokens=1-2 delims=/" %%a in ("%DATE:~0,7%") do set /a "m=1%%b-101, f=!m, m+=12*f, y=%%a-f"
for /f "tokens=1-2 delims=/" %%a in ("%DATE:~0,7%") do set /a "m=1%%b-101, m+=12*(f=!m), y=%%a-f"
for /f "tokens=1-2 delims=/" %%a in ("%DATE:~0,7%") do set /a "m+=12*(f=!(m=1%%b-101)), y=%%a-f"
少し直したけど綺麗だなこれ
>>532
unixtimeも面白い
3月を頭にしてるんだな
547:デフォルトの名無しさん
21/12/02 21:10:02.03 NUCi8UEu.net
0:00前後に実行するとおかしなことになるから%date%と%time%はかならず一時変数に入れるべき
もっと言えば日付と時刻を同時に取れる手段を使うべき
548:デフォルトの名無しさん
21/12/02 22:16:15.49 sGas3Vn9.net
メモ
フェアフィールドの公式
549:デフォルトの名無しさん
21/12/02 22:37:42.24 s/MRATw/.net
割とクソゴミな式な
式の意味が分かり難くなるような式変形しちゃダメだわ
敢えてやってんだろうけどさ
Wikipediaの解説とかも良く分かってないバカが書いたんだろうなと思う
まあ導出のアプローチの仕方が悪いってだけだが
550:デフォルトの名無しさん
21/12/04 22:30:00.94 Nf0n5MKs.net
日付の質問です。
CSVの日付部分のセルのデータが壊れていて、5桁の整数になっています。
ググって調べてみたら、どうも1899/12/30が0のシリアル値のようです。
これをYYYY/MM/DDの文字列に変換したいんですが計算式がわかりません。
よろしくお願いします。
551:デフォルトの名無しさん
21/12/04 23:24:36.10 vRpkCUu9.net
>>543
CDate( )
552:デフォルトの名無しさん
21/12/05 00:20:38.02 KxbO9WQf.net
>>543
エクセルあればセルの表示設定を変える
553:デフォルトの名無しさん
21/12/05 06:43:24.27 KxbO9WQf.net
>>543 変数 n を変換
set /a n+=693899,a=365,b=1461,c=36524,e=146097
set /a f=n/e,g=(n+1)/e-f,n-=f,n+=(n-g)/c,f=n/b,g=(n+1)/b-f,n-=f
set /a n+=(n-g)/a*3+(n-61)/a+(n-122)/a+(n-214)/a+(n-275)/a-306
set /a y=n/372+1,m=n/31%%12+101,d=n%%31+101
set n=%y%/%m:~1%/%d:~1%
各定数は順に、
0/3/1~1899/12/29の日数(全てグレゴリオ暦)
西暦1年から1,4,100,400年の日数
3~4,3~6,3~9,3~11,3~12月の日数
31*12の日数
554:デフォルトの名無しさん
21/12/05 09:15:29.34 /JnG12pN.net
> 1899/12/30が0のシリアル値
まあ実質的にはそれでも間違いでは無いけど
エクセルは一応 1900/01/01 が 1
でも 1900/02/29 が存在するバグ仕様のせいで 1900/03/01 以降 +1 になってしまい 1899/12/31 が 1 のような値になってしまう
1900/03/01 以降の値しか無いなら一律で構わないけれど全てに対応させるには以下の3種必要
・1900/01/01 ~ 1900/02/28
・1900/02/29
・1900/03/01 ~
2/29だけ例外で扱って残りは03/01~の時、通日をフラグで-1する感じかな
0/3/1 を 0 とした値に直して %1 に与えたら以下の式で年月日を出せる
set /a "R=(R4=(R1oo=(R4oo=%~1%%146097)%%36524)%%1461)%%365, Y4oo=%~1/146097, Y1oo=R4oo/36524, Y4=R1oo/1461, Y1=R4/365, L=(Y1oo|Y1)/4, R+=L*365, k=(R*5+2)/153, d=R+1-(306*k+4)/10, f=k/10, m=k+3-f*12, y=400*Y4oo+100*Y1oo+4*Y4+Y1-L+f"
echo %y% / %m% / %d%
555:デフォルトの名無しさん
21/12/05 09:29:31.66 KxbO9WQf.net
シリアル値が60以下がどうとかいう話だよね
質問が5桁の整数とあるので無視したよ
556:デフォルトの名無しさん
21/12/05 10:57:38.65 rW6bYpGZ.net
もしかしてみずほの案件やってた人?
557:デフォルトの名無しさん
21/12/05 11:31:10.50 KxbO9WQf.net
そもそも60以下になるとソフトにより挙動が違う
Excelとは限らない
出どころ確認が先決
スレチの話だけどね
558:デフォルトの名無しさん
21/12/05 11:31:33.19 4iCsIwjm.net
ワロwww
559:デフォルトの名無しさん
21/12/05 11:39:17.80 4iCsIwjm.net
わざわざ対応する必要なんて無いとは思うけど
定数の説明なんかよりも60以下で不正な値になるという注意書きの方が重要だわな
みずほも言われたことしかやらない企業体質がどうの言われてるね
こんな感じで小さなバグが内包しまくってるのかもなw
560:デフォルトの名無しさん
21/12/06 16:06:42.92 yBc7foB1.net
>>546
一旦閏日全部引いて、月が一律31日になるよう加算してるんだね
面白い
(n-61)/a+(n-122)/a+(n-214)/a+(n-275)/a
この式が4-11月の不足分を足してるんだろうけど
なんでこの式で行けるのかイメージ出来ない
561:デフォルトの名無しさん
21/12/06 19:19:45.42 +EfoGYZX.net
>>546
バッチありがとうございます。動作確認しました。助かりました。
>>550
ソフトはLibreOfficeです。後出しですみません。
シリアル値は全て連続です。質問は5桁設定でしたが60以下でもOKです。
>>547
詳細な情報ありがとうございます。Excelの場合は注意します。
562:デフォルトの名無しさん
21/12/07 18:18:33.97 gm0ARZfd.net
すみません、質問です。
SET hoge=hogehoge
robocopy c:\piyo \\server1\foge %hoge% /r:3 & if errorlevel 8 (
echoコマンド
exit /b 1
)
上記、
robocopy c:\piyo \\server1\foge %hoge%の「%hoge%」はどのような意味合いになりますでしょうか。
また、/r:3 & if errorlevel 8 ( の意味合いも教えていただけないでしょうか。
恐縮ですが、よろしくお願いいたします。
563:デフォルトの名無しさん
21/12/07 18:50:14.46 eGbAaLSQ.net
robocopy /?
でヘルプが出るのでそれを読め
564:デフォルトの名無しさん
21/12/07 18:52:54.40 eGbAaLSQ.net
なお&は命令の区切りだけど、別に手前の命令の結果を待っての動作じゃなくて
一行前までの結果で動作するんじゃなかったかな
565:デフォルトの名無しさん
21/12/07 19:03:57.81 8LJtCh3/.net
&はコマンドを繋げているだけ
その例だと
robocopy opt
if errorlevel 8 echoコマンド&exit /b 1
と同じ
c:\piyo \\server1\foge %hoge% /r:3
がrobocopyのコマンドラインオプション
%hoge%はhogehoge
set a=xyz
echo %a%
はecho xyzと解釈されxyzと出力される
各コマンドについてはコマンドプロンプトで以下
set /?
robocopy /?
if /?
566:デフォルトの名無しさん
21/12/07 19:21:14.44 eGbAaLSQ.net
>>558
>>557でも言ったけど、&は命令を並列に記述できるだけで
前の命令の結果を反映したものじゃないので
robocopy opt
if errorlevel 8 echoコマンド&exit /b 1
と
robocopy opt&if errorlevel 8 echoコマンド&exit /b 1
の結果は違ってくる
っていうかこれは意味の無い間違った使い方だね
例
set data=abc
set data=def&echo %data%
echo %data%
実行結果
abc
def
567:デフォルトの名無しさん
21/12/07 19:26:26.54 eGbAaLSQ.net
あれ違うのか
コマンドの場合は結果を見るんだな
環境変数が遅延するのか
568:デフォルトの名無しさん
21/12/07 19:34:45.64 8LJtCh3/.net
>>559
pushd .
if errorlevel 1 echo fail1
pushd a
if errorlevel 1 echo fail2
pushd .&if errorlevel 1 echo fail3
pushd a&if errorlevel 1 echo fail4
pause
試してから発言しなよ
569:デフォルトの名無しさん
21/12/07 19:38:07.87 eGbAaLSQ.net
実行時の行の展開の式評価に環境変数は展開されるってことだな
式評価に影響されないものはちゃんと実行される
&による命令の結合は
if errorlevel 1 は問題ないが
if %errorlevel% geq 1は問題がでてくる
570:デフォルトの名無しさん
21/12/07 20:35:38.31 FGGdMnHs.net
皆さまありがとうございます
cmdにて コマンド /? で見られること知りませんでした
571:デフォルトの名無しさん
21/12/08 06:22:16.06 GPDURn2W.net
変数・条件判断など、ややこしいのは、PowerShell で作った方がよい
572:デフォルトの名無しさん
21/12/08 20:11:32.12 g8C6QNB9.net
普通に「勘違いしてました。ごめんなさい。」と言えんのか
573:デフォルトの名無しさん
21/12/08 20:18:14.77 CqDUxZrm.net
if errorlevel とか if defined って
& で繋ぐ為にあるんじゃね?
574:デフォルトの名無しさん
21/12/08 21:48:59.30 QG3j0cZG.net
バッチは罠が多すぎて&なんて横着しないからどうでもいい
575:デフォルトの名無しさん
21/12/08 22:49:45.89 CqDUxZrm.net
他にもifやdoの括弧のなかとか
576:デフォルトの名無しさん
21/12/09 10:08:38.60 FBbu4srV.net
次行に書いた方が見やすいしわざわざ&で繋ぐ意味なんてほぼ無いけど
robocopy & if errorlevel
としてるのは if errorlevel は直前のコマンドの errorlevel を評価するわけだから
「ココは直後である事に意味ありますよ。繋がっていますよ」をコード的に明示する為に次行では無く&で繋げて書いてあるんだと思う
577:デフォルトの名無しさん
21/12/09 13:59:42.09 3uIKfwyJ.net
&で繋ぐのは大抵そんな感じ
578:デフォルトの名無しさん
21/12/09 14:06:23.73 7XWC/XYC.net
行数を少なくしたい時しか使わんかなあ
まあ使うとしても
エラーかどうかだけチェックするときは、&&,||を使うといい
579:デフォルトの名無しさん
21/12/09 15:08:39.73 CZcGE7T9.net
>>571
> エラーかどうかだけチェックするときは、&&,||を使うといい
なるほど、一行でみやすくなる
580:デフォルトの名無しさん
21/12/09 15:58:31.58 y36UsJ/D.net
type "!TARGET_FILE!">>"!FILE_NAME!"で
テキストの中身を出力して
テキストファイルに出力するバッチファイルつくったんですけど
普段はうまく出力できたんですが
特定のファイルだけ
The system cannot find the file specified.
で中身が空になってしまいました
原因として考えられるのはなんでしょうか?
581:デフォルトの名無しさん
21/12/09 15:59:20.44 y36UsJ/D.net
中身が空というのは
本来は出力されるべきものが空になって出力された
ということです
わかりづらくてすいません
582:デフォルトの名無しさん
21/12/09 16:09:53.85 y36UsJ/D.net
自己解決です
ファイル名がおかしかったでした
すいません
583:デフォルトの名無しさん
21/12/10 09:23:54.32 E/xxr9cU.net
Windows10で、Chromeで特定の複数Webページを開くバッチファイルを作りたいと思ってます
cd /d "PATH_TO_CHROME"
"PATH_TO_CHROME\chrome.exe" "http://〇〇/〇〇"
"PATH_TO_CHROME\chrome.exe" "http://△△/△△"
↑
このようにすると指定したChromeが起動し、指定したURLを開けるところまでは
できたのですが、これだと起動したChromeのタブを閉じないとバッチファイルが
先まないので、1サイトずつ開くことしかできません
しかし
cd /d "PATH_TO_CHROME"
start "PATH_TO_CHROME\chrome.exe" "http://〇〇/〇〇"
start "PATH_TO_CHROME\chrome.exe" "http://△△/△△"
↑
このようにすると、ChromeではなくIE(既定のブラウザ)で起動してしまいます
対処法をお教えいただけますでしょうか
584:デフォルトの名無しさん
21/12/10 09:32:06.00 UVPMSOn+.net
srart /? 読めよ
定番の罠だぞ
start "タイトル" "コマンド"
585:デフォルトの名無しさん
21/12/10 09:43:17.11 B96qroJw.net
実行前にcdしてるんだから、startでPATH_TO_CHROME必要なくない?
586:デフォルトの名無しさん
21/12/10 09:55:28.09 E/xxr9cU.net
>>577
ご指摘ありがとうございます
コマンドがタイトルとなっているようですね
>>578
うまくいかず、いろいろ試行錯誤して残っておりますが、たしかに必要ないですね
ご指摘ありがとうございます
587:デフォルトの名無しさん
21/12/10 11:16:20.09 E/xxr9cU.net
576です
いただいた回答に基づき以下の様に修正し、うまく動作しました
ありがとうございました
cd /d "PATH_TO_CHROME"
start "" chrome.exe "http://〇〇/〇〇"
start "" chrome.exe "http://△△/△△"
タイトルは、どうしようか迷いましたが、消すとまた忘れて罠にハマるかと思い、
残しておきました
588:デフォルトの名無しさん
21/12/10 12:54:10.13 4x3UzFuB.net
chromeをdefault browserにする気は無かったのか?
589:デフォルトの名無しさん
21/12/10 13:46:43.89 xm+AV3Ci.net
これかー
URLリンク(github.com)
However the fact you need a Window Name is very annoying.
Typically we have used:
start /w "c:\path_name_here\filename.ext"
But all this does now is open another cmd prompt window with "c:\path_name_here\filename.ext" as it's title.
As a minimum, what is now required is this:
start "" /w "c:\path_name_here\filename.ext"
Why did this change??
まだopen question?闇深
590:デフォルトの名無しさん
21/12/10 13:58:58.96 bi0x6bK+.net
いちいちcdとかせんでもこれでよくね?
set chrome="フルパス\chrome.exe"
start "" %chrome% "http://〇〇/〇〇" "http://△△/△△"
タブに追加するだけならurlは羅列でいいはず
591:デフォルトの名無しさん
21/12/10 14:41:04.55 xm+AV3Ci.net
/オプション無しのオプショナル引数を先頭に持ってくるという設計は完全に腐ってるから、[<title>]から<title>への変更はグッジョブ
しかしアンドキュメンテッドはやめーや
592:デフォルトの名無しさん
21/12/13 10:32:27.87 iAh3rPLr.net
cmdの作業効率が8%向上する裏技
prompt $E[92;40m$P$_$G$S$E[0m
593:デフォルトの名無しさん
21/12/13 14:12:22.20 MDj1w4qb.net
ドキュメントしてしまうと公認してしまうから
594:デフォルトの名無しさん
21/12/14 01:14:44.64 74yCYCRP.net
>>567
行毎に一括でパラメタ展開はモジュール化に役立つよ
:: main
call :subtract %1 %2
call :add %1 %2
goto:eof
:subtract
setlocal
set a=%1
set b=%1
endlocal & set /a ret=%a%+%b%
exit /b
:: note that
:: "endlocal & set /a ret=a-b" wont work: no expansion at line-parsing
:: also
:: "endlocal"
:: "set /a a=%a%+%b%"
:: because local vars already popped.
:add
setlocal
set a=%1
set b=%2
endlocal & set /a ret=%a%-%b%
exit /b
ノーテストなんでなんか変だったらごめん
スマホアプリですぐ試せられればいいんだけど、プロプライエタリだからなあ…
595:デフォルトの名無しさん
21/12/14 01:20:33.98 74yCYCRP.net
大事なとこぬけてた
call :subr arg1 arg2
@echo %ret%
みたいに返り値得てます
596:デフォルトの名無しさん
21/12/14 13:12:42.88 0TpC/TXA.net
%time%で取得できる13:11:12.99を13111299に変換したい場合、変数を使って%time::=%、%_time:.=%として変換しています。
この文字列置換を複数条件設定するなど1行でスマートに置換させる方法はありませんか?
597:デフォルトの名無しさん
21/12/14 14:26:07.33 g9YcY7nV.net
>>589
>>538じゃ駄目なの?
598:デフォルトの名無しさん
21/12/14 15:16:40.00 0TpC/TXA.net
>>590
できました。ありがとうございます。
599:デフォルトの名無しさん
21/12/15 10:47:19.32 EP1qj6y9.net
>>538
すばらしい、一行でできるんだ、曲芸飛行
時間だけで5行かけていた
600:デフォルトの名無しさん
21/12/15 21:34:23.51 Ttj+NiJr.net
>>540の問題で痛い目を見るから俺は%date%%time%は使わない
601:デフォルトの名無しさん
21/12/15 22:26:24.88 EYSEHsUE.net
>>593
そこまで気にするなら、時刻が 0:00:00.xxの時は日付を取得し直すとかすればいいかな
又は一旦ダミーファイルを作成してそのタイムスタンプを見るとか
ちょっと具体的には思いつかないが日付時刻の付いた結果が出るシステム情報や結果ログ出力系のコマンドから貰うとか
bat中で別言語(WSH,PowerShell)で取得するとか(new Date();やget-date)
どういうのを使うと良いと言ってくれれば最高なレスになったのに
602:デフォルトの名無しさん
21/12/16 00:00:44.73 7XMchLit.net
通ぶりたいだけでしょw
603:デフォルトの名無しさん
21/12/16 21:17:59.55 /gSQ5d+p.net
これで満足かな
for /f "usebackq" %%a in (`powershell -nop "get-date -format 'yyyyMMddHHmmss'"`) do set now=%%a
604:デフォルトの名無しさん
21/12/17 14:42:24.69 BDVQn7Pa.net
:: タイムスタンプ取得。秒未満無し
copy nul $.txt
:: tokens はシステム設定の日付形式に依存。環境毎に要調整
for /f "tokens=2-4,6-8 delims=/: " %%a in ('where /t $.txt') do set "dt=%%a%%b%%c%%d%%e%%f"
del $.txt
set "dt=%dt: =0%"
echo %dt%
pause &exit /b
:: 怪しい時間帯(23:59:59-00:00:01)なら再取得。センチ秒(1/100)有り
:GET_DT
for /f "tokens=1-7 delims=/:." %%a in ("%date:~0,10%/%time: =0%") do set /a "d=%%a%%b%%c, t=1%%d%%e%%f%%g"
if %t% GTR 123595900 timeout /t 2 /nobreak >nul &goto :GET_DT
if %t% LSS 100000100 goto :GET_DT
echo %d%_%t:~1,-2%_%t:~-2%
pause &exit /b
別々に取得してるならまだしも同時に取得してそんな事故起こり得るの?都市伝説じゃね?
ところで"20211217143411"みたいな年月日時分秒を区切り文字無しの数字のみで表した形式って名前あるなら教えて欲しい
605:デフォルトの名無しさん
21/12/17 14:50:54.89 YK+z10uu.net
dateもtimeも参照する度に計算して返してるからありえなくはないはず
んなこと気にしだしたらやってらんないからまあ気にすんな
606:デフォルトの名無しさん
21/12/17 15:15:49.48 hTLZR6Rv.net
怪しい時間はスリープしてしまうのも手
決済の日付なんか微妙なの下手に振り分けたら揉めるしな、23:59で〆切でヨシ
そんなのbatでやってる人居るかはしらんが
607:デフォルトの名無しさん
21/12/17 17:15:52.28 U9ZWMMsm.net
>>597
日時ってデータとしては埋もれて目立たないから軽視されがちだけど
バッチでログ吐かせてY軸時間でグラフ出すような時にアッレッ!?ってなる
608:デフォルトの名無しさん
21/12/17 19:18:20.51 b/qKwgTk.net
:loop
set d=%date%
set t=%time%
if not %d%==%date% goto loop
609:デフォルトの名無しさん
21/12/17 20:24:45.70 HfuHDFo+.net
>>601 これだと、time取得した後で日付が変わる可能性がごくわずか考えられる やっぱり時刻が0秒台かどうかで判定したほうがいいと思う
611:デフォルトの名無しさん
21/12/17 20:26:39.18 HfuHDFo+.net
いや別に変わっても大丈夫だな
612:デフォルトの名無しさん
21/12/17 21:03:18.69 BDVQn7Pa.net
>>601
あー同時に参照することばかり固執してたわ
敢えて順に取得して2度目との比較でTIMEの同日を保証出来るね
その方がシンプルで良いな
613:デフォルトの名無しさん
21/12/18 01:12:16.03 CB++7SQf.net
8ビットマイコンで16ビットタイマーの値を読むときなんかに使ったっけ
もちろんタイマー側にラッチ機能があって、そういう気遣いのいらないものもあったが
614:デフォルトの名無しさん
21/12/21 06:09:00.92 LxI3AD9t.net
ラッチがいるならつければええやん
615:デフォルトの名無しさん
21/12/24 11:39:23.31 etjYYPj+.net
イベントログ保存したくて
wevtutil epl system xxx.evtx /q:"条件"
↓
wevtutil al xxx.evtx /l:ja
でディレクトリ名が無効ですって出るんだが理由わかる?
616:デフォルトの名無しさん
21/12/24 11:43:38.16 etjYYPj+.net
自己解決しました
管理者で実行したら行けた
617:デフォルトの名無しさん
21/12/24 20:51:05.94 wuqNqn+2.net
>>606
タイマーとかのラッチってペリフェラルの補助機能でしょ
ソフトでそんなもんないから>>601なわけで
618:デフォルトの名無しさん
22/01/02 19:41:59.70 llzVm8Ys.net
Windowsでバッチファイルの%1とかに
今クリップボードに入ってるテキストを渡して起動したいけど
なんか方法ある?
619:デフォルトの名無しさん
22/01/02 20:13:43.31 Wx5RR6tp.net
とりあえず何も追加する必要ないので PowerShell がお手軽
例えばクリップボードの内容を tmp.txt に出すならバッチファイルやコマンドプロンプトで
>powershell -NoProfile -ExecutionPolicy Unrestricted -Command Get-Clipboard > tmp.txt
先に
>chcp 65001
しておくと UTF8 での出力もいけるっぽい
620:デフォルトの名無しさん
22/01/03 02:27:56.29 /1+Dp4vp.net
for /f "delims=" %%a in ('powershell -c "get-clipboard"') do hoge.bat "%%~a"
621:デフォルトの名無しさん
22/01/03 07:54:20.63 yGzP40SI.net
>>611-612
powershellの1行呼び出しに-c or -Commandって必要ある?
いつもpowershell -nop "コマンド"てやってるわ
622:デフォルトの名無しさん
22/01/03 09:26:29.55 BdaWP45p.net
漏れは下のような、Ruby スクリプト内で、powershell コマンドを呼んで、
クリップボード内の文字列を処理している
# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる
str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換
ary = str.each_line.map( &:strip ) # 連続する空白類を除去する
IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
623:デフォルトの名無しさん
22/01/03 10:45:31.38 CWfpiD5B.net
>>613
この場合なら最低限で書くと
for /f "delims=" %%a in ('powershell get-clipboard') do
で良い
624:デフォルトの名無しさん
22/01/03 13:18:16.70 0LszXjQc.net
環境変数名に一部記号も使えることを発見
#で始まれば一時変数、$で始まればバッチ間共通など、少しわかりやすくできる
625:デフォルトの名無しさん
22/01/04 00:14:37.12 a2P6Hn/H.net
塩野義製薬が週休3日制導入へ 来年4月、副業も解禁
塩野義製薬が「週休3日」選択可能に 給与は『週休2日の8割』副業や学び直しを支援
【フォーカス】サタケ/週休3日制 通年導入めざし夏季のみ試行中 交代制で水曜を休日に
旅館なのに週休3日!?陣屋・若女将の常識を覆した組織改革
“時代錯誤”から残業ゼロ、週休3日に! 鳥取の不動産会社が
レガシー企業からDX先進企業になれたワケ
ネクスウェイ、週休4日制・1日3時間勤務選択できる勤務体系を導入
日本初「週休4日制度」で、優秀な人材を採用するしくみとは? ?
ナレッジソサエティ久田社長に聞いてみた
626:デフォルトの名無しさん
22/01/06 07:53:54.89 JIskJ1L9.net
ファイルのリネームと
ファイルの移動
フォルダ自動作成
これだけで普段の作業の手間がほんとうに省ける
逆に何ができると便利だろう
627:デフォルトの名無しさん
22/01/06 08:04:00.41 JIskJ1L9.net
環境変数って
普通の変数とは違うの?
バッチファイル特有の言い回し?
%1
%i
%hoge
だっけ?
628:デフォルトの名無しさん
22/01/06 13:18:17.45 nDo7QbOD.net
アプリケーションプログラムの環境という意味
例えば一時作業フォルダを TEMP に指定するとアプリが参照して使ってくれる(事がある)
dirコマンドのデフォルトオプションはdircmd変数に設定出来る
いわゆる環境設定と呼ばれるね
そしてバッチファイル内でプログラミング言語の変数としても使える
629:デフォルトの名無しさん
22/01/06 13:23:22.58 nDo7QbOD.net
ちなみに %1 %%i は環境変数じゃないね
shift /? や for /? を読もう
環境変数はsetコマンドでセットして参照は%変数名%
set /? を読もう
630:デフォルトの名無しさん
22/01/20 04:31:27.84 a6a8bxfJ.net
最低限
for /f "delims=" %a in ('powershell clipboard') do echo %a
631:デフォルトの名無しさん
22/01/25 21:13:49.45 aASmTB60.net
dir /b の結果を explorerの名前順(昇順|降順)にソートする簡単な方法無い?
数字を数値と見做してソート
バッチから利用出来るならOK。ps全く分からんけど powershellとかで出来ないかな?
カレントディレクトリの dir /b 相当なら dirで無くてもいい
for /f "delims=" %%a in ('dir /b ^| numsort.exe') do
みたいな感じで外部ソートツール導入でもOK。むしろ理想形
ファイル数は2000未満くらい。万単位とか考慮しなくていい
なるべくなら余計なインストールは避けたいけど自前でパースとソート作るのはハードル高過ぎなので何か方法があれば教えて欲しい
最悪逆順にするだけなら自前でも出来そうなのでせめて(昇順|降順)どちらかだけでも出来れば
632:デフォルトの名無しさん
22/01/25 21:22:10.78 s4YEdFZn.net
>>623
dir /b の結果とexplorerの名前順(昇順|降順)って違うん?
もし同じなら、単に dir /b > uuu.txt でリダイレクト
633:デフォルトの名無しさん
22/01/25 21:28:36.67 OaU1XWUD.net
半角数字だけでいいなら GnuWin の sort.exe を gsort.exe にリネームして使ってる
URLリンク(gnuwin32.sourceforge.net)
の Binaries の zip に入ってるやつ
>dir /b *.txt | gsort -n
11.txt
0123.txt
2222.txt
3333.txt
11111.txt
>dir /b *.txt
0123.txt
11.txt
11111.txt
2222.txt
3333.txt
こんな具合
漢数字とかは知らないので日本語(漢数字・全角)に対応したの
あれば知りたい……
634:デフォルトの名無しさん
22/01/25 21:53:08.80 aASmTB60.net
>>625
ありがとう試してみます
635:デフォルトの名無しさん
22/01/25 21:59:16.95 s4YEdFZn.net
>>626
あんた数字を数値と見做すて言うたやん?
11.txt
11111.txt
2222.txt
になっていいわけ?
636:デフォルトの名無しさん
22/01/25 22:26:05.82 aASmTB60.net
>>625
教えてもらったようにgsort.exeにリネームして使ってみたら
libintl3.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。
とアラート出て使えなかった。win10
libintl3.dllをググったらjp.dll-files.comてとこ検索出て落とせるようなんだけどこれ入れて大丈夫?
637:デフォルトの名無しさん
22/01/25 22:30:15.41 OaU1XWUD.net
>>627
落ち着いて
そこは比較のために出した素の 「dir /b 」 の結果ですよ
>>628
ごめんなさい
上のページの Binaries の下の Dependencies も要るんだった
638:デフォルトの名無しさん
22/01/25 23:14:16.23 aASmTB60.net
>>629
ありがとう
libをシステムにコピーして使えました
でもコレ
dir /b *.ext | gsort -n
1.txt
2.txt
…
9.txt
10.txt
と、数字.ext なら数値順にソート出来ましたけど
文字列+数字.ext だと無理なようです
xxx1.txt
xxx10.txt
xxx2.txt
xxx20.txt
みたいになります
xxx_1.txt と文字列と数字の間に区切り記号入れても駄目
エクスプローラーのようには並ばないみたいですね
win32api使うかvbかpowershellかで出来るような事を以前どこかで読んだ気がするのですがそのソースが見付けられない。。
639:デフォルトの名無しさん
22/01/26 01:07:47.03 td9ayUMw.net
普通に見つかったけど、本当に探した?
@echo off
echo class P{[System.Runtime.InteropServices.DllImport("shlwapi.dll", >SortLogical.cs
echo CharSet = System.Runtime.InteropServices.CharSet.Unicode, ExactSpelling = true)] >>SortLogical.cs
echo public static extern int StrCmpLogicalW(string str1, string str2); >>SortLogical.cs
echo static void Main(){ string[] lines = System.Console.In.ReadToEnd().Split >>SortLogical.cs
echo (new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries); >>SortLogical.cs
echo System.Array.Sort(lines, StrCmpLogicalW); >>SortLogical.cs
echo System.Console.Out.WriteLine(string.Join("\r\n",lines));}} >>SortLogical.cs
for /f %%i in ('dir /s /b "%windir%\Microsoft.NET\csc.exe"') do set csc="%%i"
%csc% /nologo SortLogical.cs
dir /b | SortLogical
640:デフォルトの名無しさん
22/01/26 04:18:02.04 aOgfZBdB.net
>>631
すげぇ。生成されたexeで希望するソートが出来るようになりました
マジ感謝です
ありがとう
> 本当に探した?
検索語すら分からず「バッチ dir エクスプローラー並び順」とか他にも結構色々試して探しては見たのですが。。
StrCmpLogicalW が分かった今でもその方法を見付けられていません
641:デフォルトの名無しさん
22/01/26 06:51:01.88 fC9okRVc.net
エクスプローラーの並び順って
辞書順か数字順か
レジストリで変更可能だよね
642:デフォルトの名無しさん
22/01/26 08:10:19.47 JawhZMcA.net
何のために並び順を揃えるの?
643:デフォルトの名無しさん
22/01/26 08:34:25.15 e2k0MxNT.net
なるほど、数字の部分だけは数値に変換してから、小さい順に並べるのか
このアルゴリズムを考えるのは、難しい
644:デフォルトの名無しさん
22/01/26 09:10:13.24 TX0OTodc.net
俺なら必要な桁分0パディングするなあ
連番ファイルをエクスプローラーで直接使うなんてことはないし
645:デフォルトの名無しさん
22/01/26 09:20:50.79 JawhZMcA.net
エクスプローラーで選択してパスのコピーでいいやん
646:デフォルトの名無しさん
22/01/26 11:52:52.47 +BcwC06P.net
>>635
スクリプトでやるなら正規表現などで数字部分を置換11→0000000011してからソートかな?
小数点以下ってどうなってたっけ?
でも記号 _ の並びまで違うから鬱陶しい
631のAPIはWin7には無いっぽいから需要はあるかもよ
647:デフォルトの名無しさん
22/01/26 12:06:15.68 +BcwC06P.net
あれ?XPから使えるのか…
あの外人許さん
648:デフォルトの名無しさん
22/01/26 12:08:29.20 JawhZMcA.net
A01BとA001Bが同じ評価になって順番どうするのとか思う
649:デフォルトの名無しさん
22/01/26 20:44:37.41 rJwWcbPl.net
>>631をスイッチで逆順に出来ない?
650:デフォルトの名無しさん
22/01/26 22:43:54.21 2NoDFTFY.net
>>631
おおーっ、いいなコレ
>>630
今更感が強いけど、文字列やセパレータがはっきりしてるならこんな事も
>dir /b *.txt | gsort -g --key=4 --field-separator=x
xxx11.txt
xxx0123.txt
xxx2222.txt
xxx3333.txt
xxx11111.txt
>dir /b *.txt | gsort -n --key=2 --field-separator=-
xxx-01-23.txt
xxx-1-1.txt
xxx-2-222.txt
xxx-33-33.txt
xxx-111-11.txt
>dir /b *.txt | gsort -n --key=3 --field-separator=-
xxx-1-1.txt
xxx-111-11.txt
xxx-01-23.txt
xxx-33-33.txt
xxx-2-222.txt
ひとつ目はちょっと無理やりw
651:デフォルトの名無しさん
22/01/26 22:54:09.19 e2k0MxNT.net
11
011
0011
のソート順が分からない
652:デフォルトの名無しさん
22/01/27 00:04:18.32 L9fnubfL.net
>>641
もちろんできる
下記をSortの後に追加
if "%1"=="/R" echo System.Array.Reverse(lines); >>SortLogical.cs
653:デフォルトの名無しさん
22/02/05 23:16:58.61 ICS6MdcL.net
・画像ファイルが縦長か横長か?
・画像ファイルの拡張子判別
上記2点をバッチから行いたい
縦横に関してはimageMagickで出来そう
identify -format "%[fx:h>w?1:2]" "ファイルパス"
拡張子判別も同様に %m でファイルタイプからやれそうではあるのですが
何か更に良い方法やコマンドラインアプリなどがあったらアドバイス欲しいです
654:デフォルトの名無しさん
22/02/06 04:23:41.63 D8jWL7f3.net
画像のサイズはOS標準の方法としてシェルネームスペースからファイルのプロパティの詳細タブの値を拾ってくるやつがあったと思う
COMが使えるスクリプトで取ってくる必要がある
拡張子はバッチファイル 拡張子 取得でぐぐったら出てくるんじゃないの
655:デフォルトの名無しさん
22/02/06 05:53:39.32 ZVoj0wBD.net
Param([Parameter(mandatory=$true)][String]$inputFile)
Add-Type -AssemblyName "System.Drawing"
try{
$img = [System.Drawing.Image]::FromFile($inputFile)
if ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Jpeg)) {
$mimetype = 'image/jpeg'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Png)) {
$mimetype = 'image/png'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Bmp)) {
$mimetype = 'image/bmp'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Gif)) {
$mimetype = 'image/gif'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Icon)) {
$mimetype = 'image/icon'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Tiff)) {
$mimetype = 'image/tiff'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Wmf)) {
$mimetype = 'image/wmf'
} elseif ($img.RawFormat.Equals([System.Drawing.Imaging.ImageFormat]::Exif)) {
$mimetype = 'image/exif'
} else {
$mimetype = 'image/unknown'
}
$w = $img.Width
$h = $img.Height
$img.Dispose()
}
catch{ $mimetype='unknown' }
echo "$mimetype`t$w`t$h"
656:デフォルトの名無しさん
22/02/06 05:54:07.77 ZVoj0wBD.net
↑
getDetailsOfでプロパティを取ってくる以外の方法
jpg/png/gifぐらいだけど
powershell ./test.ps1 "画像ファイルのパス"
プロパティだと拡張子に関連付けられたものになる
中身がjpgなのにファイル拡張子が.pngの場合とかある?
なお、batに埋め込みたいならググれば方法は出てくる
657:デフォルトの名無しさん
22/02/06 09:33:19.21 T20/oaZi.net
>>647-648
ありがとうございます
最初、実行ポリシーが云々でエラーになったものの、ググって
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 '%~1'
としたら動きました
シングルクォートにしないとスペースを含むパスでエラーになりました
> 中身がjpgなのにファイル拡張子が.pngの場合とかある?
バッチでリネームついでにそういった間違っている拡張子を正しいものに直したいと思いまして
image/jpeg とかを .jpg に変えたら面倒も無くそのまま使えそうです
powershell凄いですね。外部アプリ使わずに判別出来ちゃうんですね
WINEX32.DLL
URLリンク(www.vector.co.jp)
こういうのが必要なのかと思ってました
ただファイル一つ一つをバッチからpsを起動してたら遅いのだけが難点ですね
速さは重要ではないので構わないのですが
いっそ全部psで書けるスキルがあれば良いんですけどねー
バッチですら四苦八苦してる身としてはさくっと書ける人が羨ましいです
658:デフォルトの名無しさん
22/02/16 16:36:49.58 w27+Spzi.net
初心者過ぎて分からないんだが
�
659:Rマンド >nul 2>&1 if "!ERRORLEVEL!" == "0" ~ ってちゃんと意味ある? 出力捨てるのは成功するから毎回リターンコード0になったりする?
660:デフォルトの名無しさん
22/02/16 17:40:22.47 SGx0nl/1.net
正常時に出力の無いコマンドはリダイレクトできないからエラーになるんじゃね。
異常時にコマンドがエラー出してもエラーになるから
結局、区別がつかない。
661:デフォルトの名無しさん
22/02/16 18:08:47.78 5G/Gik2e.net
>>651
辞めといた方がいいか
前の処理が正常終了したら次に進むベストプラクティスってなんだろう
662:デフォルトの名無しさん
22/02/16 18:18:47.77 t0Nu4cH6.net
コマンドの復帰コードと標準(エラー)出力のリダイレクトとは無関係なので
ちゃんとコマンドが復帰コードを返していたら問題ないはず
errorlevel環境変数を見るのはちょっとリスクがあるけどわかっているなら問題はない
if errorlevel 1 ~
なら確実
663:デフォルトの名無しさん
22/02/16 18:26:54.82 lGeZIdOq.net
コマンド
if not errorlevel 1 echo ok
コマンド >nul 2>&1 && echo ok || echo fail
664:デフォルトの名無しさん
22/02/16 18:31:31.49 5G/Gik2e.net
ifのパラメーターにerrorlevelがあったのね
確かに環境変数使うより良さそう
PC起動時に毎回開きたいアプリを順番(前後関係あり)に開いてくだけだから基本startコマンドなのよね
665:デフォルトの名無しさん
22/02/16 18:32:09.18 5G/Gik2e.net
おーありがてえ
666:デフォルトの名無しさん
22/02/16 18:39:35.08 IpLn/l6Q.net
>>651
> 正常時に出力の無いコマンドはリダイレクトできないからエラーになるんじゃね。
どこからこんなアホな知識を仕入れたのか知らんが、そんな知識を開陳する度胸に感心したわ
667:デフォルトの名無しさん
22/02/16 18:44:42.98 91qDUo1j.net
>>655
if errorlevelは 以上 だから気をつけろよ
DOS時代の使い勝手重視だ
668:デフォルトの名無しさん
22/02/16 18:50:49.88 t0Nu4cH6.net
>>658
DOSだと、gotoしか書けなかったね
669:デフォルトの名無しさん
22/02/16 22:29:00.93 5G/Gik2e.net
>>658
以上なのか…
勘違いしそうだったわ気を付けよ…
670:デフォルトの名無しさん
22/02/20 02:07:07.44 UpXKcN5y.net
これなんでこうなるの?
echo abc 行末|findstr "^abc"
一致
(echo abc 行末)|findstr "^abc"
一致
echo abc 行末|findstr "行末$"
一致
(echo abc 行末)|findstr "行末$"
不一致
echo abc 行末| findstr /r /c:"^abc 行末$"
一致
(echo abc 行末)| findstr /r /c:"^abc 行末$"
不一致
元はこういう感じでハマっててやっと原因突き止めたんだけど理由が分からん
(for /L %%j in (1,1,%i%) do for /f "delims=/" %%a in ('echo "%%B_%%j%%"') do echo %%~a
)|findstr "^001a\.txt$" || echo ok
因みに /x オプションも駄目だった
('echo "%%B_%%j%%"') の部分も元は ("!B_%%j!") で単独では展開されてたのにパイプ繋ぐと展開されずハマってた
パイプ繋いだら遅延展開無効化されるん?
671:デフォルトの名無しさん
22/02/20 02:58:56.00 WlVIdNMt.net
(echo abc 行末)|findstr "行末 $"
は一致する
スペースが入るみたいだね
672:デフォルトの名無しさん
22/02/20 03:21:58.43 j5UZdGyh.net
>>662
それだと、空白は文字列のOR扱いで、"行末"と"$"のどっちかってことになる
が、まあそういうことだね
echo onの状態で実行してみりゃわかる
673:デフォルトの名無しさん
22/02/20 03:38:00.04 UpXKcN5y.net
ありがとう
(echo abc 行末)|findstr /r /c:"^abc 行末 $"
これで一致したから半角スペース入ってしまってるで間違いないみたい
674:デフォルトの名無しさん
22/02/20 03:42:58.59 j5UZdGyh.net
echo onでどう展開されるかみればどうしてそうなったのかわかるよ
675:デフォルトの名無しさん
22/02/20 05:28:05.67 UpXKcN5y.net
>>665
当然echo onでも確認してる
例えばこんなの
for %a in (a b c) do (echo %a|findstr "b$")
echo onでの表示では %a | とパイプとの間にスペース入るけどechoの末尾にゴミなんて付かないのよ
元のバッチやコマンドプロンプトの入力で以下のようにスペース入ってれば末尾にスペース入るけど上記のように詰めて書けば入らない
for %a in (a b c) do (echo %a |findstr "b$")
676:デフォルトの名無しさん
22/02/20 05:50:10.39 WlVIdNMt.net
>>663
ん?
空白区切りってダブルクォートを無視するの?
"行末(sp)(sp)$" で不一致になるから "行末(sp)$" に一致してるんだと思ったけど
677:デフォルトの名無しさん
22/02/21 23:05:19.75 J9914B5I.net
>>661
URLリンク(scripting.cocolog-nifty.com)
678:デフォルトの名無しさん
22/02/25 18:44:29.79 xURWaPVP.net
同じアプリのファイルを複数起動していて
コマンドラインが同じになっているとき
閉じたいものだけ閉じる方法ってありますか?
679:デフォルトの名無しさん
22/02/25 18:45:11.42 xURWaPVP.net
すいません、コマンドラインでなくプロセス名でした
680:デフォルトの名無しさん
22/02/25 20:06:56.37 zbdaU1gm.net
>>670
全く同じexeを複数起動してるんなら、プロセスID指定しかないけど
プロセスID見たってどっちが消したいexeなのか判別できる?
・リスト表示
tasklist /fi "IMAGENAME eq xxx.exe"
・削除
taskkill /pid 9999
パスが違うとかならパス情報を見るとかでプロセスIDを特定できる
wmic process list full format:csv|findstr "C:\foo\bar\baz.exe"
681:デフォルトの名無しさん
22/02/25 20:12:59.55 xURWaPVP.net
>>671
ありがとうございます
パスは違うので、その方法でやってます
助かりました
682:デフォルトの名無しさん
22/02/25 22:00:00.64 zbdaU1gm.net
>>672
もう出来たとは思うけど、上のだとfindstrも一緒に検出されるので出した責任として訂正しとく
for /f "tokens=6 delims=," %%i in ('wmic process list full /format:csv^|findstr "C:\bin\INET\Jane"^|findstr /v findstr') do set pid=%%i
tasklist /fi "pid eq %pid%"
683:デフォルトの名無しさん
22/02/26 12:26:06.99 2NOKllqN.net
>>673
ありがとうございます!
頂いたコードもとても参考になります
684:デフォルトの名無しさん
22/02/26 16:12:21.37 XLKEJl76.net
アクティブウィンドウ名がわかればいいんだね
vbaでできるらしいが