1 名前:デフォルトの名無しさん mailto:sage [2020/08/15(土) 07:00:26 ID:f3kW5kCx.net] 拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる 質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです ※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう 過去スレ %13 mevius.2ch.net/test/read.cgi/tech/1542779527/ %12 mevius.2ch.net/test/read.cgi/tech/1489207631/ %11 echo.2ch.net/test/read.cgi/tech/1424858999/ %10 peace.2ch.net/test/read.cgi/tech/1374205515/ %9 toro.2ch.net/test/read.cgi/tech/1335015478/ %8 toro.2ch.net/test/read.cgi/tech/1315844420/ %7 hibari.2ch.net/test/read.cgi/tech/1298873550/ %6 hibari.2ch.net/test/read.cgi/tech/1277465356/ %5 pc12.2ch.net/test/read.cgi/tech/1242268171/ %4 pc12.2ch.net/test/read.cgi/tech/1229955189/ %3 pc11.2ch.net/test/read.cgi/tech/1217860043/ %2 pc11.2ch.net/test/read.cgi/tech/1197881068/ 【.cmd】 バッチファイルスクリプト %1 【.bat】 pc11.2ch.net/test/read.cgi/tech/1178281991/ バッチファイルプログラミング 3.bat pc11.2ch.net/test/read.cgi/tech/1148485555/ バッチファイルプログラミング 2.bat pc8.2ch.net/test/read.cgi/tech/1104911889/ バッチファイルプログラミング質問スレ pc5.2ch.net/test/read.cgi/tech/1040614686/
744 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 17:50:28.17 ID:iLyScgaF.net] >>733 できました ありがとうございます
745 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 18:36:17.23 ID:i7g3Seu6.net] いつまでこんなレガシー機能を使い続けるの
746 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 11:21:00.70 ID:PhhBhq60.net] >>736 powerShellがダブククリックで使えないし
747 名前:デフォルトの名無しさん [2022/04/18(月) 11:27:46.45 ID:t3NwdXGg.net] シンプルだからこそC++でジェネレートした.batを目視確認してから実行とかしやすいわけで
748 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 13:50:09 ID:OF8RRP9C.net] >>730 どう書けばいいですか?
749 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 14:16:43.44 ID:74jROqLf.net] すでにあるコマンドを使うというのは楽でいい もう少し細かいことをしたいと思うと苦労するけど
750 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 03:57:14.74 ID:RFdms0p+.net] PAUSEコマンド関連で質問です バッチファイル中にPAUSEコマンドを入れるとそこでキー入力を待ちますが、 その延長で ・エクスプローラでダブルクリックされて起動された場合はPAUSEで止める ・コマンドプロンプトから起動された場合は止めない ということをしたいです PAUSEコマンド自体には何もオプション等は無いようなのですが、何か方法はありますか 環境変数等をみて動作を切り替えることができないか調べてみましたが、 どちらの方法で起動されても同一なようで、悩んでおります
751 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 05:42:50.53 ID:q7JwT6An.net] >>741 >>446
752 名前:デフォルトの名無しさん [2022/04/20(水) 07:19:49 ID:Cwlkz3kl.net] コマンドプロンプトを起動するときのショートカットに/k:autoexec.batを入れて autoexec.batの中でset not_double_click=true そしてダブルクリックで起動するバッチの中で if not "%not_double_click%"=="true" pause とか、どうかな
753 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 09:15:24.62 ID:RFdms0p+.net] >>742-743 回答どうもです なるほど、ショートカットを作り、そこに判定の仕掛けを入れる、という方式ですね ツールを配布するときは、ショートカットの設定やコマンドプロンプトの設定を するためのインストーラが必要になりそうですね… バッチファイル単体でどうにか…と思いましたが、検討してみます
754 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 09:26:15.67 ID:q7JwT6An.net] >>744 いやいや、そんな面倒なことしなくても >>446 からの流れで %cmdcmdline% 見て判定する方法書かれてるでしょ ID:lVKoKJNl
755 名前:デフォルトの名無しさん mailto:sage [2022/04/21(木) 14:21:13.38 ID:asEavXVa.net] 昔の友は 今も友 俺とお前と(デンデン)大五郎
756 名前:デフォルトの名無しさん mailto:sage [2022/04/21(木) 16:29:36.51 ID:7MR/4l0o.net] ちゃん!
757 名前:デフォルトの名無しさん mailto:sage [2022/04/24(日) 09:15:29.28 ID:vcjjnxKB.net] >>739 setlocal enabledelayedexpansion set n=0 for %%a in (%*) do set /a n+=1 if %n% GTR 64 >&2 echo ERROR: Args is Max limit 64 exceeded.&pause&exit /b 1 set A=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$+-/:@[]_{} set i=0 for %%a in (%*) do for %%b in (!i!) do for /f %%c in ("!A:~%%b,1!") do ( set "CMD_FOR=!CMD_FOR!for /f "usebackq delims=" %%%%c in (%%a) do " set CMD_OUT=!CMD_OUT!,%%%%c set /a i+=1 ) %CMD_FOR%echo %CMD_OUT:~1% pause&exit /b 0 引数最大64個になってるけどfor変数のリストset Aを追加すれば増やせる 実際にどこまでforを多段に出来るかは知らない コマンドの文字数制限とかあったような気がする
758 名前:721 mailto:sage [2022/04/24(日) 11:08:56.51 ID:IqM9oVR7.net] >>748 頭に@echo offをつけやってみました 10万行ぐらいの出力ファイルを ローカルHDDに作ると 721では30分、 748では5分以内 (いつ終わったか分からないため) となりました ファイルのお尻になんか1行 ついてるのはご愛敬
759 名前:デフォルトの名無しさん mailto:sage [2022/04/24(日) 19:27:47.47 ID:lnSwl1A7.net] そこまで変わるのか
760 名前:デフォルトの名無しさん mailto:sage [2022/04/24(日) 23:16:01.47 ID:YqrbVxmA.net] .>>721 もよくわからないが>>748 もよくわからなかった こういうのよくないと思うの
761 名前:デフォルトの名無しさん mailto:sage [2022/04/24(日) 23:53:10.74 ID:/3xv87ig.net] この程度で分からんとか流石にそれはおまえの頭が悪すぎだろう
762 名前:デフォルトの名無しさん mailto:sage [2022/04/25(月) 23:47:31.88 ID:3ou64YUW.net] >>748 の解説オナシャス!
763 名前:デフォルトの名無しさん mailto:sage [2022/04/26(火) 00:02:39 ID:/dRsx73H.net] >>753 引数の数だけ >>725 みたいなコマンドを生成して実行してるだけ set "CMD_FOR=!CMD_FOR!for /f "usebackq delims=" %%%%c in (%%a) do " set CMD_OUT=!CMD_OUT!,%%%%c %CMD_FOR%echo %CMD_OUT:~1% で察せ
764 名前:デフォルトの名無しさん mailto:sage [2022/04/26(火) 00:45:33.71 ID:EhTMueYx.net] いや特にその2行が意味不明で察せないんだわ
765 名前:デフォルトの名無しさん mailto:sage [2022/04/26(火) 01:04:14 ID:/dRsx73H.net] 1、2行入れたList.txt用意してecho onで実行して追ってみればどこがどうなってるのかくらい池沼でなければ分かるでしょ
766 名前:デフォルトの名無しさん [2022/04/26(火) 2
] [ここ壊れてます]
767 名前:3:13:58.40 ID:AEcCnDU9.net mailto: フォルダの中にファイルが10個以上あったらタイムスタンプが一番古いファイルを削除する処理をバッチファイルでどう書くかどなたか教えろください。。 [] [ここ壊れてます]
768 名前:デフォルトの名無しさん mailto:sage [2022/04/26(火) 23:29:20.25 ID:OAZlYJMq.net] >>757 ジャバスクリプト使え
769 名前:デフォルトの名無しさん mailto:sage [2022/04/27(水) 01:07:40.77 ID:c7tqZe1K.net] dirでソートしたのをforでskipしてdelすればいいんじゃね
770 名前:デフォルトの名無しさん mailto:sage [2022/04/27(水) 01:13:28.18 ID:4aF/byUR.net] バックアップファイルでも溜め込んでるのかな?
771 名前:デフォルトの名無しさん mailto:sage [2022/04/27(水) 01:13:59.63 ID:CxYG3qjN.net] pushd, popdは出口exitがたくさんあったり、あちこちgotoしたりすると つじつまがあわなくなることがある そういう時は%cd%でフォルダ位置を覚えておき、最後そこに戻すほうが気分的に楽
772 名前:デフォルトの名無しさん mailto:sage [2022/04/27(水) 03:00:29.08 ID:itKYtkFa.net] >>757 for /f "skip=9 delims=" %%a in ('dir /a-d /b /o-d') do del "%%a"
773 名前:デフォルトの名無しさん mailto:sage [2022/04/27(水) 18:14:04.80 ID:pviHRewB.net] >>757 Ruby で書いてみた。 DryRun なので、実際にはファイルは削除されません require 'fileutils' # 絶対パスのディレクトリ名の後ろに、* を付けること! # . で始まる、隠し directory, file を除く dir_path = "C:/Users/Owner/Documents/test/*" # そのディレクトリ内の全てのファイルパス・更新時刻を取得する。 # [ ファイルパス, 更新時刻 ]の配列の配列を戻す def collect_filepaths_and_mtime( dir_path ) Dir.glob( dir_path ) .select { |full_path| File.file?( full_path ) } # ファイルのみ .map { |full_path| [ full_path, File.
774 名前:stat( full_path ).mtime ] } # [ ファイルパス, 更新時刻 ] end temp_ary = collect_filepaths_and_mtime( dir_path ) if temp_ary.length >= 10 temp_ary.sort_by! { |ary| ary[ 1 ] } # 更新時刻の古い順でソート # p temp_ary FileUtils::DryRun.remove( temp_ary.first[ 0 ] ) # 削除 else puts "ファイル数は#{ temp_ary.length } です。処理するファイルはありません!" end [] [ここ壊れてます]
775 名前:デフォルトの名無しさん mailto:sage [2022/04/29(金) 11:23:44 ID:X7f5QGPR.net] powershell gci -File | sort -P LastWriteTime -D | select -Skip 10 | %{ del $_.FullName -Fo}
776 名前:デフォルトの名無しさん mailto:sage [2022/04/30(土) 11:02:51.79 ID:usL/g0YR.net] >>748 for /L 129個でやってみた 流石に途中で止めたけど以下で問題無く動いているようだから for の段数自体に制限はなさそう 文字数制限は過去ログで set が8190文字とか見たような cmd.exe が1度にパース出来る文字数なのか setコマンドの制限なのかは分からないけど前者ならそこが限界になるね @echo off setlocal enabledelayedexpansion set $$$=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$+-/:@[]_{}。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚'\ set iii=0 for /L %%a in (1,1,129) do for %%b in (!iii!) do for /f %%c in ("!$$$:~%%b,1!") do ( set "CMD_FOR=!CMD_FOR!for /L %%%%c in (0,1,1) do " set CMD_OUT=!CMD_OUT!%%%%c set /a iii+=1 ) copy nul out.txt >nul echo "%CMD_FOR%>>out.txt echo %CMD_OUT%" %CMD_FOR%>>out.txt echo %CMD_OUT% pause&exit /b
777 名前:デフォルトの名無しさん mailto:sage [2022/05/06(金) 05:51:24.45 ID:QgRBAFzX.net] Dracura配色にしたら目に優しくオサレになった https://draculatheme.com/contribute PowerShellとかWindows Terminalとかのテーマもいろいろある https://draculatheme.com/
778 名前:デフォルトの名無しさん [2022/05/08(日) 05:37:23.76 ID:L9rI0dwl.net] お助けくださいm(vv)m タスクスケジューラにAdministrators最上位権限の6時間おき無期限タスクを設置しました エラーなども解決し、やっと定刻に指定したタスクを実行するよう調整出来たのですが、対象となるregファイルの起動≒実行ではなく「次のプログラムを使って開く」的なダイアログ表示になってしまいます OS上ではダブクリで処理していた内容なので盲点でした スケジューラでregファイルを使用しレジストリの改変を定期的に行う場合、操作の記述はどのようにすれば宜しいでしょうか? それか、当該regファイルを実行するためのバッチファイル記述を願いたいです スケジューラでバッチ実行を指定する方法はネット上にも複数ありました reg系は散々ググっても検索に出ないのが辛いですね アドバイスお願いしますm(vv)m
779 名前:デフォルトの名無しさん [2022/05/08(日) 06:42:10 ID:21iaPdPG.net] >>767 単に regedit %1 すりゃいい話じゃなくて?
780 名前:デフォルトの名無しさん [2022/05/08(日) 07:07:27.41 ID:L9rI0dwl.net] レジストリ等は長年平気で触っているくせに、コマンド的な知識・技量ともに不足しており、コピペやポン入れ以外の微調整が出来ませんでした XPか7時代に作った ---------- @echo off echo. echo ========================================== echo 「高速スタートアップを有効にする」の無効化 echo ========================================== echo. rem -----「高速スタートアップを有効にする」の無効化 ----- reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power" /v "HiberbootEnabled" /t REG_DWORD /d "0" /f pause exit ---------- を発見し、そのままreg用バッチとして該当箇所コピー入れ替え→余裕のタスク発動→regも無事改変されました 元のソースがあるからこその応用ですが、スレをお騒がせして申し訳ありませんm(vv)m コピペ文化は自業自得ながらも辛いものがありますね
781 名前:デフォルトの名無しさん mailto:sage [2022/05/10(火) 23:03:26 ID:gcxSlYEt.net] フリーランスに立ちはだかる「常駐」の壁。慣例を打ち壊し、 “テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡 リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、 業務委託契約の求職者と企業をマッチング 1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の 人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現! 『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル 副業・兼業マッチングサービス「クラウドリンクス」登録者数2万人突破 中小企業で進む副業人材の採用、96%が継続採用を希望 茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金 長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給 フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の 『ものづくり・商業・サービス補助金』とは?概要や条件を解説
782 名前:デフォルトの名無しさん [2022/05/19(木) 11:35:25.20 ID:aWExf7Ea.net] C:\Freesoftというフォルダにtest.rarというファイルが置いてあって、 それをwinrarの64bit版で Z:のルートにフォルダを作らずそのまま解凍させるというようなbatファイルが欲しいのですが 誰か記述例を教えてください。 当方batファイルに関しては無知です
783 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:12:20.87 ID:aAlRquen.net] >>771 winrarの64bit版はどこにあるの? そのパス名がわからないと記述例が書けない
784 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 14:15:05.74 ID:Rn3o2leA.net] Ruby スクリプト内で、7-zip を呼び出す場合、 dest_dir に、a フォルダが作られて、その中に再帰的に階層が作られる。 ここで、aフォルダが作られず直接、tmp フォルダ以下へ展開されるオプションは、7-zipでは探せなかった zip7_exe = "C:/Program Files/7-Zip/7z.exe" archive_path = "C:/Users/Owner/Documents/test/a.zip" dest_dir = "C:/Users/Owner/Documents/tmp" # Program Files には半角空白があるので、"〜" で囲む。 # x で解凍する。-o で解凍先のフォルダを指定する puts %x("#{ zip7_exe }" x -o#{ dest_dir } #{ archive_path }) # 解凍 つまり、コマンドプロンプトでは、 "C:/Program Files/7-Zip/7z.exe" x -oC:/Users/Owner/Documents/tmp C:/Users/Owner/Documents/test/a.zip ここでの注意点は、Program Files には半角空白があるので、"〜" で囲む事と、 -oC:/ の、-oとC:/の間に、空白を入れない事 ここで、C:/Program Files/7-Zip を、Windows のユーザー環境変数パスに追加すれば、 絶対パス無しで、7z コマンドを使えるので、 7z x -oC:/〜 C:/〜 と書ける もし、xではなく、e オプションを使うと、 dest_dirにアーカイブの階層をフラットにして、すべてのフォルダ・ファイルを展開する! フォルダ構成を無視して解凍する! 限定的な使い方だが、アーカイブが再帰的なフォルダ構成ではない場合には、 これで、aフォルダが作られず直接、dest_dirフォルダへ展開できる! RAR は試していないが、a.zipの代わりに、a.rarとすれば、 拡張子から自動判別して、解凍できると思う
785 名前:デフォルトの名無しさん [2022/05/20(金) 09:45:16.10 ID:lLlVMTfc.net] >>772 C:\Program Files\WinRARのフォルダの中にWinRAR.exeがありますが 別に7zipででもzipでもrarでもかまわないという感じです。 >>773 ありがとうございます。 すいませんがこちらの勘違いで置き場所を間違ってたので変更させてください。 Yドライブ(外付けハードディスク)のsoftというフォルダにabc.zip(ファイル名は仮の名前) というファイルがあるとして 「Y:\soft/abc.zip」 このabc.zipをZドライブ(RAMディスク)上にbatファイルダブルクリックで解凍したいです。 解凍の際にそのまま解凍でもフォルダを作ってそこに解凍ででもどちらでもかまわないです。 7zipはさっきインストールしました。 7zipと winrarはともに一時ファイルの作成場所をZのtempフォルダに指定してあります 「Z:\rartmp」←こんな感じ。 この場合のbatファイルはどうなりましょうか? なぜbatで解凍したいかというと、某フリーソフトなんですが更新が頻繁にあって、更新の通知に対してYESを選ぶと小さいサイズの ファイルを6000個以上書き込むみたいで、更新するのに20分ぐらいかかります。 それだったら更新の通知が来るたびにキャンセルして公式サイトから最新版のzipファイルを入手して RAMディスク上に解凍したのを起動させたほうが、短い時間ですむんじゃないかという考えです
786 名前:773 mailto:sage [2022/05/20(金) 12:29:11.62 ID:SIlSZC9T.net] 773 に書いてあるけど、 Program Files には半角空白があるので、実行ファイルの絶対パスを、"〜"で囲む "C:/Program Files/WinRAR/WinRAR.exe" 引数1 引数2 ここで、C:/Program Files/WinRAR を、Windows のユーザー環境変数パスに追加すれば、 絶対パス無しで、WinRAR コマンドを使えるので、 「WinRAR 引数1 引数2」と書ける ダブルクリックで起動したいのなら、 デスクトップにショートカットでも作れば? 例えば、773 のRuby スクリプトが、 C:/Users/Owner/Documents/Ruby/script.rb にある場合、 ショートカットのリンク先 C:\Windows\System32\cmd.exe /k "ruby C:/Users/Owner/Documents/Ruby/script.rb" これは、コマンドプロンプト・cmd.exe を起動して、 ruby コマンドで、script.rbを実行する (注意! 書き込めないので、cmd を英小文字に変換して下さい) 他には、VBScript でも、ダブルクリックで起動できたと思う。 漏れは、bat は知らないから、バッチファイルをダブルクリックで起動できるかどうかは知らない 7-zip のオプションで、一時ファイルの作成場所の指定も、見たような気もする。調べて下さい ただ、7-zipの7z.exe はコマンド用じゃなく、画面操作用だから、 必ず、解凍先フォルダは空の状態で始めて下さい! そこにファイルがあると、同じ名前の場合に、上書きしますかとか聞かれて、コマンドが止まる だから本当は、7-zipのコマンド用実行ファイルを使った方がよいかも
787 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 20:38:33.57 ID:8qofalUL.net] バカの話は必ず長い (宝島社新書) 櫻井 弘
788 名前:デフォルトの名無しさん [2022/05/20(金) 20:50:08.11 ID:zxJBX/+G.net] と、バカが申しております。
789 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 23:38:55.76 ID:MePC0rUW.net] バカって言う人は自分がバカなんだよ? 幼稚園児でも知ってるのに
790 名前:デフォルトの名無しさん [2022/05/21(土) 06:37:24.42 ID:55Td3nWK.net] と、幼稚園児が申しております。
791 名前:デフォルトの名無しさん mailto:sage [2022/05/21(土) 06:53:52.00 ID:/PQRaHnB.net] ブログでやれよって感じ
792 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 18:17:57.65 ID:RDTYjvSl.net] rarを解凍する機会なんてそんなないのにbatが欲しい?しかもbatファイルに関しては無知?妙だな…
793 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 07:47:47.45 ID:Lvn387tn.net] forのin部で wmic を使って文字列取得しようとするとdo以後のコマンド類がバグる for /f "tokens=2 delims==" %%a in ('wmic process where "name=\"hoge.exe\"" get CommandLine /value 2^>nul^|find "CommandLine"') do set RUNEXE=%%a と最小限に留めたらecho on でプロンプトが削れて表示は少しおかしいものの一応動作はした でも「バグってるものがたまたま動いてるだけ」の状態が心情的に嫌なので代替手段があれば教えて欲しい やりたい事は特定のexeが実行中か否か D:\app\a\hoge.exe が実行中かどうかを調べたいとして D:\app\b\hoge.exe のような別ディレクトリにある同名のexeは実行中でもOK tasklistだとhoge.exeが稼働してるかどうかは調べられるけどどのディレクトリのモノまでかは特定不能のよう
794 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 07:58:02.47 ID:Lvn387tn.net] forで取らずにリダイレクトして一旦TMPファイルに書き出せば良いんだろうけどなんか負けた気がするのでそれは最終手段
795 名前:デフォルトの名無しさん [2022/05/23(月) 09:22:19.13 ID:vgqZRn8w.net] パイプを犯人扱いしてfor内でifしちゃうのもありかな? あと細かいけど"set RUNEXE=%%~a"としないとスペースとかで死ぬ
796 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 09:32:45.04 ID:Lvn387tn.net] >>784 パスにスペースを含む場合、%%~aが利かない 頭の"だけ除かれてケツの"だけが残る罠 あとパイプ無くてもバグる
797 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 12:58:34.94 ID:Lvn387tn.net] 自己解決 > %%~aが利かない はケツにスペース入ってたから バグるのは文字コード上の問題のよう scripting.cocolog-nifty.com/blog/2009/09/wmic-6efe.html パイプだと改行コードがおかしくなるだけらしいけどその後のコマンド類がおかしくなるのは不明 URL先の説明にあるように直接ファイルへリダイレクトしてtypeで読めばバグらないようになった wmic process where "name='hoge.exe'" get CommandLine 2>nul >$tmp.txt for /f "delims=" %%a in ('type $tmp.txt^|find ":"') do for %%b in (%%a) do set "s=%%~b"
798 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 14:54:07 ID:3pQwOKKR.net] set RUNEXE="%%~a" じゃろが
799 名前:デフォルトの名無しさん [2022/05/23(月) 17:31:28.72 ID:JTigk3sw.net] コマンドプロンプトはとても残念なので set RUNEXE="%%~a" echo RUNEXE: "%RUNEXE%" とすると(%a=「t e s t」だった場合)RUNEXE: ""t e s t""と表示されるのだよ...
800 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 17:44:09.74 ID:3pQwOKKR.net] すまんな >>787 は>>784 に対するレス >>786 は問題ない ケツにスペースあってもいいようにしたんだろ
801 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 17:52:18.15 ID:9Kev8wRG.net] >>782 wmicというのがあるんだ、知らなかった wmic /? とすると赤字で非推奨ですと出た
802 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 20:13:36.87 ID:kx8uWZPf.net] 非推奨烙印はcmdを滅ぼそうとしているMS内の一派の仕業だから気にするな vbsやpowershellのようにcomの使える言語であれば同じことできるから要らんといえば要らんのだがな
803 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 22:36:34.02 ID:vE3vs/4c.net] 自分の周りではあまり知られてないようなのだけど、 setは代入文全体を"〜"で括るとうまくいく場合が多い。(確実ではない) cmd /v:on set "aaa=(bbb|ccc)<ddd" echo aaa=[!aaa!] ↓ aaa=[(bbb|ccc)<ddd] 引数でパスを受け取るバッチファイルでよく使う。 「〜」と「"〜"」のどちらの形式で指定されても同じ値を得られる。 @echo off setlocal EnableDelayedExpansion set "FilePath=%~1" echo FilePath=[!FilePath!] exit /b
804 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 15:42:40 ID:DHD4MJfY.net] 好みだろうけど 常に値はリテラルな""に埋め込まれたものと考えることにした なんらかの一貫性を貫くのが精神衛生上よい
805 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 16:01:20 ID:EZq8VYJv.net] 不自由でも一貫性を好む者って多くの事に対応出来ない低脳だと言ってるようなもの 最適を選ばずワンパターンな手法に頼り用いたがる思考停止した老害へと一直線
806 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 16:09:51.54 ID:DHD4MJfY.net] むしろワンパな%~の剥ぎ取りを信頼してるのが気になったんだが ダメ文字入っててもサブストリング置換で最後と最初の文字削ったり頭を柔らかく持とう
807 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 16:12:20.60 ID:fGpRFhuy.net] 文字列の置換抜き出しを考えてるなら常に""の中の状態にするのは正解だと思う
808 名前:デフォルトの名無しさん mailto:sage [2022/05/24(火) 16:32:08.01 ID:wIwv7WB3.net] バッチには(残念ながら)絶対はないから、すぐに展開せず要時まで自由度を残す習慣は大事だと思う
809 名前:デフォルトの名無しさん [2022/05/24(火) 19:24:26.65 ID:ZQNStJn7.net] ダブルクォートをまともに削除できるのが%~しかないのが全部悪い 環境変数にスペースが入っている「かもしれない」状態になるとまともにダブルクォートを外す手段がないんだよね。 set File1=X:\a a.txtとset File2="X:\a a.txt"から同じ状態に持ってこれるコードは簡潔に書く方法がないから諦めた。 sub.bat %File1% %File2% // File1が分裂して死ぬ sub.bat "%File1%" "%File2%" // File2のダブルクォートが二重になって死ぬ 結局%~1ではがすのが1番まともに書けると思う
810 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 03:42:10.08 ID:Mc6K3UpU.net] >>798 set "File2=X:\a a.txt" だと何かハマるパターンがあるの? 普段こうするようにしてるから、後学のために知っておきたい
811 名前:デフォルトの名無しさん [2022/05/25(水) 09:12:08 ID:nfFPZ/Hm.net] >>799 set "File2=X:\a a.txt" と set File2="X:\a a.txt" で結果が違う 俺もファルパスなら上の書き方しか使わん
812 名前:デフォルトの名無しさん mailto:sage [2022/05/25(水) 20:31:54.51 ID:CvuRtmLM.net] C:\Program Files (x86) 結構昔からあるこのフォルダの配下に置かれたファイルをまともに扱えるバッチはどれだけあるだろうか…
813 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 00:47:09.31 ID:/szrY+JV.net] >>800 いや、だからその結果が違うのを踏まえた上で、何か罠があったりするのか、という話 回避策があるのにわざわざ問題のある2例しか上げてないから、 何かしらの罠があるから例に出さずにいたのかな、と
814 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 13:33:44.93 ID:eXnOjPn/.net] その書き方知らんかっただけでしょ
815 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 15:42:12.26 ID:0e7T6NOT.net] 半角スペースや&の付いたファイルなんか知った事かと言い切れるなら幸せなんだがな
816 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 15:55:49.96 ID:J8y6hNBw.net] >>801 そこだけの問題なら、そのフォルダにシンボリックを張って別の入り口を作り、そこから出入りする
817 名前:デフォルトの名無しさん mailto:sage [2022/05/26(木) 15:56:19.27 ID:J8y6hNBw.net] シンボリックリンクね
818 名前:デフォルトの名無しさん [2022/05/27(金) 15:37:55.51 ID:DoIFvz+R.net] >>802 環境変数にダブルクォートが入るかそうじゃないかだけの問題なのでそこだけの違いにした こっちの書き方の方が好みか? set "File3=X:\a a.txt" set "File4="X:\a a.txt"" File4の書き方は受け入れられんだろうからこの書き方はやめた
819 名前:デフォルトの名無しさん mailto:sage [2022/05/27(金) 21:59:22 ID:cruiCFAs.net] >>807 さすがにそのFile4の書き方はないでしょ。好みの問題じゃない。 「&」とか含めないのでは?
820 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 00:40:39.75 ID:eWdSCVXj.net] >>807 からかわれてるのか、はぐらかされてるのか判断つきかねる 最初の疑問には全く回答得られてないし とりあえず半年ROMっときますわ
821 名前:デフォルトの名無しさん [2022/05/28(土) 01:15:25.17 ID:N6SgNzpI.net] set File1=X:\a & b.txt set File2="X:\a & b.txt" set "File3=X:\a & b.txt" set "File4="X:\a & b.txt"" File4駄目だったわ。File1もファイル名が切れるが 最初の疑問(>>799 >何かハマるパターンあるの?)なら、 俺がFile3のパターンでハマったことはない
822 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 01:53:02 ID:sY9CTUi4.net] >>807 4はどういう状況で使うのか気になる。危険しか感じない わざと反転させたい場合? >>810 値に「"&"」など、"エスケープしてる状態で含んでいる場合、反転する set S=abc"&"def set "STR_A=hoge%S%fuga" 結局、「何でも許容出来るように」に対応するのはコストが高過ぎるので、想定され得るものに限定しそれに合わせて書くのが現実的 値にしろ運用にしろ何らかの制限付きという条件の下で割り切って使うならバッチは楽 全てのエラー判定とかやり出すと膨れ上がるしキリ無い 何を制限とするかの見極めと切り捨てが大切
823 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 02:02:37 ID:4gWpv+XJ.net] BATでは取返しのつかない結果にならない限りエラーで止まる、期待した結果にならなかった のは別にいいかなって思ってる
824 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 02:59:44.49 ID:j34iIhvZ.net] エスケープ周りをしくじれば大抵は取り返しが付かないけどな バッチでエスケープ処理が発生するようなら他のスクリプトを検討した方がいいね
825 名前:デフォルトの名無しさん [2022/05/28(土) 04:29:23.28 ID:Ee8LXfQh.net] タスクスケジューラじゃregを起動できないから、間にbatファイルを挟み、その中でregを指定させたんよね 無事スケジューラの動作が確認できたものの、今度はPC操作中にcmdの起動が挟まってゲームその他の操作を阻害する 瞬間的なcmdウィンドウのポップアップを防ぐ手段はないものだろうか・・・ フリーソフト等にならタスクバー内で完結するプログラム動作も珍しくない、それを通常のcmd起動にも実現させたい^^;
826 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 05:13:46 ID:sY9CTUi4.net] >>814 ttps://okwave.jp/qa/q852803.html あとVBから出来たとか昔は出来たけど出来なくなったとか何処かで見た気がす
827 名前:デフォルトの名無しさん [2022/05/28(土) 05:50:05.93 ID:Ee8LXfQh.net] >>814 え・・・ショートカットリンクにすると、bat発動時のウィンドウポップアップは消えるんですか? 発動、実行、処理に問題はありません 指定時刻で瞬間表示されたcmdウィンドウの影響で生じる、PCデスクトップ上の強制画面切り替えが問題なんです・・・
828 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 19:57:51.48 ID:vVz/heur.net] >>816 「え・・・」とか言う前にリンク先ちゃんと読んだ? リンク先に「最小ウィンドウ(バックグラウンド)」で実行できる事は書いてある。 ゲームが影響受けないようになるかは知らない。 タスクスケジューラでの実行でウインドウ出したくないなら 簡単なのはSYSTEMアカウントで実行するように変更すること。 HKCU使ってんなら変更が必要。
829 名前:デフォルトの名無しさん [2022/05/28(土) 20:45:56.96 ID:Ee8LXfQh.net] >>817 的確な指摘をありがとうございます! SYSTEMアカウントは最初の試行錯誤で試したものの、最上位命令でさえスケジューラの表示で[実行中]となるわりにbatの起動が見られず、その経緯を経てAdministratorsへ変更していました batのショートカットを作成し、プログラム操作項目に.lnkを足し、さらにアカウントをシステムへ揺り戻すと、確かにcmdウィンドウの起ち上がり消失を確認できました 問題はタスクの表示が[実行されました]ではなく[現在タスクを実行中です]なところ これが実際にbatを起動してくれているのか怪しいです・・・ もう少し経過観察してみます
830 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 20:49:45.87 ID:4gWpv+XJ.net] systemアカウントでの実行だから 逆に現在ログインしてるユーザーの画面に何か表示するようなことは出来ない batで何か表示しようとしても無理だから起動の確認は後に残るようなファイル出力等で確認
831 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 20:51:48.94 ID:4gWpv+XJ.net] これはbatに限らないのでメモ帳とか何かのソフトを起動させても画面には現れない
832 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 21:07:54.58 ID:Ee8LXfQh.net] 仕組みの解説ありがとうございます batの起動によりregファイルを実行することが目的ですので、SYSTEMアカウントのそのような仕様は有難いですね だから各サイトで迷ったらSYSTEMで!と記されているのでしょうか(私も最初はそれに倣って試していました) 5ch掲示板の多くが「余所でやってください」となるので、ついでで恐縮ですが、こちらにコピー↓↓させてくださいm(vv)m 現状ではSYSTEMアカウントのbat強制発動力に疑問を抱くものの、可能なら私もSYSTEMでタスクを構築させたいです 経過観察後はAdministrators最上位でショートカットを指定起動させた場合のデスクトップ周りを検証するつもりです(bat不発かcmd出現になりそう) ------------------ タスクスケジューラでAdministrators+最上位にすると「正しく終了」+準備完了になります しかしそれをSYSTEM+最上位にした場合、「現在タスクを実行中です」+実行中と変化します このSYSTEMアカウント処理の際に設定項目の「新しいインスタンスを並列で実行」はどうなるのでしょうか? 実行中を上書き(もう一度プログラム起動)し続けるのであれば嬉しいのですが、並列という語句で「内部に延々と加算し続けるのか?」と不安に思いました
833 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 21:31:44.96 ID:4gWpv+XJ.net] >>821 SYSTEMで実行しても実行完了してたら状態は「準備完了」に変わるよ 実行中ならまだそのbatは起動したままで終了してない もし終了してないのが予期してない動作なら何か途中で止まってるので 複数起動を許可したのならbatのインスタンスが増殖することになる
834 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 21:38:44.30 ID:4gWpv+XJ.net] 想像するに batが何かの応答を要求しててユーザーのアクション待ちなんじゃないかな 当然キー入力なんかはSYSTEMからは無理なので タスクマネージャーから強制終了されることぐらいしかできない 上で言ってるようにカレントユーザーじゃないのでHKCUなんて存在しないんだがその点は大丈夫か
835 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 21:47:41.17 ID:j34iIhvZ.net] SYSTEMタスクからHKCUをってことは、まず現在ログイン中のユーザーを特定してそいつのユーザープロファイルのNTUSER.DATを弄ることになるわけだよ このスレの範疇だと無理っぽいけどがんばってね
836 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 21:55:22.65 ID:4gWpv+XJ.net] 実行したいユーザーは今の自分なんだからそこは固定にしとけばbatにできるだろ 他ユーザーのレジストリ操作はググれば出てくるよ
837 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 21:57:50.03 ID:4gWpv+XJ.net] まあ色々言ったけど 画面表示をさけるだけなら、俺ならWSHかPowerShellを使うな
838 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 22:01:28.84 ID:o4a1B59x.net] regファイルを実行ってレジストリ登録?それならbat使わなくても 最上位の特権で実行する プログラム: C:\Windows\regedit.exe 引数: /s regファイルフルパス名 でよくない?
839 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 23:50:47.54 ID:Ee8LXfQh.net] 皆さんありがとうございます やはり表示が「正常に」→準備完了ではない以上、タスクは途中状態でしたか・・・この分では肝心のbatも実行されそうにありませんね 最初のSYSTEMによるタスクの場合、管理者権限での実行に不備があるようで、それでタスクは発動するもののbat動かずという結果になると判断していました それでAdministratorsへ変更し、命令そのものが管理者によるものへ置き換え、これまでの経緯に至っています >>827 く、詳しくお願いします・・・自分でも相当な時間をネット検索に費やしましたが実現できませんでした 特に1文字でも損なうと完成されない、引数関連が上手くいかなくて 昔ながらのbatなら自分にもギリ可能でしたので今に至ります regなら管理者権限も関係なく値を変更してくれるので、それさえ可能なら一番楽なんですよね
840 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 23:51:00.59 ID:Ee8LXfQh.net] ことの発端は配信の最適化である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の恒久的な完全無効化を成せるか、なんです・・・
841 名前:デフォルトの名無しさん [2022/05/29(日) 00:21:06 ID:XW+WDPtU.net] >>811 File4は環境変数の末尾にスペースが入らない&&環境変数をダブルクォートでくくる目的 setに与えるコマンドラインとしては正当だが、&とかエスケープが必要な文字が入ると構文解析で事故るのでFile1と同じくやらんほうがいい書き方だったわ
842 名前:デフォルトの名無しさん mailto:sage [2022/05/29(日) 00:28:55.06 ID:NHtpNvxH.net] >>829 そもそもなんだけど、レジストリを書き替えただけでうまくいくのは確かめてるの? 通常レジストリの書き換えを反映するには、HKCUの場合ログオンが、HKLMの場合再起動が必要なはずだけど あとユーザーにadmin資格を追加するのは出来ないの 資格があれば最上位の特権にチェックでいけると思うけど
843 名前:デフォルトの名無しさん mailto:sage [2022/05/29(日) 00:44:54.89 ID:Dh5s7alL.net] >>831 長年自分好みのregを作成し続け、発動そのものはパンピーチンパン頭なわりに経験則の積み重ねで上手くいっています 再起動の観点は盲点でした、その辺りも毎回あやふやでしたので再確認しないとですね regのみでサービスが[無効]へ書き換えられるのを何度か目に
844 名前:している気もしますが 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タスクを別途用意する必要がありそうですね 偶然にも、今までの調整が無駄になっていない様子で嬉しいです [] [ここ壊れてます]