X

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
2020/08/15(土) 07:00:26.64ID:f3kW5kCx
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです

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

過去スレ
%13 http://mevius.2ch.net/test/read.cgi/tech/1542779527/
%12 http://mevius.2ch.net/test/read.cgi/tech/1489207631/
%11 http://echo.2ch.net/test/read.cgi/tech/1424858999/
%10 http://peace.2ch.net/test/read.cgi/tech/1374205515/
%9 http://toro.2ch.net/test/read.cgi/tech/1335015478/
%8 http://toro.2ch.net/test/read.cgi/tech/1315844420/
%7 http://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6 http://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5 http://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4 http://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3 http://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2 http://pc11.2ch.net/test/read.cgi/tech/1197881068/
【.cmd】 バッチファイルスクリプト %1 【.bat】
http://pc11.2ch.net/test/read.cgi/tech/1178281991/
バッチファイルプログラミング 3.bat
http://pc11.2ch.net/test/read.cgi/tech/1148485555/
バッチファイルプログラミング 2.bat
http://pc8.2ch.net/test/read.cgi/tech/1104911889/
バッチファイルプログラミング質問スレ
http://pc5.2ch.net/test/read.cgi/tech/1040614686/
2022/05/28(土) 23:50:47.54ID:Ee8LXfQh
皆さんありがとうございます
やはり表示が「正常に」→準備完了ではない以上、タスクは途中状態でしたか・・・この分では肝心のbatも実行されそうにありませんね

最初のSYSTEMによるタスクの場合、管理者権限での実行に不備があるようで、それでタスクは発動するもののbat動かずという結果になると判断していました
それでAdministratorsへ変更し、命令そのものが管理者によるものへ置き換え、これまでの経緯に至っています

>>827
く、詳しくお願いします・・・自分でも相当な時間をネット検索に費やしましたが実現できませんでした
特に1文字でも損なうと完成されない、引数関連が上手くいかなくて
昔ながらのbatなら自分にもギリ可能でしたので今に至ります
regなら管理者権限も関係なく値を変更してくれるので、それさえ可能なら一番楽なんですよね
2022/05/28(土) 23:51:00.59ID:Ee8LXfQh
ことの発端は配信の最適化であるDelivery Optimizationのサービス無効化です
そのサービスの0004化が、batの場合管理者権限必須らしく、batを通常起動しただけではスルーされてしまう
reg単体で行えず(自分は)、管理者権限必須で、それらを自動タスク化した場合が大変でした

該当サービスは100%テレメトリながら、散々な細かい検証をしたもののWU関連を全て止めなければ勝手に手動(トリガー)状態へ強制されます
そしてサービスが手動状態にあるとき、ディスクのクリーンアップ他を少しでも伴うとそこで実行されてしまう
ならばどうせカタログで更新しているし?とWU関連全て無効化したのですが、そうすると今度はエクスプローラーが常時CPU使用率5-10%くらいになり微ラグ
appxのwsappxがC:\ProgramData\Microsoft\Windows\AppRepositoryで無限増殖する現象と似ていますね、こちらも8-10%とゾンビし、WU全無効化のエクスプローラーより酷いラグを発生させる

OSと密接に絡んでいるのは痛感していますが、WUを生かしつつ、元から無効化しているストアに加えて電卓等も捨ててappxサービスを完全無効化(こちらは手動ゾンビなし)
あとは如何にしてエクスプローラーのバグを招かずにDelivery Optimizationの恒久的な完全無効化を成せるか、なんです・・・
830デフォルトの名無しさん
垢版 |
2022/05/29(日) 00:21:06.26ID:XW+WDPtU
>>811
File4は環境変数の末尾にスペースが入らない&&環境変数をダブルクォートでくくる目的
setに与えるコマンドラインとしては正当だが、&とかエスケープが必要な文字が入ると構文解析で事故るのでFile1と同じくやらんほうがいい書き方だったわ
2022/05/29(日) 00:28:55.06ID:NHtpNvxH
>>829
そもそもなんだけど、レジストリを書き替えただけでうまくいくのは確かめてるの?
通常レジストリの書き換えを反映するには、HKCUの場合ログオンが、HKLMの場合再起動が必要なはずだけど
あとユーザーにadmin資格を追加するのは出来ないの
資格があれば最上位の特権にチェックでいけると思うけど
2022/05/29(日) 00:44:54.89ID:Dh5s7alL
>>831
長年自分好みのregを作成し続け、発動そのものはパンピーチンパン頭なわりに経験則の積み重ねで上手くいっています
再起動の観点は盲点でした、その辺りも毎回あやふやでしたので再確認しないとですね
regのみでサービスが[無効]へ書き換えられるのを何度か目にしている気もしますが

reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DoSvc]
"Start"=dword:00000004

bat
sc stop DoSvc
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DoSvc" /v "Start" /t REG_DWORD /d "4" /f

SYSTEM最上位+C:\Windows\regedit.exe /s D:\aaa\bbb\ccc.regで新規タスクを設けたところ、正しく終了し、感触が良さげ
cmdのようなポップアップもありません、この環境で経過観察したいと思います

ただ、今気づきましたが、regは実行中のサービスを止める内容が抜けているので、その線も追加で調べ直します
reg書き込みで駄目ならsc stop特化のSYSTEM最上位batタスクを別途用意する必要がありそうですね
偶然にも、今までの調整が無駄になっていない様子で嬉しいです
2022/05/29(日) 01:40:32.51ID:MBI5r2Hn
対象がHKLMならSYSTEMタスクで普通にバッチ呼び出せばいいんじゃないの
っていうかレジストリいじらんでも「sc config DoSvc start= disabled」でいいんじゃないか
2022/05/29(日) 03:14:11.71ID:YV7/1RzI
文章に顕れている
835デフォルトの名無しさん
垢版 |
2022/05/29(日) 07:42:31.92ID:Dh5s7alL
幾つかあるOS連動のサービスは、それぞれで通常と異なる処置が求められるんですよ・・・
Delivery Optimizationもそのひとつ
今のwin10版はギリ対応可能ながらも、win11の現行はバイパスが削除されたり、これまたさらに面倒な様子で将来が不安

最初に書きましたが、SYSTEM最上位の単純な指定ではタスク上で「正常に」となってもサービス側が受け付けなかったんです
ネット情報だとSYSTEMアカウントに管理者権限が内包されているそうなんですけどね・・・
そこで試行錯誤の上、Administratorsで茶を濁していた→またSYSTEMタスクでやったらいいんじゃね?というのは堂々巡りになってしまいますわー

貴重な意見有難うございました
836773
垢版 |
2022/06/01(水) 01:09:04.33ID:ixkk/oFB
>>775
の続き

7-zip の一時・作業フォルダの指定

Command Line Switches
https://sevenzip.osdn.jp/chm/cmdline/switches/index.htm

-w Set Working directory

例には、-wc:\temp と書いてあるので、-wZ:/rartmp と書けばよい。
注意点として、-wz:/ の、-wとz:/の間に、空白を入れない事

-wだけを指定して、パスを指定しなかった場合、Windows の一時ディレクトリを使用する。
-wを指定しない場合、解凍元のフォルダを使うみたい
837デフォルトの名無しさん
垢版 |
2022/06/01(水) 06:20:00.46ID:L0Bj7AY3
ウヒ、プヒヒ・・・
reg手段は結局タスク発動のみが空振りするだけで、肝心のプログラムをサービス変更まで繋げることが出来ませんでしたわorz
引数云々の方法や自分が採った記述の成否・不備は定かではありませんが、まあ、涙目
引数の書き方など、ネット上にさえ適切な情報がなくこれは厳しいですな
カリキュラムや資格を取る過程などで自然と学ぶような内容なんですかね・・・そもそもタスクスケジューラへの強い関心が一般的な日本人の中に存在しないらしいです→グーグルロボット検索が拾えるサイトも無い

その涙目でまた振り出しに戻り、システム最上位のbat単純起動からやり直すと、なんと達成(・д・)
システムアカウントに含まれるバックグラウンド動作、最上位に含まれる優先度、そして内包されているらしい管理者権限
regについてもデスクトップから普通にクリックすると再起動無しで値を4へ変更可能でしたので、やはりスケジューラ登録の過程またはサービス仕様に問題があったようですね

何をもって今回、システム最上位が上手く機能したか不思議でなりませんが、そしてこれが今後もしっかり継続的に発動・反映してくれるか分かりませんが、
当面はAdministratorsで生じていた「cmdポップアップによるデスクトップ阻害」を得ることなくタスクが実行でき、サービスの値もきっちり変わり、嬉しく思います
ポップアップさえ無ければ1/1hでスケジューリングし、より高頻度にサービスを強制無効化可能ですので、快適

関連する中で色々と指導して下さった皆さん有難うございましたm(vv)m
2022/06/01(水) 06:50:47.32ID:2JSbHFne
レジストリ書き込み禁止にすりゃイイんじゃねーの?
知らんけど
2022/06/01(水) 09:39:14.46ID:HV/k13ls
質問
PIDが正しいとして taskkill /f /pid "%PID%" が失敗するケースって何かありますか?
現在以下のように書いてるのですが無駄だったらバカ臭いなと
taskkill /f /pid "%PID%" || (
echo エラーメッセージ
echo エラーメッセージ
echo エラーメッセージ
echo hoge.exe を終了汁!
pause
exit /b 1
)
840デフォルトの名無しさん
垢版 |
2022/06/01(水) 10:15:17.37ID:iPR+cHIm
https://docs.microsoft.com/ja-jp/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess
悲しいことに公式のドキュメントには何も書いてない

指定したPIDのプロセスが存在しない
(PIDを取得した後に正常終了したとかで起こりうる)
プロセスを殺す権限がない

ぐらいのはず
2022/06/01(水) 11:32:04.25ID:HV/k13ls
>>840
ありがとう
一応エラー判定残しといた方が良さそうですね
2022/06/01(水) 21:11:06.31ID:wWdJLXtL
プロセスは非同期だからエラーよりはkillした後の存在の有無を判定した方がいい
2022/06/02(木) 15:41:59.23ID:Bch8jX4P
>>839
プロセス側にも事情があり間に合わないなどでできないことは多い
live2chはkill、確認を数回繰り返してやっといなくなる
2022/06/03(金) 03:02:05.90ID:LtGyf47s
ちっきしょーうのAAを貼りたい気分

結局、Delivery Optimizationサービスの0004化はSYSTEM最上位アカウントだとすかしっぺになる
案の定ふりだしやんけwww
なら操作の引数で管理者権限を付与出来ないかと模索するも、ネット情報じゃ無さげ
cmd他、どれもコンテキストメニューなど、OSのUIから指定起動させる例ばかりでコマンド的なものがない
在るとしてもネット上で指南されるような内容ではないらしい

タスク上は「正しく終了しました」が初回のみ出て、それ以降は常に[次回の実行時刻]を更新するのみ=つまり発動さえしていない
該当するプログラム=batを自分でデスクトップから起動→cmd発動でもサービスが変わらず
同条件で右クリ→管理者権限で実行すると余裕の発動・・・

だからそれをタスクのバックグラウンドでやりたいんだよおおおおおおおおおおorz
SYSTEMアカウントはバックグラウンドで動作してくれるけど管理者権限をすかしっぺ、Administratorsアカウントは余裕で発動するけどバックグラウンドじゃない
どうしろっつーねん!SYSTEMアカウントが管理者内包ってのは都市伝説なのかああああ

天才様助けてー!
2022/06/03(金) 03:30:52.82ID:X5NsBG94
日記は日記帳へどうぞ

余計な修飾子や個人的感想が多く、読ませる気の無い文章
「わざわざ読んで頂き申し訳ございません」という謙虚さが皆無
長々とおまえの頭悪そうな臭い愚痴駄文を読んでやるほど暇じゃない
質問や説明は具体的、且つ、必要最小限、シンプルに
何なら箇条書きでも良いくらい
言葉は齟齬が生じないよう正確に
「発動」って何やねん
DQN特有の独自定義
まず正しい日本語と用語を学び直せ
2022/06/03(金) 03:34:09.46ID:X5NsBG94
> ネット情報じゃ無さげ
無かったら英語でググれ
いくらでも出て来る
2022/06/03(金) 03:52:08.48ID:oul3t3W9
他ユーザーのレジストリも弄れるってあっただろ
2022/06/03(金) 05:56:36.90ID:LtGyf47s
>>846
いつも英字でも検索しているんですけど、OS関連は意外に多く抽出されるものの、何故かタスクスケジューラに関してのみ微妙なんですよね・・・
検索ワードがシビアなのか、昨今不評なグーグル検索ロボットの偏向かもしれません
とはいえ2019年10月からガチテレメトリとなったyahooを利用する気にもなれませんし・・・
それだけ世間的な意味でタスクに関心がないのだと思いますorz

百歩譲って、system最上位アカウントに管理者権限を強制付与出来ればいいんですが
引数もタスクのようなbatに対したコマンドではなく(そもそもタスクの引数に関する指南が超少ない)、batの中で特定のプログラムを管理者権限で実行する方法ばかり見つかって意味無し

自分がデスクトップ上の右クリでbatを直接管理者権限実行させ、サービスの値が0004の状態はsystem最上位アカウントでも定刻の1時間刻みで「正常に終了」となる
0004を0004に上書きするbat(笑)は管理者権限の壁が無いようだw
この場合は次回の予定のみが更新されることもなく、しっかりと前回の実行結果を残す(1時間刻みで)

それが!WUか何かのOS強制により手動(トリガー)と改変されたとき、system最上位アカウントではフリーズしてしまう様子なんですよねorz
何なんだよ[配信の最適化]ゾンビ・・・ほんまキモいわ・・・
2022/06/03(金) 06:25:04.10ID:25hReR0t
文章力皆無なのに自分ではちゃんと書けてるつもりなんだろうなぁ・・・ほんまキモいわ・・・
2022/06/03(金) 06:33:18.50ID:oU3L37au
相手すんなよ...
851デフォルトの名無しさん
垢版 |
2022/06/03(金) 08:41:36.30ID:r3SSykMX
お前の書いていることが省略しすぎたり独自用語か混ざってたりで読むのに疲れる
書いてることからやりたいことの確認をしなきゃいけないし

> Delivery Optimizationサービスの0004化
特定のサービスの挙動を変えたいor止めたいらしいのがググってようやくわかった
0004が何を示してるか未だにわからん

> なら操作の引数で管理者権限を付与出来ないかと模索するも、ネット情報じゃ無さげ
> cmd他、どれもコンテキストメニューなど、OSのUIから指定起動させる例ばかりでコマンド的なものがない
ここでのお前がやりたいことは管理者特権を付与してコマンドラインを実行したい」でいいんだよな?

> タスク上は「正しく終了しました」が初回のみ出て、それ以降は常に[次回の実行時刻]を更新するのみ=つまり発動さえしていない
イベントビューアーで確認したんか?サービスの動作ログだよな?
852デフォルトの名無しさん
垢版 |
2022/06/03(金) 08:52:40.64ID:rHBirywu
cmdに管理者特権とかいう概念はないのでpowershellを経由するしかない。runasでググれ。
プロセスが管理者特権で動いているかはタスクマネージャーから確認できる(表示列を追加する必要があるが)

サービス関連は触ったことないから知らんが、cmdでいくら探してもないならpowershellから動かすしかないんじゃない?
2022/06/03(金) 10:14:29.24ID:84QuKkvW
そもそもの方法論がもうね
そこまでバカでそこまで必死なんだったらローカルグループポリシー使えよっていう
HomeならPro化すればいいだけなんだから
2022/06/03(金) 10:34:45.22ID:CIdSIcJr
動詞を指定して実行する事は他の言語でもできるけど、
powershell程には簡潔に書けないからね
2022/06/03(金) 10:42:06.97ID:CIdSIcJr
ちな0004はREG_DWORDの値4で場所的にそのサービスの無効を意味してる
こういうの知らないなら何のこっちゃだろうな
2022/06/03(金) 10:52:22.42ID:CIdSIcJr
一見高度な事の様で大した中身でもなく、文体が気持ち悪いから知ってる人がいてもスルーされる。
案の定相手にしてるのはルビキチだけ
857デフォルトの名無しさん
垢版 |
2022/06/03(金) 14:11:38.16ID:LtGyf47s
くっそワロた・・・
0004さえも理解に乏しい、知識量や発想力の人達へ向けて私は質問していたのだろうか^^;
runasなどもとっくに調べているし、グルポは超初期に実行済みで、Delivery Optimizationは突破してくるから今日に至っている話なわけで

こういうのも過去に書いているんですけど、虫食いで読んで適当に回答している方や、そもそもの知識量・発想・知能的な面で素人の私より劣っていそうな人が
いえ、これ以上は暴言になりそうですし省略しますわ
・・・バッチ専用スレとのことで、私も皆さんへ過大評価や虚像を抱いていたのかもしれません

powershell、完全に時代錯誤な私の知識・技量では厳しかったものの、これを機に学んでみましょうかね
batの代わりにps1か・・・自分に使いこなせるか不安ですorz
皆さん数々の意見を有難うございました
2022/06/03(金) 14:54:57.72ID:oCwyAce/
ごめんあんまり読んでないんだけど、対話が求められて自動化できない?のならdoskeyのマクロは試した?
GUIでのダイアログだったら無理だけど
2022/06/03(金) 16:20:46.55ID:gMGR7N6s
そもそも対象のサービスが無効にできない (ようにみえる) 類のものなのではないか?
2022/06/04(土) 00:01:31.51ID:qz14Jeu3
AWS の本にも、Windows サーバーの記述は、1% ぐらいしかない。
システムで、Windowsを使う香具師がいない

ファイル共有・Active Directory・タスクスケジューラ・Remote Desktop、
バッチ・コマンドプロンプト・PowerShell ぐらいが、簡単に紹介されているだけ

ほとんどがDocker を使う。DockerはLinuxの技術。
だから、Windows 10のWSL2 で、Linuxを使えるようにしている
2022/06/04(土) 03:03:41.49ID:nWFOJiT2
ソフト板のVLCスレで暴れてたガイジに似てるな
2022/06/04(土) 03:16:47.38ID:4DyQyO7v
SYSTEMアカウントで書き替えたら再起動が必要なんじゃないの?
2022/06/04(土) 14:29:54.55ID:bgz5gZEc
サービスの無効化なんか sc config でできるだろ
なんでわざわざレジストリを直接編集しなきゃいけないんだ?しかもSYSTEMで

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/sc-config

そもそもDelivery Optimizationを無効化したい理由は何なんだ
2022/06/04(土) 15:01:48.75ID:M0jEQKIa
ID:LtGyf47s みたいに要点を簡潔にまとめられず矢鱈とグダグダ書いちゃう人って何かそういう頭の障害でもあるの?
言葉遣いも変だし外国人なのかな
2022/06/05(日) 07:44:59.76ID:7J0TRviH
簡単なことを難しく言うやつを世間一般ではhorse and deerという
2022/06/05(日) 12:38:26.56ID:Z2t62Jo8
わざとか?
867デフォルトの名無しさん
垢版 |
2022/07/09(土) 18:11:33.95ID:qkG/5q2Z
以下のようにUNIXライクにFILESをパイプしてfindstrコマンドに渡すことは不可能でしょうか?

@echo off
setlocal enabledelayedexpansion
set LF=^

for /f "tokens=* delims=" %%x in ('dir /w') do set FILES=!FILES!%%x!LF!

@rem ↓FILESをパイプにしてfindstrコマンドの入力にしたい
for /f "tokens=* delims=" %%x in ('echo !FILES! ^| findstr "Siki"') do set TEST=%%x

pause
endlocal
exit /B 0
868デフォルトの名無しさん
垢版 |
2022/07/09(土) 18:16:36.89ID:GjOGWrlu
不可能です
2022/07/09(土) 18:31:41.95ID:qkG/5q2Z
不可能とのことなのでファイルに一旦出力することにしました

@echo off

setlocal enabledelayedexpansion
set LF=^


for /f "tokens=* delims=" %%x in ('dir') do set FILES=!FILES!%%x!LF!
echo !FILES! > aaa.txt

for /f "tokens=* delims=" %%x in ('type aaa.txt ^| findstr "Siki"') do set TEST=%%x

echo %TEST%

pause

endlocal
exit /B 0
2022/07/09(土) 18:32:57.07ID:qkG/5q2Z
でもこの例ならdir | findstrでいいですね…
2022/07/09(土) 18:38:08.89ID:qkG/5q2Z
本当にやりたかったことは

curlコマンドで某APIでJSONデータ取得
JSONデータをjqコマンドで値取得
取得した値からfindstrコマンドで余計な行を除去

としたかったのですが、某APIが叩ける回数が限られているため
JSONデータを取得する回数を抑えるために一旦配列として保持したかったのです
2022/07/09(土) 18:41:27.79ID:LLXk/I9Y
>>871
真面目な話そこまでやりたいならPowerShellとか使った方が楽だと思うぞ...
2022/07/09(土) 18:49:52.57ID:qkG/5q2Z
>>872
実はやりたいことがこれ以上の事は無いのでバッチレベルで可能だろうと思ったのですが
配列?の使い方がよく分からず質問しました
ひとまず一時ファイル出力して使いまわす形にしようと思います
ちなみに某APIとはスマートリモコンNature Remoの事です
2022/07/09(土) 18:54:25.52ID:NvGIH30g
powershellに一票
乗り換えを先延ばしにすればするほど損が積み上がる
2022/07/09(土) 18:59:09.92ID:NvGIH30g
判断のポイントはクッソ不便なbatを捨ててだいぶマシなpsに以降する時期をいつまで先延ばしにするかだけだと思う
2022/07/09(土) 18:59:46.81ID:qkG/5q2Z
時間ある時に勉強してみたいと思います>PowerShell
ググったらWin7時代から標準であってOSSになっててLinuxでも実行可能とか知りませんでした
割と長く銀行系にいるので頭が古いんでしょうね…
2022/07/09(土) 20:00:42.46ID:al4zTytR
Ruby では、外部コマンドのcurl を呼び出さなくてもできる

require 'open-uri'
require 'json'

url = 'http://〜' # URL

uri = URI.parse( url )
p obj = JSON.parse( uri.read ) # response body

例えば、外部コマンドのcurlを呼び出して、スクレイピングするなら、

require 'nokogiri'

command = `curl #{ url }`
html = `#{ command }`

doc = Nokogiri::HTML( html )
878877
垢版 |
2022/07/09(土) 20:05:46.69ID:al4zTytR
>>877
修正

>command = `curl #{ url }`
command = "curl #{ url }"
2022/07/09(土) 21:46:59.61ID:3uODqf9z
setlocal enabledelayedexpansion
set A0=
set i=0
for /f "delims=" %%a in ('dir /b^|findstr "Siki"') do set "A!i!=%%a" &set /a i+=1
if not defined A0 echo Not found.&pause&exit /b
set /a i-=1
for /L %%i in (0,1,%i%) do echo A%%i = "!A%%i!"
pause
2022/07/21(木) 23:21:25.81ID:3neYOO2a
set /a の結果とか与えた数値を16進表記に変換するコマンドか何か良い方法があったら教えて欲しいです
2022/07/22(金) 01:02:07.69ID:bfkyQVXg
>>880
bc.exe
2022/07/22(金) 01:14:08.48ID:bfkyQVXg
https://linuxjm.osdn.jp/html/GNU_bc/man1/bc.1.html
http://gnuwin32.sourceforge.net/packages/bc.htm
2022/07/22(金) 01:32:20.92ID:bfkyQVXg
@echo off
set /a a=123*456
echo a=%a%; obase=16; a | bc
pause
2022/07/22(金) 01:42:01.70ID:bfkyQVXg
echo obase=16; %a% | bc
でもいい
2022/07/22(金) 07:47:11.80ID:bfkyQVXg
set /a なら値は高々32ビットだよね
bc は不要かも

cmd /c exit /b %a%
echo %=ExitCode%
2022/07/22(金) 10:43:07.05ID:LvB8fWz+
ダントツ遅いが
powershell -c "'{0:x}' -f 255"
2022/07/22(金) 10:45:53.90ID:CXcliooi
obaseとかbcとか知らないことがいっぱい出ているな
2022/07/22(金) 11:33:23.34ID:RIaxNIcl
888
2022/07/22(金) 13:09:13.02ID:ZzUgbaoD
わざわざバッチでやるってことを理解してないアホがいる
pythonでも入れてろゴミ
2022/07/22(金) 13:12:16.30ID:P7NcnZ58
batだけで計算しても理解はされないだろうよ
2022/07/22(金) 15:55:27.20ID:bfkyQVXg
>>885 はバッチだけだよ
もし桁数が多いのをやりたいなら
過去のスレを探したらバッチがあるよ
2022/07/22(金) 18:11:09.86ID:5WL5LWhS
set /a n=1194684
if "%n%"=="0" set "r=0" &goto :END
setlocal enabledelayedexpansion
set HEX=0123456789abcdef
set /a "a=n&0xf, b=n>> 4&0xf, c=n>> 8&0xf, d=n>> 12&0xf, e=n>> 16&0xf, f=n>> 20&0xf, g=n>> 24&0xf, h=n>> 28&0xf"
set r=!HEX:~%h%,1!!HEX:~%g%,1!!HEX:~%f%,1!!HEX:~%e%,1!!HEX:~%d%,1!!HEX:~%c%,1!!HEX:~%b%,1!!HEX:~%a%,1!
:DEL_PADZERO
if %r:~0,1% equ 0 set "r=%r:~1%" &goto :DEL_PADZERO
endlocal &set r=%r%
:END
echo 0x%r%
pause
INT32の範囲で良いならバッチではこういうバカっぽいのが結局1番速いんじゃね?
レスアンカーが多過ぎと怒られたから右シフトの右にsp入れてる
2022/07/22(金) 19:27:14.02ID:bfkyQVXg
話変わるけど右シフトのすぐ右の数字は危険だよね
アンカーに解釈されるので2chで数値が変わる場合があるんだよ
2022/07/22(金) 22:42:20.46ID:AXmcGRlR
>>885,886,892
ありがとうございました
powershellは2回目以降だとそんなでも無いですが初回はどうしても遅くなるみたいですね

>>881-884
readline5.dll というのを落としてbcと同じ場所に置くことで動きました
日本語ヘルプ(https://linuxjm.osdn.jp/html/GNU_bc/man1/bc.1.html)が凄く助かりました!
echo sqrt(2) | bc -l
echo scale=10; 4*a(1) | bc -l
とかバッチに無い計算が出来て感動。面白かったのですがパイプで式を渡す時""で括れないので^&|などのメタ文字を
echo 8^^^^2 | bc
echo 8^^^&^^^&2 | bc
とか^エスケープしなければならないのが使いにくいのと
scaleで小数点以下桁数指定出来るのは良いのですが最下桁が四捨五入でも切り捨て切り上げでも無く変な値になったりとかが
惜しい感じですね
エスケープはファイルにして読ませれば良いし最下桁は自力で切り捨てれば良いだけですのでいずれ何かで役立つかも
ありがとうございました
2022/07/23(土) 09:18:41.04ID:WQSCizyX
エスケープは入力要求メッセージ(末尾改行無し)を使って回避する方法がある。
<nul set /p "=8^2" | 〜
※もし行(末尾に改行)が必要なら
<nul set /p "=8^2" | more | 〜
2022/07/23(土) 10:55:51.20ID:obFo1BRC
>>894
set "a=8^^2" & echo %%a%% | bc
2022/07/24(日) 07:30:05.93ID:oa53tMxs
>>895
目からウロコなTips
set /p <nul="8^2" | more | bc
で行けました
moreの代わりにfindやfindstrなどパイプで受け取って改行付加して吐けるコマンドなら使えるっぽい。他には以下とか
(set /p <nul="8^2"&echo=) | bc

set /p の改行無しecho の用法は知っていたんだけどこの局面で使える事に思い付けなかったのが悔しい
2022/08/13(土) 20:26:36.34ID:hShn1n51
コマンドからリモートホスト名とそのIPを取得出来ますか?
2022/08/14(日) 12:49:48.16ID:WvMv+Qf8
nslookup … DNSで調べる
ping … hostsとか諸々込みで実際にどう名前解決されるか
nbtstat … NETBIOS名なら
netstat … 通信で実際に使ってる自端末と相手のIPアドレス
ipconfig … 自端末の諸々
netsh … 自端末の諸々
900898
垢版 |
2022/08/14(日) 18:43:42.99ID:0tA/3KXA
各コマンドのヘルプ見たり試してみたけど良く分からなかった
WAN側IPとそのホスト名をコマンドから知れないか?を知りたかったんだけど無理そうですか?
nslookupで引数にIP指定すればホスト名は取れるんだけどIPをどうやって知ったら良いものか
2022/08/14(日) 19:35:36.51ID:R62l2k+7
>>900
状況がよくわからん
「WAN側IP」とか言ってるから自宅(自社)のルーターを自宅(自社)のLAN側から知りたいという話?
2022/08/14(日) 19:37:41.23ID:WvMv+Qf8
インターネット上の相手側から見える、自WANのWAN側IPアドレスって事?
例えば自端末がオンラインゲームのホストになる際に相手に教えるIPアドレス。

WAN側機器のWeb管理コンソールとか、
「診断くん」等のWebサービスをスクレイピングすればいいよ。
探せばAPIサービスなんかもあるかもね。
※Webサービス使うときは利用規約をよく読んでね。

既にIPアドレス知る方法を1つは知ってるようだから、その方法でもいいよ。
2022/08/14(日) 19:49:12.00ID:3lHTKQ6A
ホスト名とは何かという定義が必要だな

WEBサーバーなら複数のホスト名(URLのドメインパート)で同じ(時には複数の)サーバーに接続する
https://5ch.net/でアクセスされるサーバーなら 5ch.net がホスト名だが
同じサーバーが他のドメインもホストしているなら、他のホスト名も持っていることになる
あるサーバーが、接続され得るすべてのホスト名を知りたいと思っても、それは世界中のDNSの勝手なの、
漏れなく調べるためには、世界中のすべてのドメインのレコードを調べる必要があるので、実際には無理。

DNSの逆引きは、それを設定している人が必要な分を登録しているだけなので、すべてとは言い切れない。
2022/08/14(日) 20:04:12.33ID:zcJ+8Zbe
>>900
現在接続形態で多いのが、ルータの下にローカルネットワークでPCが繋がっているというもの
この場合、PCからはローカルネットワークが全てでありIPアドレスもローカルIPアドレスが使われる
グローバルWAN側のIPアドレスを知りたいのなら
ルータにログインしてアクセスして情報を貰うか、
webのIPアドレスを教えてくれるサイトから情報を取ることになる
つまり>>902の言うとおり
2022/08/14(日) 20:07:44.49ID:0tA/3KXA
そうです。自分のインターネット側のIP
ルーター管理画面のWAN側IPです
これをコマンド(LAN側のマシン)から調べる方法が無いのかなって
> Webサービスをスクレイピング
これってコマンドでやる方法あります?
NECのなんですけどルーター管理画面から取れるのかな?
ちょっとググったりしてみましたけど簡単なバッチくらいしか使えない自分にはハードル高いかも
2022/08/14(日) 22:44:27.94ID:zcJ+8Zbe
>>905
curl.exeを持ってこないといけないけど
診断君のスクレイピングだと
@echo off
curl.exe http://taruo.net/e/ -s -o "res.tmp"
for /f "tokens=*" %%i in ('findstr "<TD><tt>" res.tmp') do set host=%%i&goto :get_ip
:get_ip
for /f "skip=1 tokens=*" %%i in ('findstr "<TD><tt>" res.tmp') do set ip=%%i&goto out
goto :eof
:out
for /f "delims=<> tokens=3" %%i in ("%host%") do set host=%%i
for /f "delims=<> tokens=3" %%i in ("%ip%") do set ip=%%i
set ip=%ip:~0,-2%
echo HOST NAME = %host%
echo IP ADDRESS = %ip%
2022/08/14(日) 22:55:35.81ID:zcJ+8Zbe
>>905
何も要らないが、powershellを使わないといけない
(なおwebアクセスで診断君以外ではtls1.2を有効にしないとダメなことが多い)

$res = wget http://taruo.net/e/
if ($res.content -match "REMOTE_HOST<\/TD>\n<TD><tt>(.+)<\/tt>[\s\S]+?REMOTE_ADDR<\/TD>\n<TD><tt>([.\d]+)" ) {
$host_name = $matches[1]
$ip_address = $matches[2]
}
$host_name
$ip_address
2022/08/15(月) 00:00:17.27ID:xwOg3pSS
>>906-907
ありがとうございます
curl.exe はなぜか 7.55.1.0 が system32に入ってました
参考にルーター管理画面から取得出来ないか試して無理だったら使わせて頂きます
2022/08/15(月) 02:02:49.45ID:xwOg3pSS
お陰様でコマンドから確認出来るようになりました。この度は本当にありがとうございました
for /f "skip=301 tokens=4 delims=< " %a in ('curl http://admin:admin@192.168.0.1/index.cgi/info_main_set -s') do (for /f "skip=3 tokens=2" %b in ('nslookup %a') do @echo %b)&pause

pauseからCtrl+Cで止めているのですが、breakはバッチでgotoしないと無理ですよね?
2022/08/15(月) 08:55:40.32ID:3ogXO4Oz
call :ラベル名 で処理を呼び出して exit /b を break として使うこともできるよ
2022/08/15(月) 21:05:50.46ID:Z47lvB2J
>>909
breakしたい、というか302行目だけ欲しいってことかな。
findstrで行番号振って、さらにfindstrで目的の行だけ取るって方法があるよ。

for /f "tokens=4 delims=< " %a in ('curl 〜 -s^| findstr /rn /c:"^"^| findstr /r /c:"^302:"') do
2022/08/16(火) 15:31:14.62ID:RClv+rPW
>>911
for /f "tokens=5 delims=< " %a in ('curl http://admin:admin@192.168.0.1/index.cgi/info_main_set -s ^| findstr /n "^" ^| findstr "^302:" ') do for /f "tokens=2" %b in ('nslookup %a ^| findstr "名前 Name"') do echo %a : %b

ありがとうございます。Ctrl+C する必要無くなりました
skip=301付けたままのうっかりミスのせいで上手く動かない原因を文字コードがEUC-JPだからfindstrが機能しないのだと勘違いし文字コードを変換する外部ツールnkf.exe入れたり明後日のことしてハマってました
目的が何行目か決まっている時は最良の方法かもですね
行番号列挙する必要がありますが複数行でも使えますし
2022/08/27(土) 21:14:13.99ID:S8eeCUJc
文字列の入った変数から、その文字数を高速に取得したいんですが
なにか良い方法はありますか? 上限は8189です
2022/08/27(土) 22:59:03.27ID:OpG+r6e/
if "%s:~4095,1%"=="" (4095文字より少ない) else 4095文字よりも多い

:4095未満
if "%s:~2048,1%"=="" (2048より少) else 2049以上4095未満

:4095以上
if "%s:~7042,1%"=="" (4095以上7042未満) else 7042以上

こんな感じでifを入れ子にでもサブルーチンにでもしてある程度どの範囲にあるか詰めてからカウントすれば?
8189文字で正常に動くかは忘れた分からん
カウントは 遅延展開で if "!s:~%N%,1!"=="" って感じで Nを+1してループさせればいい
2022/08/27(土) 23:07:32.10ID:S8eeCUJc
>>914
ありがとうございます。参考にさせていただきます
ちなみに8189はcmdの仕様による限界です
2022/08/27(土) 23:22:13.27ID:VY6ZsFbR
>>913
> 高速に取得したい
バッチでやるのはやめた方がいいかと
2022/08/27(土) 23:24:42.08ID:OpG+r6e/
setだかcmdの構文解析だかの引数の文字数上限が8191 (0x1fff) とかで "s=" で2文字必要だから8189とかだったかな
変数名が単一文字で無かったり "" で囲ったりしても使用可能文字数減るはずだし
forやifの中で展開出来なかったりしたと思うから
限界探るなら一見使えているように見えてもちゃんと確認しといた方が良いよ
2022/08/27(土) 23:49:06.77ID:OpG+r6e/
4096 -> 2048 -> 1024 -> 512 -> 256 -> 128 -> 64 -> 32
if で8回くらい判定させればそれなりに速く出来ると思う
256分割。。
オフセットも変数にしてループするとか
512で真だったら /2 偽だったら *1.5 (set /a N=N/2+N) てな感じで
2022/08/28(日) 00:01:54.99ID:hYNZdTyV
>>913
set s=abcdefg
setlocal enabledelayedexpansion
set n=0 & if defined s (set /a "n=1<<13"
for /L %%i in (12,-1,0) do (set /a "a=n-(1<<%%i)"
for %%j in (!a!) do if "!s:~%%j,1!"=="" set n=!a!))
echo !n!
2022/08/28(日) 00:18:39.63ID:8DkHE3ui
なるほどなー
set n=!a! や set /a "a=n-(1<<%%i)"
これがパッと出て来るなんて頭良いですね
2022/08/28(日) 10:26:23.19ID:+w1wfoOM
たとえばファイルサイズを
%~z1 でなくfilename.sizeみたいなわかりやすい書き方に
する方法はないですか
922デフォルトの名無しさん
垢版 |
2022/08/28(日) 10:36:37.74ID:FcIb+N5t
バッチファイルにわかりやすい書き方なんてものがあったら、俺の髪はもっと残ってた
2022/08/28(日) 11:08:55.91ID:CaouF0NP
バッチの基本的な考え方としては基本コマンドにこだわらず外部コマンドを呼ぶことだと思う
セキュリティ的に外部コマンドは入れられないといった制約があるならこのレガシーツールを使い続けるのは無理がある
現実解のひとつはPowershellのワンライナーを呼ぶことで
そうやって少しずつ学んでるうちに段階的にbatを卒業することだと思う
2022/08/28(日) 11:23:21.78ID:+w1wfoOM
>>923
ありがとうございます
やはり無理なのか、aliasesなどを使った名案があればいいのに
Powershellはコマンド名が長すぎて使う気になれない
外部コマンドやツ-ルを使えば簡単でもセキュリティ的に問題があるかわからないので使いたくない場合がある
2022/08/28(日) 11:41:21.61ID:3aiLuiYL
エイリアスもどきはあるよ
マクロファイルに定義を書いておいて一斉に登録することもできる
doskey /?
あとpowershellにはエイリアスがある
2022/08/28(日) 15:23:54.30ID:CaouF0NP
Powershellは単に慣れと食わず嫌いの問題やね
cmdも無数の気持ち悪いルールがあるし現にたかが文字を数えるだけで呪文めいたコードが必要になってる
何にせよ人間慣れれば気にならなくなるもの
さすがにあと5年で定年だからプログラミングしなくなりますなんて老人には勧めんけどね
コマンドの長さとエイリアスについては
俺はGet-ChildItemはダルいからdirやlsと書くし
ForEach-Objectの代わりに%と書き続けてる
2022/08/28(日) 15:36:49.18ID:3aiLuiYL
powershellの弱点は初期起動に時間が掛かるという点だね
通常的にpowershellを使ってるならいいけど、
それこそ特定の処理だけたまに使うという人にはそこがネックになる
そういう場合はもうオブソリュートだがWSHがいい仕事をする
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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