【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
: [sageteoff] 2017/03/11(土) 13:47:11.66:2LSSeyH1 拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる 質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。 ※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。 前スレ 【.cmd】 バッチファイルスクリプト %11 【.bat】©2ch.net ttp://echo.2ch.net/test/read.cgi/tech/1424858999/ それ以前の過去スレ %10 ttp://peace.2ch.net/test/read.cgi/tech/1374205515/ %9 ttp://toro.2ch.net/test/read.cgi/tech/1335015478/ %8 ttp://toro.2ch.net/test/read.cgi/tech/1315844420/ %7 ttp://hibari.2ch.net/test/read.cgi/tech/1298873550/ %6 ttp://hibari.2ch.net/test/read.cgi/tech/1277465356/ %5 ttp://pc12.2ch.net/test/read.cgi/tech/1242268171/ %4 ttp://pc12.2ch.net/test/read.cgi/tech/1229955189/ %3 ttp://pc11.2ch.net/test/read.cgi/tech/1217860043/ %2 ttp://pc12.2ch.net/test/read.cgi/tech/1197881068/ %1 ttp://pc11.2ch.net/test/read.cgi/tech/1178281991/ : [sage] 2017/03/11(土) 14:16:25.14:tWxSSf/m 2GET : [sage] 2017/03/11(土) 17:24:01.08:aIgw+L4R そろそろ次スレ立てた方がいいと思う : [sage] 2017/03/11(土) 19:08:44.39:ayh8mOJp タヒ : [sage] 2017/03/12(日) 22:04:13.40:LKmH3irJ 達人の方々!お教えください set文による文字列の置き換えで =を置き換えたいのですが どのように記述すればよいのでしょうか? : [sage] 2017/03/13(月) 02:51:46.65:ieWeiZc+ setの文字列置換では無理 =の個数が決まっているのならforでderims== 不特定なら一文字ずつ=かどうかを判定し=なら置換したい文字列を付け足し テストしてないから不備があるかもだけど以下みたいな感じで出来ると思う :ReplaceEqual if "%~1"=="" (echo ERROR&exit /b) set "str=%~1" set output= :CheckEqual if not defined str exit /b pause if "%str:~0,1%"=="=" ( set "output=%output%置換後文字列" set "str=%str:~1%" goto :CheckEqual ) set "output=%output%%str:~0,1%" set "str=%str:~1%" goto :CheckEqual : [sage] 2017/03/13(月) 02:56:02.96:ieWeiZc+ 済まん pause テストするつもりで入れてたのを消すの忘れてた まあそのままテストしてみて : [sage] 2017/03/13(月) 03:26:40.42:Kv5ZfyaF :ReplaceEqual set "str=%~1" set output= :CheckEqual if "%str:~0,1%"=="=" ( set "output=%output%置換後文字列" set "str=%str:~1%" ) else ( set "output=%output%%str:~0,1%" set "str=%str:~1%" ) if defined str goto :CheckEqual exit /b : [sage] 2017/03/13(月) 07:40:38.20:KSFKLeET ありがとうございます 色々試して見ます : [sage] 2017/03/13(月) 22:53:05.48:UotY540z と同じだけど、もう少し使いやすいI/Fにしたもの @echo off rem 文字列中には、",%(1つのみ) を入れないこと set "var==abc=def=!#$&'()=^~|-+*;:{}<>,./?\_%%" call :replace var "=" "=" echo "%var%" rem savety stopper goto :eof :replace setlocal set i=0 set s= :replace_loop call set "c=%%%1:~%i%,1%%" if not defined c (endlocal&set "%1=%s%"&goto :eof) if "%c%" equ "%~2" (set "s=%s%%~3") else (set "s=%s%%c%") set /a i+=1 goto :replace_loop : [sage] 2017/03/15(水) 08:22:32.42:Ekd3hMdD cmderいいな この手のツールで表示が崩れたりせずまともに動くやつ見るの初めてだ : [sage] 2017/03/15(水) 19:39:27.45:sbz59NLr for /r %%i in (*.jpg) のようなコマンドで取得した絶対パスをカレントフォルダとの相対パスに変換するにはどうするのが一番ですか? 現在はsetコマンドの置換機能でカレントフォルダの部分のパスを消しているんですがパスに変な文字列が入っていると誤作動を起こしそうで少し不安です。 もっとスマートなやり方はありますか? : [sage] 2017/03/16(木) 01:00:29.70:DixFGYK0 >パスに変な文字列が入っていると どのみち%が入っているとバッチだと詰む。やれなくないけど物凄く面倒 バッチでは完全な文字列操作は無理だと割り切った方がいい PowerShell使えば? ttps://www.google.co.jp/search?&q=powershell+%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9+%E5%A4%89%E6%8F%9B : [sage] 2017/03/16(木) 01:47:18.14:9KCSEqzj 分かりました、何か別の方法を考えます : [sage] 2017/03/16(木) 02:25:05.07:iKA3O6Cf 実際の有効なパスが対象なんだから 問題となるのは上に出てきたequalを含んだフォルダがある場合だけだろう setlocal echo %cd%>tmpfile for %%i in (tmpfile) do set /a size=%%~zi-2 del tmpfile if %size% neq 3 set /a size+=1 for /r %%i in (*.txt) do ( set "p=%%~i" call set "p=%%p:~%size%%%" call echo ".\%%p%%" ) endlocal : [sage] 2017/03/16(木) 02:32:32.21:iKA3O6Cf 肝心なのは、文字列操作、表示まで扱う場合は 文字列を必ず""で括るようにすること & % ^ 等を含んでると括ってないとおかしくなる : [sage] 2017/03/16(木) 04:08:08.29:gadu0oc0 chcp 437 : [sage] 2017/03/16(木) 11:46:49.75:iKA3O6Cf ファイルサイズじゃ根本的にダメだったね (それにecho %cd%も""で括ってなきゃいけなかったし) call :length "%cd%" n for /r %%i in (*.txt) do ( set "p=%%~i" call set "p=%%p:~%n%%%" call echo ".\%%p%%" ) goto :eof :length setlocal set s=%1 set n=0 :length_1 call set "c=%%s:~%n%,1%%" if defined c set /a n+=1&goto :length_1 if %n% neq 5 set /a n+=1 endlocal&set /a %2=%n%-2 goto :eof : [sage] 2017/03/16(木) 12:49:57.48:iKA3O6Cf 訂正 call :length cd n for /r %%i in (*.txt) do ( set "p=%%~i" call set "p=%%p:~%n%%%" call echo "%%p%%" ) goto :eof :length setlocal set n=0 :length_1 call set "c=%%%1:~%n%,1%%" if defined c set /a n+=1&goto :length_1 if %n% neq 3 set /a n+=1 endlocal&set /a %2=%n% goto :eof : [sage] 2017/03/16(木) 18:53:00.18:9KCSEqzj ありがとうございます 文字列を置換することばかり考えていたのでカレントフォルダ分の文字数を削るという発想に行き着きませんでした これで何とかなりそうな気がします : [] 2017/03/17(金) 21:12:58.50:V4hZYsin どなたかお詳しい方、ご教示ください windows7を起動後、自動で特定のアカウントパスワード入力後にログインし、 ログイン後、デスクトップの特定座標を自動でクリックするという操作を行わせたいです このような処理はbatファイルで可能でしょうか? win7初期状態にインストールされているものであれば他のものを使用してもよいのですが。 キーワードだけでも結構ですので、お助けいただければ幸いです : [sage] 2017/03/17(金) 21:46:29.02:93Jxn9OB 胡散臭すぎるだろ・・・ : [sage] 2017/03/17(金) 22:18:36.30:Pk7DeofX ログインとはWindows7の登録ユーザーってことか? それともWebブラウザを起動してどっかのサイトにログインするってことか? あと何故マウスクリックなのか? デスクトップに表示してるアイコンなら別に直接起動できるだろうに : [sage] 2017/03/18(土) 09:01:42.64:KPOks79l 無理です : [sage] 2017/03/18(土) 15:14:23.81:cDGLzqpd start ttp://jump.5ch.net/?https://www.google.co.jp/search?q=windows7+自動ログイン : [sage] 2017/03/20(月) 17:14:02.44:QMGJB+5Y だいぶ使い道ないけど、DIRって複数フォルダの内容を1回で表示できるんだね。 DIR C:\tmp C:\tmp2 : [sage] 2017/03/24(金) 13:17:40.14:jo55dHfH for文が同一フォルダに自分で出力したファイルを 一つだけ拾っちゃうんだけど、何か対策はありませんか? for %%I in (*.jpg) do copy %%I %%~dpI_%%~nxI って感じに処理すると 1.jpg 2.jpg → _1.jpg _2.jpg __1.jpg となっちゃう… : [sage] 2017/03/24(金) 13:52:45.87:OsTTofqK for /f "delims=" %%a in ('dir /a-d /b *.jpg') do : [sage] 2017/03/25(土) 20:50:35.80:8s6m96Ov なるほどDIRか… ありがとうございました。 : [] 2017/03/28(火) 18:35:13.10:oEoZ8De2 バッチファイルで echo %* とすると引数がすべて表示されるけど %0=自分自身だけ無いのはなんで? *で0だけハブられるなんて可哀想…… : [sage] 2017/03/28(火) 18:52:24.94:IKXgMhqU 少し考えれば分かりそうなものだが %cmdcmdline% : [sage] 2017/03/30(木) 01:42:37.50:gGp/SYAm なんか真似しそう(笑) : [sage] 2017/04/03(月) 06:06:20.82:awE7Wvau バッチ書くのにオススメのエディタあったら教えて 最近目がめっきり弱くなって来たので色分け表示とかの視認性上がるものや 便利そうな機能があるものを知りたい 頻繁に使うわけじゃないからこそ探すの面倒で先人の知識をお借りしたい : [sage] 2017/04/03(月) 07:06:14.38:pL1jzkCs VisualBatは? 文字に色もつくしいろいろ設定できるよ batをexe形式にすることもできる : [sage] 2017/04/03(月) 07:12:25.04:5ummjK72 サクラエディタ : [sage] 2017/04/03(月) 07:33:25.19:uEU30p4H マジレスすると目が悪いならでかいモニタ買ってフォントサイズでかくするのが一番良い PowerShell、Ruby, PythonとかならVSCodeでブレークポイント張ったり変数のインスペクトしたりできるけど その手の支援機能が全く期待できないBatじゃどれ使っても同じだろう 手に馴染んだエディタ使えばいいしないならフリーのどれか一つ覚えればいい キーワードの色分け程度なら大抵用意されてるし VisualBatはちょくちょく見かけるけどそれ専用の環境を覚えるくらなら普通のエディタ使ったほうがいい気がする 個人的にはBatから別の言語のコード書いて呼び出す事が多いし 自作マクロになるけど ↓みたいなコードを一つのファイルに書いて##!!に挟まれたカーソル位置のコードを切り出して実行する機能が 言語の学習やちょっとしたテストに便利で気に入っているのでエディタマクロ覚えて作ってみるのお勧め ##!! echo test echo hello ##!! for test for %i in (a,b,c) do echo %i ##!! calc test set a=1 set /a a+=2 echo %a% : [sage] 2017/04/03(月) 07:56:40.92:wDpIbVKg 中身のない長文要らんわ : [sage] 2017/04/03(月) 22:35:33.81:TkzGFBjq 黒背景に白地の文字が視認性あがるよ フォントはゴシックで文字サイズも大きくする 俺の使ってるのは一般的にはオススメではないのでどうかと思うが (New)QXエディタ(一応シェアウェアだが未登録でも機能制限も期間制限も無い) : [sage] 2017/04/03(月) 22:53:09.08:jFb9lqNm 真っ黒背景に真っ白文字は目がズキズキする : [sage] 2017/04/03(月) 22:58:56.52:TkzGFBjq 確かに、目のいい人にとってはそうかもしれないけどね コマンドプロンプト画面がエディタ画面だと思ってもらえれば想像できるよね : [sage] 2017/04/03(月) 23:14:57.75:rmwiW03F color 0f は目に痛い : [sage] 2017/04/03(月) 23:18:55.00:TkzGFBjq 目のいい人がコメントしたって意味ないだろ 老眼やかすみ目で文字が読みにくくなったらわかるよ 特に、カンマとピリオドの区別が付かないとストレス溜まるぜ : [sage] 2017/04/03(月) 23:37:00.86:mc8PKhXW サクラエディタ入れて IPAゴシックフォントにする : [sage] 2017/04/04(火) 00:06:37.41:m/ZONOLH 背景は薄い黄緑色にしてる 目が疲れない : [sage] 2017/04/04(火) 00:16:41.83:Q0uaZ4Jg そういえば昔のホスト端末とかって黒背景に緑字が多かったよね? あれってなんでだろ? : [sage] 2017/04/04(火) 02:35:10.99:G7XsiAet グリーンディスプレイがあったからじゃね? : [sage] 2017/04/04(火) 02:45:05.78:ti2ez7YV 緑やオレンジの蛍光体の方がTVの白蛍光体より刺激が少ないから採用されていたらしい : [sage] 2017/04/04(火) 04:37:33.60:RiJvnB3V 適当な画像エディタのスポイトで抽出してみればわかるけど コマンドプロンプトは黒と白じゃなくて黒とグレー 理由は目への配慮 DQも同じ : [sage] 2017/04/04(火) 05:42:06.14:ldgn2Vfw 皆様たくさんのレスありがとうございます VisualBat試してみました デバッガとしては便利そうですがTab文字打てないのでエディタとしてはまだちょっと使えなさそうです for や if の()で自動インデントとかしてくれるようになると便利かも 今後の更新に期待します 他、挙げて頂いたアドバイスも順次時間が取れ次第試して行きたいと思っております 次はサクラエディタを試用する予定。他候補にMery、QX コマンドプロンプトは color 07 不透明度80 で使っております かすみ目、乱視、老眼、ド近眼、何れも酷いです 他に思い付いたアドバイス等ございましたらよろしくお願いします : [sage] 2017/04/04(火) 06:03:57.35:o7weIbXl フォントはVLゴシックのほうがいいと思う : [sage] 2017/04/04(火) 12:05:28.05:h1EI1nbQ gPadは色弄りやすい : [sage] 2017/04/04(火) 12:56:18.88:CQgziqhI あのフォントゼロに斜線が入ってるから使ってる : [sage] 2017/04/05(水) 00:03:13.02:jDUjKmAY >DQも同じ ドラクエ? : [sage] 2017/04/08(土) 17:14:16.29:3YaJnUcz ms製wgetなんてあったんだな 何故か異様に遅いが bitsadmin /Transfer htmlget ttps://www.google.co.jp/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png c:\logo.png : [sage] 2017/04/08(土) 17:15:28.84:3YaJnUcz フォントはMyricaがClearTypeと相性がいい : [sage] 2017/04/08(土) 17:52:42.60:RJCKk6tM VLゴシックは行間空き過ぎ 同じ行数が表示出来るようフォントサイズで調整した場合 VLゴシックのフォントサイズ10に対しIPAゴシック12、MSゴシック13 やたらと空行入れたがる脳みそスカスカの空行厨が好みそうなフォント 自分にはIPAゴシックよりVLが良い点が見当たらないので さん、どの辺が良いのか具体的に教えていただけると助かります : [sage] 2017/04/08(土) 18:14:54.54:xnWSKOe7 これは知らんかった バッチファイルで夜間にダウンロードとかに便利だな : [sage] 2017/04/08(土) 18:57:28.10:LC0ZcHdg 動かなかったんで/helpしてみたら、WindowsXPのbitsadminには/Transfarが無かった(version 1.0 [ 5.1.2600.0 ]) 調べてみたら、 Windows XP Service Pack 2 サポート ツール ttp://jump.5ch.net/?https://www.microsoft.com/ja-jp/download/details.aspx?id=18546 をインストールすればいいことが判った version 2.0 [ 6.6.2600.2180 ] : [sage] 2017/04/09(日) 11:47:08.97:z+t/KLMw Myrica良いね |が破線なのと\→\バックスラッシュに違和感あるけど慣れればこっちの方が見分け楽そう : [sage] 2017/04/11(火) 20:07:11.55:bvJ+shyZ set test=%1 for /f "delims=" %%f in (%test%) do ( E:\test\test.bat %%f ) 上記のfor処理にテキストのファイルパスを一つずつ読み込ませて専用batで処理した後に 全部終わったらシャットダウン処理をしたいのですが ループ処理に割り込ませる方法って何かありますか? : [sage] 2017/04/11(火) 21:42:41.83:ZiByT+J4 質問の意味が不明瞭 全部終わった後でいいならforの後にshutdown書けばいいんでないの? for中に割り込ませたいのは何故? : [sage] 2017/04/11(火) 22:02:51.00:bvJ+shyZ set test=%1 for /f "delims=" %%f in (%test%) do ( E:\test\test.bat %%f ) shutdown /S /T 30 単純にこれでうまくいかなかったので割り込ませる必要があるのかと思い質問しましたが やっぱりそんなわけないですよね・・・ 単純なミスをしてる可能性が高そうなのでもう一回見直してみます : [sage] 2017/04/11(火) 22:31:07.73:U8R3p0c1 callしてないからtest.batから帰ってこないだけでは : [sage] 2017/04/11(火) 22:39:54.03:bvJ+shyZ あちゃーほんとだ 普通に動いてたから気づかなかった・・・ アホですね ちょっと修正してテストしてみます 指摘ありがとう : [] 2017/04/15(土) 01:17:56.44:yuPX0yl1 ソフトを起動した際に出るライセンスキーを入力する画面に値を自動でいれたいです。 batで可能でしょうか? : [sage] 2017/04/15(土) 08:13:42.82:eG98vJ7n ahk : [sage] 2017/04/15(土) 23:02:38.65:a3PF4w5O batでgrep検索をしようと思ってるんだけど、 検索結果にファイルのフルパスを出力する方法を教えてください>< 現状だとファイル名+行の内容しか出ない・・・ : [] 2017/04/27(木) 06:44:05.61:Ek2Yalzm 複数のファイルがあり、ぞれぞれ中身が fileID: aaaa within( ); や fileID: akf within( ); などfileID: ~ within();は固定です。 各ファイルのaaaaやakfを読み込みの際に変数に取り込みたいのですがどのように書けばいいでしょうか? fileID: aaaa within(はファイルの一行目なので set /p fl=< %inputFile% でとれました。 : [sage] 2017/04/27(木) 07:31:26.21:LF40VtKG テストしてないけどこんな感じ。必要ならusebackqとかも。aaaaに&とか入るならsetでクオートする必要がある for /f "tokens=2* delims= " %%a in (%inputFile%) do ( set ID=%%b goto :NEXT ) :NEXT または set /p fl=< %inputFile% for /f "tokens=2* delims= " %%a in (%fl%) do set ID=%%b または for /f "tokens=2* delims= " %%a in ('findstr /b /c:"fileID" "%inputFile%"') do set ID=%%b : [] 2017/04/29(土) 21:00:05.56:GvSnly4L "within("しか取れませんでした。 : [sage] 2017/04/29(土) 23:45:46.56:AyX6Tpbc 書いたコマンドとテストした対象ファイルの1行目をコピペで貼ってみ : [sage] 2017/05/09(火) 16:43:52.50:PScyAxKX 助けて下さい! 毎月第二木曜日の16:00になったら Aフォルダに入っているgファイルにBフォルダに入っているgファイルを上書きする batファイルを作って下さい よろしくお願いします : [sage] 2017/05/09(火) 17:29:08.98:bjRIYrg3 ファイル上書きのBAT(c:\xxx.bat)を作成してタスク登録する schtasks /create /sc monthly /mo second /d thu /st 16:00:00 /tn title /tr "c:\xxx/bat" /ru username /rp userpassword : [sage] 2017/05/09(火) 18:58:44.41:PScyAxKX ありがとうございます! : [sage] 2017/05/12(金) 00:01:39.58:1meaH6LX set txt="C:\scr\a.txt" for /f "delims=, usebackq tokens=1,2,3,4,5,6,7,8" %%i in (%txt%) do ( set /a X="(%%j-%%i)+(%%l-%%k)+(%%n-%%m)+(%%p-%%o)" ) echo %X% forを使った計算について質問ですがa.txtから数値を抜き出し計算したいのですが最後の二つが空の場合があり この場合は%%pと%%oですがその場合はエラーになって強制終了してしまいます gotoを使う方法は思いついたのですが他に空だった場合にゼロを代入するなどは可能でしょうか? : [sage] 2017/05/12(金) 08:46:27.33:trqCrhEU set txt="C:\scr\a.txt" for /f "usebackq tokens=1,2,3,4,5,6,7,8 delims=, " %%i in (%txt%) do ( set /a X=%%j-%%i+%%l-%%k+%%n-%%m, po=%%p-%%o ) set /a XX=X+po echo %XX% : [sage] 2017/05/12(金) 11:05:40.92:lLM9Jqdl echo ^ とすると more? と出る ?? : [sage] 2017/05/12(金) 12:02:37.54:+kEWkBL6 空の場合に1が代入されてエラーを回避できました サンクス : [sage] 2017/05/19(金) 17:52:47.97:ya28xWZT 特定のフォルダ内のテキストファイルを処理するバッチを作りましたが @echo off for /f "usebackq delims=" %%i in (`dir /B /S "E:\text_sc\*.txt"`) do ( echo %%i call E:\work\syori.bat "%%i" ) syori.batで処理したテキストを忘れないようにリスト化(syorizumi_list.txt) aaa bbb ccc のように処理したテキストの名前だけ縦に追記 次回から新しいテキストファイルが同じフォルダに出来た場合にsyorizumi_list.txtの 処理済みのテキストを除外して処理したいのですが コマンドのアドバイスを頂けないでしょうか : [sage] 2017/05/19(金) 19:38:36.49:HiKVEJh7 もし、その入力ファイルをその後弄らないのならファイル属性を弄るのがいい 例えば、アーカイブ属性を削るとか読み取り専用属性にするとか そうすれば、forの中のdirに/aで分別できる それが無理な場合は、こんなかんじでファイルに登録されているかどうかチェックするとかかな findstr /x "%%~ni" syorizumi_list.txt >nul if errorlenel 1 ( echo %%i call E:\work\syori.bat "%%i" ) ) : [sage] 2017/05/19(金) 21:01:19.56:ya28xWZT レスありがとうございます 読み取り属性の方は最終手段としてとりあえず書かれたコマンドを追記してテストしていますが エラーで強制終了してしまいます・・・ ヒントは頂けたのでちょっと考えてみます : [sage] 2017/05/19(金) 21:32:14.27:8Dg0HTHO 処理済みファイルを下位ファルダに移動させるとかじゃダメなの? それが1番楽だと思うけど : [sage] 2017/05/19(金) 22:02:54.16:ya28xWZT ダメではないですし意地になってるだけです・・・ すいません どうしようもなければそうしおうと思います : [sage] 2017/05/19(金) 22:41:00.81:HiKVEJh7 ただのtypoだから(errorlevel) あと処理済ファイルの指定はフルパスにしないとダメかも : [sage] 2017/05/19(金) 22:45:30.06:HiKVEJh7 あと、移動させるなら下位フォルダはダメだよ dir /sではそれも対象だから : [sage] 2017/05/19(金) 23:51:05.34:ya28xWZT 修正したら動きました! ありがとうございます ただsyorizumi_list.txtに aaa bbb ccc とあったらaaaしか除外してくれませんね・・・ もう少し調べてみます : [sage] 2017/05/20(土) 02:30:44.06:HrYyDnOr まあこっちが悪いっちゃ悪いんだけど、これくらい修正して使って欲しかった /c:"%%~ni" : [sage] 2017/05/20(土) 08:10:06.10:N++czmo3 眠すぎたのと集中力が散漫で気づいてないだけでした・・・ すいません それと指摘の通り/c:に変えたら期待通りの動作になりました サンクス! : [sage] 2017/05/20(土) 21:37:37.96:HrYyDnOr その言い方に嫌な感じがするんだがちゃんと引数の意味を調べて使ってるよね /x /c:"%%~ni"としてるんなら、変な勘ぐりスマン : [sage] 2017/05/20(土) 22:35:16.21:N++czmo3 /x /c:"%%~ni"で問題なく動作しています 細かいところまでありがとう : [sage] 2017/05/22(月) 14:12:41.59:Q9T2A2Wt こんなろくに理解せずそのまんまコピペして使ってるとトラップに引っかかるぞ : [sage] 2017/05/22(月) 22:28:16.59:b+LuBt/G 下位フォルダに移動することも検討してるなんてレスから /sが必要だとも思えんよね : [sage] 2017/05/22(月) 22:30:42.85:b+LuBt/G もし/sが意図通りだったら aaa.txt aaa\aaa.txt なんて状況どうするんだって話だし : [sage] 2017/05/26(金) 07:30:18.71:/NUGeMQI > その言い方に嫌な感じがするんだがちゃんと引数の意味を調べて使ってるよね 同意 88の1行目で奴の人物像がすべて分かる : [sage] 2017/05/26(金) 16:05:36.92:OOQCykcT 引数 %1 %2 ,, は%9 までだが shiftで取り出せば%10以上でも取り出せた : [sage] 2017/06/15(木) 12:35:49.64:j04OpPTD Cドラのdown配下のmp4とaviを DドラTozakaruzoSaikonkaraに集約してコピーしたいときはどうするの? XCOPY "C:\down\*.mp4” "D:\TozakaruzoSaikonkara\" /d /e /h /r /y XCOPY "C:\down\*.avi" "D:TozakaruzoSaikonkara\" /d /e /h /r /y ワイルドカード使いたいけど、eroやmoroのところが難しい for文の記述の方がいいなど、よろしくお願いします。 C:/ ├down/ │ └ ero/ │ └ 111.mp4 │ └ moro/ │ └ xx2.avi │ └ zzz.mp4 │ └xxx.avi D:/ ├TozakaruzoSaikonkara/ │ └ 111.mp4 │ └ xx2.avi │ └ zzz.mp4 │ └ xxx.avi : [sage] 2017/06/15(木) 13:13:57.77:6QOS5lbl robocopy /? : [sage] 2017/06/15(木) 15:41:43.67:y+UEOWCj cd /d c:\down cd d:TozakaruzoSaikonkara for /r %%i in (*.avi *mp4) do copy /y "%%~fi" d: : [sage] 2017/06/15(木) 15:46:23.72:y+UEOWCj cd d:\TozakaruzoSaikonkara の方がいいか : [sage] 2017/06/15(木) 15:50:20.24:y+UEOWCj もしフォルダが無いなら md d:\TozakaruzoSaikonkara 追加してくれ : [sage] 2017/06/15(木) 16:07:02.35:y+UEOWCj *.mp4 だった 穴だらけだな 俺もボケてきたか : [sage] 2017/06/15(木) 17:02:52.10:+JrLzVDI おー、inの句に並列できるんですね %%~fiのfはfileの意味でしょうか いずれにしても無事コピーされました 応用も効きそうなので調べて利用させていただきます! ありがとう : [sage] 2017/06/15(木) 17:08:46.74:+JrLzVDI いや、フルパスかな 初めてだったので、楽しみます ありがとう : [sage] 2017/06/16(金) 01:17:16.66:fojoWyA2 俺がもっといいやり方がないか調査するからとりあえずmoroフォルダをうp! : [] 2017/06/17(土) 18:10:57.34:hP08xqzx ドライブとディレクトリの違いであるのか、コピーと移動の違いであるのか、 教えていただけたらうれしいです。 で、同じドライブの別フォルダに移動したいとき、下記教えていただいたコマンドを変えて実行すると、 別ドライブのときのようにコピーがされない状況です。 cd /d c:\down cd c:\TozakaruzoSaikonkara for /r %%i in (*.avi *mp4) do move /y "%%~fi" c: --------- 下記の用に移動したい C:/ ├down/ │ └ ero/ │ └ 111.mp4 │ └ moro/ │ └ xx2.avi │ └ zzz.mp4 │ └xxx.avi C:/ ├TozakaruzoSaikonkara/ │ └ 111.mp4 │ └ xx2.avi │ └ zzz.mp4 │ └ xxx.avi : [sage] 2017/06/17(土) 21:48:00.86:4uF4heHb for /r c:\down %%i in (*.avi *.mp4) do move /y "%%~i" c:\TozakaruzoSaikonkara : [sage] 2017/06/17(土) 22:08:13.20:hP08xqzx ありがとうございます! 比較して、代入の引数iに違いがあるし、もう少し勉強します。 また、わからないことなど出てくるかもしれませんが、その時はよろしくお願いいたします。 : [sage] 2017/06/17(土) 22:53:57.13:4uF4heHb 参考に言っておくが () の中の引数なんだが、ワイルドカード以外は要注意だ 例えば (*.avi *.mp4 sukebe.jpg) とかにすると 各ディレクトリに sukebe.jpg が無くても強引にコマンド実行してエラーになったりする : [sage] 2017/06/19(月) 21:06:26.56:HM1jnBNt moroとかsukebeとか名付けがオッサン臭いんだがw : [sage] 2017/06/26(月) 00:08:20.51:a4kJ2YgH DIRコマンドでは*を使って検索みたいなことが出来ますね。 【コマンド】 C:\>dir /s /b C:\Windows\System32\host* 【実行結果】 C:\Windows\System32\hostname.exe C:\Windows\System32\dllcache\hostname.exe C:\Windows\System32\drivers\etc\hosts 他にもっと複雑な検索も出来るのでしょうか? : [sage] 2017/06/26(月) 00:10:31.02:a4kJ2YgH あと「DIR /?」で出てくるヘルプにはこの機能について触れられていないのはなぜなのでしょう?こんなに便利なのに。 : [sage] 2017/06/26(月) 00:24:40.04:1HPve1dM ワイルドカードはDIR固有じゃないけど : [sage] 2017/06/26(月) 00:27:25.02:q7GF7ZpN windowsXPで恐縮なんだが、Windowsヘルプ(ヘルプとサポートセンター)では、 Dirの項目の説明の中で、ワイルドカード関係のものとして以下のものが書いてあったよ 解説 ・複数の filenames を使用する 複数の filenames を使用できます。スペース、カンマ、またはセミコロンでファイル名を区切ります。 FileName でワイルドカード文字 (? と *) を使うと、ファイルのグループを表示することができます。 ・ワイルドカードを使用する ワイルドカード (? と *) を使うと、ファイルとサブディレクトリのサブセットの一覧を表示できます。 例 ドライブ C のすべてのディレクトリで、拡張子が .txt のすべてのファイルの一覧を表示するには、次のように入力します。 dir c:\*.txt /w/o/s/p 各ディレクトリにある拡張子が .txt のファイル名が、アルファベット順にソートされた一覧がワイド形式で表示されます。 画面単位で一時停止し、キーが押されると次の画面が表示されます。 : [sage] 2017/06/26(月) 01:37:25.73:q7GF7ZpN つまりコマンドの内蔵ヘルプは簡略版ってことなんだ それと、なんかちょっと検索してみたら Windows10には「ヘルプとサポート」がないらしい なのでオンラインでのコマンドラインリファレンス ttp://jump.5ch.net/?https://technet.microsoft.com/ja-jp/library/cc755121%28v=ws.10%29.aspx XPの「ヘルプとサポート」には 「コマンドラインリファレンス」の他にも、 「新しいコマンドラインツール」 「コマンドシェルの概要」(ここにパイプやリダイレクトの説明が載っている) ってのがあったんだけどなあ : [sage] 2017/07/01(土) 02:44:43.86:mwCfh4Ih 質問があります。 ちょっと事情があってすべての引数をダブルクオーテーションで囲って実行しなければならなくなりました。 例えばこんな感じで "C:\Software\ffmpeg\ffmpeg.exe" "-i" "%~1" "-vcodec" "utvideo" "-acodec" "pcm_s16le" "%~dpn1_test.avi" ffmpegでは正常に動くことを確認したのですが他の一般的なソフトウェアもこのような起動方法で動作すると考えてもいいのでしょうか? : [sage] 2017/07/01(土) 03:37:58.17:QCoLM9eW 引数の仕様はそれぞれだが問題無い : [sage] 2017/07/05(水) 22:31:01.85:9GxT9B4i とあるファイルの中身の文字列を置換したいのですが、何かいい方法はありますでしょうか? とあるファイルはtxtファイルではないですが、テキストエディタで開くと文字列が書いてあります。 : [sage] 2017/07/05(水) 22:46:04.03:R8zuGv9z 全部テキストならともかくそれ以外のバイナリファイル内の置換はcmdじゃ無理だろ WSHとかPower Shellとかで探せ : [sage] 2017/07/06(木) 00:29:11.58:l/JVwvz3 テキストファイルだけど、拡張子がtxtではないファイルのことです : [sage] 2017/07/06(木) 01:41:06.31:vizsBHcK findstr である程度のことはできるけど、置換の条件とかが複雑になってくるとしんどい。 外部コマンドが使用可能なら、onigsedとか、SEDを使った方が多少は楽。 : [sage] 2017/07/06(木) 02:34:32.14:VUvDmuBp 拡張子になんの意味があると思ってるの? なんかそのレベルの知識だったら、メモ帳でも使った方がいいと思うよ。 : [sage] 2017/07/07(金) 17:03:51.39:peDYPYbs ren Nullpo.unko Nullpo.txt : [sage] 2017/07/09(日) 19:10:43.21:Gxva3cTk バッチファイルからシリアルポートを簡単に読み書き出来る手段って無いですかね? 古くはCOM?を使う方法が有名ですがBluetoothなどで作られた仮想シリアルポート?には使えないようです : [sage] 2017/07/13(木) 00:28:41.39:m+WJUz/m シリアルポートってなんだ?RS-232Cとかか? : [sage] 2017/07/13(木) 00:45:21.62:CfPNRtgi 232C→USB変換ケーブルみたいなのあったような : [sage] 2017/07/16(日) 11:23:45.75:FHjtOHLZ そもそもバッチファイルって何? CでもBasicでもなく、メモ帳の拡張子をbatに変えるだけで良くて、 コマンドブロンプトとかいう、MS-DOSと何が違うのかわからないような画面で動いて、 何なの? : [sage] 2017/07/16(日) 15:58:56.60:30vHB81v CだってBASICだってメモ帳の拡張子を適当に変えれば行けますよ : [sage] 2017/07/18(火) 02:02:06.89:Bi+xDIbE 「拡張子とは何か」から始めとけ : [sage] 2017/07/18(火) 09:43:40.29:YNdL6SIO >メモ帳の拡張子をbatに変える notepad.exeの拡張子をbatに変えたら動かなくなりますよ : [sage] 2017/07/18(火) 12:15:15.33:+17jTjCv なんでメモ帳って書いてあるのにnotepad.exeをいじるわけ? : [sage] 2017/07/18(火) 12:23:23.94:lxnTGpj5 そらメモ帳の実体はnotepad.exeやし : [sage] 2017/07/18(火) 19:54:35.52:qQbuN+bc お前の言う「メモ帳」とはnotepad.exeでない何か他のものなのか? : [sage] 2017/07/18(火) 20:32:10.68:wtRY8Rgw もう夏休みか : [sage] 2017/07/18(火) 23:42:51.89:Wjn/rMX6 揚げ足の取り方が寒い。 : [sage] 2017/07/19(水) 00:03:00.46:oeGL8Gu+ についていうなら、その辺のいい加減さが理解を妨げてると言える : [sage] 2017/07/19(水) 00:19:58.81:wIP5zHZ/ とにかくは色々とおかしい どこから突っ込めばいいのかわからんくらいにアチコチおかしい PC初心者板ならともかく、なぜム板にこんな人が居るんだ?ってレベル 迷い込んできたのか? : [sage] 2017/07/19(水) 00:23:24.87:I6a60LYe しかし誰もきちんと説明できないという : [sage] 2017/07/19(水) 02:27:06.77:Gwnbk1WK どこから説明始めたらいいのかわからん程だし : [sage] 2017/07/19(水) 21:02:00.27:WMMf4PqS 説明はできないが揚げ足は取れる、ということですね。 : [sage] 2017/07/19(水) 22:27:12.79:caLBuZR5 コピー系コマンドのコピー速度って 遅 copy < xcopy < robocopy 早 で良いですよね? これはVista、7、10のどのOSでも同じでしょうか? : [sage] 2017/07/19(水) 23:32:30.26:I6a60LYe copyの方が早くね?4文字だし。 : [sage] 2017/07/20(木) 03:04:39.26:R4lBeVK+ コマンド打ち込むにも時間がかかりますから一理ありますね。copyは引数指定も直感的だし… って常にコマンド手打ちする訳でもないですし!w : [sage] 2017/07/22(土) 00:59:36.62:J1O+P69V +.bat や ,.bat もOKだった : [sage] 2017/07/22(土) 21:18:13.40:yBUCBb6t プラスバッドって、何か格好いいな。 カンマバットはダセェけど。 : [sage] 2017/07/23(日) 16:18:49.88:sxzHAQSA では、 £.bat γ.bat ラプラスバットと、ガンマバットでは、どうだろう? : [sage] 2017/07/29(土) 01:24:32.19:ocuZvBLs @.bat や =.bat ファイルを作ることはできるが、実行しようとしてもコマンドプロンプトに無視されて実行できなかった : [sage] 2017/07/29(土) 02:07:03.67:0L2d7SO5 @.bat はフルパスで C:\work\@bat ってするか、キャレットでエスケープして ^@.bat で実行できる =.bat はフルパスでもダメだけど、キャレットでエスケープすればいける : [sage] 2017/08/01(火) 00:45:45.45:7i1X54Qd キャレットって何かわからなかったが、^をつけることなんですね ^@ や ^= でたしかに実行できました : [sage] 2017/08/10(木) 19:56:28.38:gQNT5BPl (^_^) : [sage] 2017/08/10(木) 21:54:16.62:BFQhJ/Te "@ とか "= とか : [sage] 2017/08/14(月) 22:38:23.70:3xlVGOet すみません助けてください 遅延関数を宣言してるところから、下記の親ディレクトリの名前だけ引くサブルーチンに ファイルフルパス投げて、戻そうとしているのですが for文のところでDEST_DIRに値が入らなくて困っています windows7環境で遅延関数について調べているのですが なんで値が入らないのかわからず。 %%Pをechoすると中身が表示されるのですが それをSETするときに何をやっても入りません。。。助けてください :GET_PARENTDIR setlocal enabledelayedexpansion SET PathLF=%1 SET PathLF=%PathLF:~0,-1% SET PathLF=!PathLF:\=^ ! for /F %%P in ("!PathLF!") do SET DEST_DIR = %%P endlocal && set DEST_DIR = %DEST_DIR% echo %DEST_DIR% exit /b : [sage] 2017/08/14(月) 22:39:38.44:3xlVGOet ああああ遅延変数でした もうやだああぁ : [sage] 2017/08/14(月) 23:55:08.58:pZiLFUe+ これって例えばc:\aaa\bbb\ccc\test.txtってファイルを投げたら 最終的にtest.txって文字を得たいの? cccを得たいの? : [sage] 2017/08/15(火) 02:10:26.85:F71LHla5 まずは SET DEST_DIR = %%P endlocal && set DEST_DIR = %DEST_DIR% の空白がいけないのでは? SET DEST_DIR=%%P endlocal && set DEST_DIR=%DEST_DIR% : [sage] 2017/08/15(火) 08:22:11.69:ltV5IdSe 後輩にその空白を入れられたことがある 「可読性を良くしようと思って…」って言ってたな 普通の高級言語やってる奴は=の前後に空白入れただけで不具合起こるなんて考えもしないわな コマンドプロンプトはホント昔の仕様を引きずり過ぎだわ : [sage] 2017/08/15(火) 08:51:21.42:J2u+qflL setlocal enabledelayedexpansion使うとファイル名に!が入ってるとめんどくさいから極力使わないようにしてるんだけど俺だけ?みんなはどうしてる? : [sage] 2017/08/15(火) 08:55:13.27:GzAS59pw C言語で言うマクロ置換みたいなもんだからしょうがない もう新規の奴はPowerShellに移行するしかない : [sage] 2017/08/15(火) 10:13:39.94:x5EZUuTK 名前ソートで上に持ってきたいフォルダには名前の頭に!をつけてる : [sage] 2017/08/17(木) 23:34:26.73:jGLnJoZN スペースが入ったファイル名からスペースを取り除くには一行では無理ですか? : [sage] 2017/08/18(金) 00:59:25.98:Oq4EZT3J こんな感じ? set "File=%~1" & ren "%File%" "remove=%File: =%" : [sage] 2017/08/18(金) 01:00:23.41:Oq4EZT3J 間違えた set "File=%~1" & ren "%File%" "%File: =%" : [sage] 2017/08/20(日) 03:39:45.42:w/lVOYHU バッチでよく使う pslist.exe はプロセス名が日本語だと間違える pslist v1.4 sysonternals : [sage] 2017/08/20(日) 16:32:29.32:7nn0chG1 フォルダD:\XXXX直下の、 AAAA、BBBB、CCCCの3つの隠しファイル(拡張子なし)を、 定期的にE:\backupフォルダにバックアップするためのバッチファイルを作りたい フォルダXXXX以下には、YYYY、ZZZZというフォルダがあり、 この下にもAAAA、BBBB、CCCCと同名のファイルが存在するが、 それはバックアップしなくていい copyコマンドでは隠しファイルはコピーできない xcopyコマンドではサブディレクトリ以下の同名ファイルもコピーされてしまう バッチファイルで処理するためにはどうすればいいのでしょうか? できればアトリビュートはいじりたくないです よろしくお願いいたします : [sage] 2017/08/20(日) 16:35:22.92:T95gEh5X 誰もツッコミ無しなの? : [sage] 2017/08/20(日) 16:53:03.09:vBwVL8I3 xcopyでAAAAなどのファイルを一つずつ指定してコピーするというのは? : [sage] 2017/08/20(日) 17:25:05.34:7nn0chG1 実験してみたんですが、 xcopy D:\XXXX\AAAA E:\backup\ とすると、backupフォルダには、 AAAA \YYYY\AAAA \ZZZZ\AAAA の3ファイルがコピーされちゃうんですよ \YYYYと\ZZZZのはいらないのでどうしたもんかなと質問させていただきました : [sage] 2017/08/20(日) 17:36:31.70:vBwVL8I3 こちらの方でもテストしたけど1ファイルだけコピーになるんだけどな なんでだろ : [sage] 2017/08/20(日) 17:43:47.57:7nn0chG1 テストありがとうございます あれ? なんか余計なスイッチ入れるとかしちゃってたかな? 今出先なんで帰ったら再度実験してみます : [sage] 2017/08/20(日) 19:15:30.58:T95gEh5X cd /d "%~dp1" & set "File=%~nx1" & call ren "%%File%%" "%%File: =%%" cd /d "D:\XXXX" for %%i in (AAAA BBBB CCCC) do xcopy /h /y "%%~i" "E:\backup" : [sage] 2017/08/22(火) 19:19:28.49:rIu52qT/ 以前こちらで聞いて試行錯誤しているのですが、何分初心者で四苦八苦しております。 そこでご教授願いたいのですが、 @rem 引数有無と引数名チェック if "%USR_INPUT_STR1%"=="" goto ERROR echo;%USR_INPUT_STR1%|findstr /R /C:"^http" /C:"openrec" >NUL||(echo "%1" を処理できません) && goto ERROR @rem URLのアドレスとHTMLを環境変数へ設定 set ADDR=%USR_INPUT_STR1% for %%I in (%USR_INPUT_STR1%) do set HTML=%%~nxI @rem HTMLダウンロード curl -L --max-redirs 10 -R -O %ADDR% if not %ERRORLEVEL%==0 goto ERROR @rem HTMLから文字列抽出 for /F "tokens=2 delims=<>| " %%I in ('type %HTML%^|findstr /R /C:"<title>"') do set TITLE=%%~I for /F "tokens=3 delims=, " %%I in ('type %HTML%^|find /I "m3u8"') do set TARGET=%%~I ffmpeg -c copy "%TITLE%" -i "%TARGET%" pause exit :ERROR echo 引数が無効のため処理できませんでした pause exit このままだと、ファイル名がUTF-8で文字化けしてしまいます。 これを、面倒なのでファイル名で出力したいと思ったのですが、正規表現が弱く全く前に進みません。 丸投げで申し訳ございませんが、どうか手直ししていただけませんでしょうか。 よろしくお願い致します。 : [sage] 2017/08/22(火) 20:10:25.50:uGuLhv+Q powershellに切り替えたら? : [sage] 2017/08/22(火) 20:50:12.77:1dHyDD35 よく分からないけどbat自体をUTF-8で書いてchcp 65001というのは? : [sage] 2017/08/22(火) 20:52:58.84:rIu52qT/ それも考えたのですが、不特定多数のPCで使う機会があるので手間が増えてしまうなと思い諦めました。 そこで、URLからIDとなる文字列を抽出してそれをファイル名に使おうと考えました。 参考URL: ttp://jump.5ch.net/?https://www.openrec.tv/live/7cuVKOAY3lv この末尾の7cuVKOAY3lvの部分だけを、TITLEに代入したいと思ったのですが、思うようにいかなくて・・・。 : [sage] 2017/08/22(火) 21:10:23.56:rIu52qT/ 結局、実行batのディレクトリ内にnkf32を導入し、 nkf -s --overwrite %HTML% と書き加えて対処致しました : [sage] 2017/08/29(火) 14:35:48.67:91TLAHUR フォルダの中に、あああ_1.flv あああ_2.flv … あああ_100.flvのようなファイルがあるときに、あああ_1.flvをあああ_001.flvのようにリネームしたりできないんでしょうか : [sage] 2017/08/29(火) 15:34:02.29:ZSKrJS0x Flexible Renamer : [sage] 2017/08/29(火) 16:50:10.59:iDduY4Qi お~瑠璃ね~むで十分やぞ D&D用のショトカも作れるしな : [sage] 2017/08/29(火) 17:11:24.47:1aRkt9bd 「のようなファイルがあるときに」の条件がどこまでかわからないが が一番早いのは間違いない : [sage] 2017/08/29(火) 20:06:42.61:KnTCuJQc set "a=あああ_" set "b=.flv" setlocal enabledelayedexpansion for /L %%i in (1,1,99) do set /a c=%%i+1000 & ren "!a!%%i!b!" "!a!!c:~1!!b!" : [sage] 2017/08/31(木) 16:38:58.30:omILiWW+ pushd "%~dp1" :LOOP for /f "tokens=1,2 delims=_" %%a in ("%~n1") do ( set FNAME=%%a set /a FN=%%b+1000 ) ren "%~1" "%FNAME%_%FN:~-3%%~x1" shift if not "%~1"=="" goto :LOOP : [sage] 2017/08/31(木) 17:02:31.64:KsdTyPQv 変換の数字の前が_文字じゃないかもしれないし _文字がファイル名の中に混じっている可能性もあるし : [sage] 2017/08/31(木) 17:53:19.91:Vr+Gp9oD どのスレでも一緒だが質問の要件が分かりにくいのはめんどうだな : [sage] 2017/08/31(木) 18:00:47.56:kMuf1wHV なんでか知らないけど他人に勝手にマルチポストされたけどの質問は元のスレで解決したのでもういいです : [sage] 2017/09/03(日) 22:03:48.56:BJjXydYg cd \ pushd D:\abc setlocal popd としても元の \ に戻らなかった : [sage] 2017/09/04(月) 00:02:37.80:pBY/MKIa そうならなきゃ逆にダメでしょ setlocalでは(親の環境を引き継いだ)別の環境の上で実行されている カレントを移動しようが環境変数を操作しようが元の環境には影響しない pushd D:\abc setlocal endlocal popd または setlocal pushd D:\abc endlocal : [sage] 2017/09/04(月) 01:15:44.81:24unggVp ありがとうございました そういうことでしたか : [sage] 2017/09/16(土) 05:02:43.18:cRJ1WDqm 今さらバッチファイル入門て… 余計な被害者増やさずPowerShellにしろよ これだからIT後進国は 超入門コマンドプロンプト:バッチコマンドで定型処理を行う (1/3) - @IT ttp://jump.5ch.net/?http://www.atmarkit.co.jp/ait/articles/1709/15/news034.html 017年09月15日 05時00分 公開 : [sage] 2017/09/16(土) 05:59:12.53:TbhIjs8j このスレのタイトル見てから言えよ それとも、お前は、自分が使ってないソフトのスレ行って 「別のソフト使え」って言って巡るのが趣味なのか? : [sage] 2017/09/16(土) 06:09:12.67:NzFbxZfY PowerShellに移行しようと思ったこともあるけどファイルをD&D出来ないから断念した あと他人の環境で動くのか分からないから渡しにくいし : [sage] 2017/09/16(土) 06:11:20.82:NzFbxZfY まあbatに面倒臭いとこがあるのも理解できるけど せめて正規表現と小数の計算くらいはあればよかったんだが : [sage] 2017/09/16(土) 11:00:27.02:Nvo3nRRv 自分で使うにはPoweShellはめちゃめちゃ便利だけど 一般的に定着してるかというとそうじゃないし : [] 2017/09/17(日) 11:17:50.05:jtG62g+O PowerShell は起動が遅いから小さいバッチをループで呼び出すのには向いてないんじゃないかな。 いったんロードしたオブジェクトを関数形式で呼び出せばいいんだろうけどよくわからなくてめんどくさいし。 : [] 2017/09/17(日) 11:23:06.30:jtG62g+O 最近、フリーソフトとかの小さいやつの管理がめんどくさくなって メニュー代わりにバッチファイルを使うことにしたんですよ。 全部をVHDに入れてマウントなんで、持ち運びは仮想ディスクファイル1個をコピーするだけ。 起動が素早いのがメリット。 アイコンが出ないのがデメリット。 アイコン出そうと思ったら全環境で共通のドライブ名に固定してショートカットを使ったらいいと思うけど。 プログラムの入ったフォルダ Program Files 3 バッチファイルの入ったフォルダ Program Link [FirefoxPortable.bat] set pathname1=%~d0\Program Files 3\FireFoxPortable52.0.2\FirefoxPortable\FirefoxPortable.exe start "" "%pathname1%" : [sage] 2017/09/17(日) 12:31:00.83:z++LvPT9 それだけならバッチ作るまでもなくハードリンクにすればアイコン問題も解決では : [sage] 2017/09/17(日) 12:37:46.24:z++LvPT9 あ、すまんそれだと実行ファイルと同じフォルダのDLL読めないからダメか : [sage] 2017/09/18(月) 00:06:56.51:AVBMNnfo 短いファイル名に関していくつか質問 1 短いファイル名はダブルクオーテーションで囲まなくても実行可能? 2 短いファイル名は取得して一ヶ月経っても変動せずにそのパスを実行出来る? : [sage] 2017/09/18(月) 23:50:36.04:2dThcY7y 「1」は、多分可能 「2」は、他にファイルが出来なければが前提かと 「dir c:\*1」と「dir c:\*1 /x」を実行して挙動を確かめて下さい。 : [sage] 2017/09/19(火) 00:09:36.87:I5t298fo 少なくともNTFSではファイルの情報としてショートファイルネームも格納されるから ファイルが存在したままある日突然名前が変わることはないはず そのファイルを削除して似たようなロングファイルネームの別のファイルを作った時 同名だけど別のファイルが出来てしまう事はありえる : [sage] 2017/09/19(火) 01:33:17.50:FIGNw+kF レスありがとうございます。 ちなみに自分がやりたかったのは↓と同じケースで自作のbatをタスクスケジューラに登録したいというものでした。 schtasksで半角スペースを含むパスを実行させたい (DOSプロンプト活用相談室LOG) ttp://jump.5ch.net/?http://fpcu.on.coocan.jp/dosvcmd/bbs/log/taskkillstart/at/4-0842.html "を\"と書いてエスケープさせるやり方もあるようですがそちらではbatにダブルクォーテーションで囲った引数を渡すと不可解な動作をすることがあり上手くいきせんでした。 batのパスにスペースを含んだ場合 起動しない batのパスにスペースを含まない場合 %~dp0を実行したときにbatのフォルダパスの頭にカレントディレクトリの文字列も追加される : [sage] 2017/09/19(火) 02:17:59.79:Lhe/hdFe mklinkやsubstを使って違う名前でアクセスするのはどうなのでしょう うまくいくかどうかわかりませんが ファイル名フォルダ名に空白や%^!みたいな記号があると困ることが多いですね : [sage] 2017/09/20(水) 03:12:37.88:aIPv0JYK この書き方に準じていないだけでは? A Scheduled Task Does Not Run When You Use Schtasks.exe to Create It and When the Path of the Scheduled Task Contains a Space ttp://jump.5ch.net/?https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a Schtasks.exe を使用して、スケジュールされたタスクのパスにスペースが含まれている場合を作成するときにスケジュールされたタスクが実行されません。 ttp://jump.5ch.net/?https://support.microsoft.com/ja-jp/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a 失敗例 schtasks /create /tn "my task" /tr "c:\foldername containing spaces\script.bat arguments" /sc once /sd 07/29/2003 /st 10:01 成功例 schtasks /create /tn "my task" /tr "\"c:\foldername name containing spaces\script.bat\" arguments" /sc once /sd 07/29/2003 /st 10:01 : [sage] 2017/09/20(水) 06:44:59.65:w13Y3qRA 自分の説明が下手で伝わらなかったんだと思いますが、成功例の方の記述でパスにスペースを含むbatは起動できるのですがそのbatにダブルクオーテーションを含む引数を渡すと動作がおかしくなるのです。 引数にダブルクオーテーションを含まない場合は正常に起動できます。 : [sage] 2017/09/20(水) 07:01:29.72:w13Y3qRA 一応追記しておくと、おかしくなるのはタスクスケジューラから起動した場合限定で通常の起動では問題ありません。 呼び出すbat内の記述にミスがあるとかそういうのではないと思います。 : [sage] 2017/09/21(木) 11:18:59.39:WXZB4PjF %CMDCMDLINE%はどうなってる? : [sage] 2017/09/21(木) 18:15:09.28:X0F1M9Qy argumentにダブルクォーテションがある場合もパスと同様に\"してる? : [sage] 2017/09/21(木) 18:35:03.44:uKBRYTKY test : [sage] 2017/09/21(木) 18:38:58.99:uKBRYTKY NGワードが含まれていたようなので他所に書きました ttp://jump.5ch.net/?https://pastebin.com/9yMQfC37 : [sage] 2017/09/24(日) 20:04:30.28:0vysq0yQ 基本的に引数の中の半角スペースはデリミタであり そこより左に " が奇数個あればデリミタじゃなくなる それに関しては \" とか ^" とかあっても関係ないんじゃね : [sage] 2017/09/25(月) 14:27:46.65:aNTDK6ge もう見てないかも知れないけど schtasks /create /tn "test\test" /sc once /st 23:00 /tr "cmd /s /c \"\"C:\schtasks test\schtaskstest.bat\" hoge1 hoge2 \"ho ge3\" \"h oge4\"\"" これだと実行ファイルのパスにスペースがあっても問題ない : [sage] 2017/09/26(火) 15:58:12.82:dvSxVtoZ なるほど、直接batを登録するのではなくてcmdのほうを登録すれば良かったんですね 思いつきませんでした 助かりました、ありがとうございます : [sage] 2017/10/10(火) 23:43:05.86:Z33TeZgR 文字コードがUTF8のテキストファイルが2つあるのですが FCコマンドで差分を出力したところ文字化けしてしまいました。 何か良い方法はないでしょうか? : [sage] 2017/10/11(水) 07:47:52.42:S/IKnpLv メモ帳でSJISで保存する : [sage] 2017/10/12(木) 16:57:41.08:c/LUECgg なんでSJISなんだよ、unicodeにすればいいじゃん(Windows2000,XPは除く) @echo off set f1=%1 set f2=%2 if not defined f2 echo 引数1.2に比較するファイルパスを指定してください& goto :eof if not exist %f1% echo ファイル %1 がありません& goto :eof if not exist %f2% echo ファイル %2 がありません& goto :eof start "" /min /wait cmd /u /c "chcp 65001 & type %1>u_%1 & type %2>u_%2" chcp 932>nul fc /u /n u_%1 u_%2 del u_%1 u_%2 : [sage] 2017/10/12(木) 18:25:29.18:c/LUECgg start付けるとうまくいかないな 訂正 start "" /min /wait cmd /c "chcp 65001&cmd /u /c type %1>u_%1&cmd /u /c type %2>u_%2" fc /u /n u_%1 u_%2 : [sage] 2017/10/16(月) 01:07:49.23:rrtzmh2c バッチファイル作っておいて以下のようなフォルダの名前の変更を毎回ダブルクリック一発で済ませたいのですが いろいろやってみたのですが、というほどの力もなく お知恵お貸し下さい 処理前のフォルダ名一覧 1008安住紳一郎の日曜天国 10月15日安住紳一郎の日曜天国 10月15日爆笑問題の日曜サンデー (1) 10月15日爆笑問題の日曜サンデー (2) 処理後のフォルダ名 1008安住紳一郎の日曜天国 1015安住紳一郎の日曜天国 1015爆笑問題の日曜サンデー (1) 1015爆笑問題の日曜サンデー (2) : [sage] 2017/10/16(月) 04:34:03.61:3Tj/cKOj vbs 正規表現置換 ファイルリネーム : [sage] 2017/10/16(月) 08:11:27.58:GL/w6Jlo for /f "delims=" %%a in ('dir /ad /b ^| findstr /b /r "[0-9][0-9]月[0-9][0-9]日"') do call :SUB "%%~a" exit /b :SUB set s=%~1 ren %1 "%s:~0,2%%s:~3,2%%s:~6%" : [sage] 2017/10/16(月) 23:00:12.58:rrtzmh2c ヒント下さったようでありがとうございます。でも、ゼロから書き始めることが出来ないんです。 私の求めていた動作です。これで完璧、ありがとうございます ひと安心して解析に移ったわけです。。。 1. "[0-9][0-9]月[0-9][0-9]日" ↑これでは22月33日にも対応というわけか、こやつめハハハ フォルダ名の行頭部分は日付として機械的に生成される予想できる値ですので[0-9]で何の問題もないです。 勉強の為に、ここをいじってみました。 Month部分は、1 2 3...10 11 12、なら[1-12]で済むのかな。 ところが0埋めなので、01 02 03...10 11 12、となると、0[1-9]|1[0-2]、かな。 Day部分は、01 02 03...29 30 31、うーん0[1-9]|[1-2][0-9]|3[0-1]、となる。 これらを書き換えてみて、はい、動きませんでした。 今回のような自分用プログラムは動けばよいわけで、教えて下さった[0-9]で何の問題もない。 これ以上無駄な時間を掛けても&シンプルな方が可読性がよい : [sage] 2017/10/16(月) 23:01:09.80:rrtzmh2c 2. for a in ('標準出力 パイプ 標準入力') do この部分、パイプの縦棒の左にくっついてる^は何者なのでしょう。。。初めて見ました。 アッ、日付部分が行頭だからか?いやfindstrに行頭オプションの/Bが付いてるし、そもそもパイプの左になぜ? 検索してみたのですがわからずここで冷や汗が出てきて ウーンこれはなんなんだろう。そもそもメタ文字なのか銅貨さえわからない。 3. そもそも何をしているのかというとradikoというプログラムでお気に入りのラジオ番組を録音しています。 AMラジオ番組ではCMのほとんどが過払い金のCMで聞きたくないのでスキップしたいのです。 ウォークマンで右ボタンを長押しすると早送り再生になるのですが、突然入るCMにイラッときて 長押しではなく短く押してしまって次のmp3ファイルに飛んでしまうのです。イライラッ! そこで1分ごとに分割してしまうことにしました。mp3directcutというソフトを使って切り出すことが出来ることを 知りました。そのうち、切り出し作業が面倒になって調べていくうちにコマンドラインでの実行も可能と分かり、 バッチファイル化の作業に掛かりました。出来上がったのは以下のような4行のバッチファイルです。 @echo on echo %* for /D %%a in (%*) do (mkdir "%%~na")&(copy 1min.mpd "%%~na".mpd)&(mp3directcut "%%~fa" /autocue "%~dp1%%~na")&(del "%%~fa")&(del "%%~na".mpd) pause 1min.mpdというのは1分ごとに切る指定が記述されているキューファイルです。同名の.mpdファイルがあるとそれを使ってくれるみたいなので、最初に元ファイルとして作っておきます。 1分ごとに切り分けられたものを再生してもけっこう大丈夫で、音楽だと気付く程度です。 いろいろ書いてしまいましたが頭が精一杯なのでとりあえずお礼申し上げ失礼ます : [sage] 2017/10/16(月) 23:34:41.57:1IRdIkAf ^(キャレット)はエスケープ文字 これを付けずに実行すると、コマンドラインパーサで式評価時にパイプとして機能しちゃう つまりfor文の途中にパイプが現れてそこで途切れちゃうことになる やりたいことは、この行の最初の評価時には単なる|の文字として取り扱ってもらい 次の''で括ったコマンドの評価時にはパイプとして機能してほしいってわけ 1回の評価を→で表すとすると、 ^| → | ^^| → ^| → | ^^^^| → ^^| → ^| → | って感じに展開されていく(俺は3回まで使ったことがある) %a%とかの環境変数の評価も似たようなもんだね %%a%% → %a% : [sage] 2017/10/16(月) 23:49:53.08:1IRdIkAf 環境変数の評価を遅延させる方法はつまり %%temp%%と%^temp%との2通り書けるわけだ (結果的に同じになるけど動作は違う) : [sage] 2017/10/16(月) 23:57:55.48:1IRdIkAf これはコマンドプロンプトでのことでbatに書くときはダメだね : [sage] 2017/10/17(火) 00:03:17.05:bWF1v8hX 評価と展開がごっちゃになってる 俺の理解が浅い(忘れっぽい)せいだな : [sage] 2017/10/17(火) 07:18:41.23:3NFRyYoM ここで言ってる遅延と、いわゆる「遅延展開」は別物ですか? : [sage] 2017/10/17(火) 09:05:40.81:fpIKg5e5 >Month部分は、1 2 3...10 11 12、なら[1-12] []は文字集合。[]内の文字のうち何れか1文字という意味。文字列は扱えない [1-12]だと"1-1"と"2"という意味で1か2になる 01-12月、01-31日を表すのなら [01][0-9]月[0-3][0-9]日 [01]が0か1で十の位、[0-9]が0から9で一の位 桁の揃っている01なら可能だが1-12月はfindstrの貧弱な正規表現では1度に表すのは無理なので 1桁の場合と2桁の場合とを別けて検索文字列に設定する必要がある ちょ、誰か findstr /r "検索文字列" とfindstr /r /c:"検索文字列" の違いを教えてくれ。忘れた : [sage] 2017/10/17(火) 10:39:26.27:AWu3veoe 解説ありがとうございます とりあえず日付の所いろいろやってみてるのですがうまく行かないままです。 正規表現といわず直接文字列を指定して | が有効になるかどうかというところから実験してます。 for /f "delims=" %%a in ('dir /ad /b ^| findstr /b /r ""10月15日"|"10月16日""') do call :SUB "%%~a" pause exit /b :SUB rem set s=%~1 rem ren %1 "%s:~0,2%%s:~3,2%%s:~6%" findstrについての解説は検索で出てきた ttp://jump.5ch.net/?http://www.atmarkit.co.jp/ait/articles/0412/18/news018.html を読みました。読んだだけです。頑張ります : [sage] 2017/10/17(火) 11:38:46.09:fpIKg5e5 >""10月15日"|"10月16日"" "で""を囲えないしfindstrの正規表現で|は使えない findstr /? まともな正規表現を使いたければvbsやPowerShell、Perlとか別のスクリプトに行ったほうがいい バッチだと"&"や"%"とかダメ文字があるし凝った事をやろうとするといずれ行き詰まる 急がば回れ : [sage] 2017/10/17(火) 22:45:54.56:bWF1v8hX 参考にWSHでもどうぞ(hoge.jsファイルとして作成)、コマンドプロンプトから hoge "フォルダ名" (又は cscript //nologo hoge.js "フォルダ名") 又は、エクスプローラ等からフォルダをこのjsファイル(又はショートカット)にドロップして実行 var fso = new ActiveXObject("Scripting.FileSystemObject"); var args = WScript.Arguments; if(args.length<1) throw Error("引数にフォルダを指定してください"); if(!fso.FolderExists(args(0))) throw Error("指定のフォルダが存在しません"); var folder = fso.GetFolder(args(0)), s = "", success = [], fail = [], name, name2, em, i, r; var re = /^(\d{1,2})月(\d{1,2})日(.*)$/; var func_new_name = function(all,mm,dd,ss) { if(mm<1 || mm>12 || dd<1 || dd>31) return ""; return ("0"+mm).substr(mm.length-1) + ("0"+dd).substr(dd.length-1) + ss; }; em = new Enumerator(folder.SubFolders); for(em.moveFirst();!em.atEnd();em.moveNext()) { name = em.item().Name; if(re.test(name)) { name2 = name.replace(re,func_new_name); if(name2) { try{em.item().Name = name2; success.push(" "+name+" -> "+name2);} catch(e) {fail.push(" "+name+" -> "+name2);} } } } if(success.length>0) s = "リネーム成功\n"+success.join("\n"); if(fail.length>0) s += "\nリネーム失敗\n"+fail.join("\n"); WScript.Echo(s || "対象フォルダなし"); : [sage] 2017/10/17(火) 23:49:36.84:G9wCIPXR もうPowerShellのRename-Item使おうぜ 個人用途だろうし制約ないでしょ : [sage] 2017/10/18(水) 02:49:24.30:nuzaMfIv 覚えたてによく居るよね 要件無視した勝手な仕様でエラー判定とか結果ダイアログとかゴテゴテ実装してドヤ顔で持ってきちゃう子 : [sage] 2017/10/18(水) 02:57:26.06:O0s7d+Fx まあダブルクリックで不意に実行されちゃうようなのは作りたくないよな : [sage] 2017/10/18(水) 07:04:24.46:G1+K6kx+ 無理やりバッチファイルの例 for /d %%i in (*) do set "a=%%~nxi" & call :w goto :eof :w setlocal enabledelayedexpansion set "e=m" & set /a b=0,m=0,d=0 :x set "c=!a:~%b%,1!" if not defined c goto :eof for /L %%j in (0,1,9) do if "!c!"=="%%j" set /a !e!=!e!*10+c & goto y if not "!c!"=="月" goto z if not "!e!"=="m" goto :eof if !m! gtr 12 goto :eof set "e=d" :y set /a b+=1 & goto x :z if not "!c!"=="日" goto :eof if not "!e!"=="d" goto :eof if !d! gtr 31 goto :eof set /a f=m*d,m+=100,d+=100,b+=1 if !f! gtr 0 ren "!a!" "!m:~1!!d:~1!!a:~%b%!" : [sage] 2017/10/18(水) 22:17:20.50:on6I0HDV うちの現場のバッチは例え内部で使わなかろうが最低1つは必ず引数を渡す仕様になってる。 そしてそれが渡されなかった場合は処理せずに終了する作りになっている。 理由は誤ってダブクリしちゃった場合の対策なんだってさ。 : [sage] 2017/10/18(水) 22:23:22.61:hY2xT5yc batって大体はD&Dして使うようなの書いてるな : [sage] 2017/10/19(木) 01:03:03.64:cgLUQcTs なんか癇に障ったみたいだけど、言い訳すると 俺は、質問者によって回答内容を変えてる 今回の質問者は初心者だと感じたし、さらには細かい拘りを持っているように見受けられた (13月32日なんて作らないだろうし、もしあったって1332に変換されて悪いことはないと思う) 色々と手を加えて試行錯誤することが好きなんだろうなって思ったから 役に立ちそうな追加部分を記述した それに1レスで書く分には、数行増えようが関係ないだろうと思ったしね : [sage] 2017/10/19(木) 08:32:22.21:ny4cf+Vz なるほど : [sage] 2017/10/19(木) 22:12:55.60:JROgBEvY ザ・ワールド、時よ止まれ。 : [] 2017/10/20(金) 03:00:35.66:1Na2h1P4 キッティングの自動化をしたいんだが、参考になるサイトない? : [] 2017/10/20(金) 03:00:59.71:1Na2h1P4 対象のレジストリ見つけるとかめんどい : [sage] 2017/10/20(金) 23:41:00.84:aZN6SiIl どの程度の自動化? : [sage] 2017/10/21(土) 08:56:40.19:Nsvn2WYb 何を自動化するん? : [sage] 2017/10/21(土) 16:42:48.10:DofUW9OG そんなんツールが出てるんだからその説明でも読めよ : [] 2017/10/21(土) 18:43:14.12:TBS9tbdH 一発で、ファイアウォールの受信規則とかインターネットオプションとか : [] 2017/10/22(日) 07:51:26.89:eb/3UN8i $before = ls -Directory | Where-Object { $_ -match "^\d+月\d+日" } $after = $before | foreach { $_.Name -replace '^(\d+)月(\d+)日', '$1$2' } $idx = 0; $before | foreach { Rename-Item -WhatIf $_.FullName $after[$idx]; $idx++; } PowerShell で書いたので、cd で、そのフォルダへ移動して実行して。 -WhatIf が付いているので、本当には実行せずに、結果だけを見れる。 本当に実行する際は、-WhatIf を削除して実行して 配列 $before には「02月03日」などで始まるフォルダだけを、入れる。 配列 $after には「02月03日」の部分だけを「0203」に変換した、フォルダ名を入れる Rename-Item で、該当する全フォルダ名を変換する : [sage] 2017/10/22(日) 14:53:59.01:1YRZU7Jo 問題は、月を01~12まで、日を01~31までのチェックを入れることだけどね : [sage] 2017/10/22(日) 16:29:48.93:rLFHcAK9 ls <directory-name> -directory | ren -newname {$_.name -replace '^(¥d+)月(¥d+)日', '$1$2' } lsの-filterやwhere-object使ってもいいけど この例の場合は不要だと思うよ : [] 2017/10/23(月) 07:20:31.59:A3jhOkfm ls -directory | ren -WhatIf -newname {$_.name -replace '^(\d+)月(\d+)日', '$1$2' } 上記で、where-object が無いと、 変更されないフォルダまで、表示されるのが気持ち悪い : [sage] 2017/10/23(月) 22:30:10.89:TV21zs/8 Windows7SP1では、Get-ChildItemに-directoryオプションは無いんでエラーが表示された 調べたら、3.0以降でこのオプションが付いた模様 この際なので、5.0,5.1をインストールした Windows7の人の参考まで : [sage] 2017/10/24(火) 18:41:12.61:QQrV41zo PowerShellのスクリプトファイルの拡張子は普通.ps1を使うが デフォルトではファイルの実行を許可してないし、 また許可後もダイレクトにファイル名を指定しても実行できない って保険かけすぎで入門者には敷居が高いだろと思わないでもないなあ where-objectを入れてみた (まだ2時間ぐらいしかやってないんでもっといい書き方があるかも) $re='^(\d+)月(\d+)日';ls -directory|? name -match $re|ren -whatif -newname {$_.name -replace $re,'$1$2'} このスレ的にはアリアス使うなら、lsよりもdirが合ってる気もするけど : [sage] 2017/11/03(金) 20:22:18.43:+gpl8JNW ここで聞くべきか迷ったのですが… 自分のマシンからリモートデスクトップで接続できるサーバー(確かWin2008R2)があって そのサーバーと同じネットワーク内にクライアント端末(Win7)があります。 そのクライアント端末のプロセスをリモートデスクトップで接続したサーバーから確認することは可能でしょうか? (サーバーには管理者権限で接続しています) 要はクライアント端末でtasklistコマンドを打った結果が見たいのですが。 ちなみにクライアント端末はDHCP設定なので起動のたびにIPアドレスが変わります… 今は1日に何度も遠くにあるクライアント端末まで行ってプロセスを確認しています。 1回だけ行ってIPアドレスをメモるぐらいなら全然構わないので何か方法があれば教えて下さい。 : [sage] 2017/11/03(金) 21:42:45.24:91m0YuAi クライアントに自分のタスクリストをファイルを記録する周期ジョブを作成しておく 必要であれば暗号化しておく そのファイルをメールで自動送付するようにしておくか、 クライアントにwebエリアがあればそこに置きこちらから見にいく : [sage] 2017/11/03(金) 21:52:08.46:z1gogpom サーバから tasklist /s クライアント端末名 (/u user /p pass) を実行では見れないんですか? ファイアウォールの設定が必要かもしれませんけど。 : [sage] 2017/11/03(金) 22:47:57.34:+QQUmgGP 1) 他のPCのプロセス状態を知りたい 2) DHCPで設定されているPCのIPアドレスを知りたい ってことでいいかな 1) はtasklist の /s オプションで知りたいPCのIPアドレスを指定すれば行けるはず ただし事前にPC側に設定が必要 かつPCにログインできる情報が必要 2) は 2-1) 直接見に行ってipconfigで確認する 2-2) MACアドレスわかってるならサーバーからそのネットワークアドレス全体にpingを打ちつつarpコマンドで相手のMACアドレス確認していけばいい 2-3) DHCPサーバーを管理してるならPCのIPアドレスを確認する方法があるかも、まあそれならPCのIPアドレスを固定した方がいいかも 2-4) みたいな方法で定期的にIPアドレスを通知してもらう : [sage] 2017/11/04(土) 18:18:26.62:HSP2f8JH みなさん情報ありがとうございます。 来週になったらとりあえずさんの方法を試してみます。(一番手軽なので…汗) それでダメな場合は一日一回直接IPアドレスを確認しにいく方式にします。 というのもpingのブロードキャストは現場のルールで禁止されてるっぽいので。 クライアント端末も特別な用途のためのものなのでタスク作ったり何かを仕掛けるのは厳しそうです。 仕掛けられれば業務はすごく楽になるんですけど「セキュリティ上問題が…」とか言われて突っぱねられる可能性大です。>< 尚、pingブロードキャスト以外の方法でIPを知る方法については自分でも調べてみます。 どうもありがとうございます。助かりました! : [sage] 2017/11/04(土) 18:30:41.27:sTeHaJ1X に書いてあるけど事前にクライアント側の設定しないとtasklist /sでプロセス情報見れないけど、そこは大丈夫なの? : [sage] 2017/11/05(日) 10:20:45.02:rFS24mxQ set infilenm=001.txt set outfilenm=002.txt set beforestr="""" set afterstr="" type nul >%outfilenm% setlocal enabledelayedexpansion for /f "delims=" %%A in (%infilenm%) do ( set line=%%A echo !line:%beforestr%=%afterstr%!>>%outfilenm% ) endlocal 001.txtからダブルクォーテーションを削除して002.txtに保存したいだけなんですが、 3行目と4行目の表記がわからず、考えられる限り書き直して、うまくいきません。 あるいは別のBATでもいいのですが教えてください。 : [sage] 2017/11/05(日) 11:42:01.62:vm51NJQ8 set beforestr=^^" set afterstr=^^ でどうかな? : [sage] 2017/11/05(日) 11:56:26.30:vm51NJQ8 ただ001.txtのデータ次第でうまくいかない場合があるんで 別のスクリプト言語(PowerShellやWSH等)で書いたほうがいい : [sage] 2017/11/05(日) 12:18:29.39:rFS24mxQ 素早いお答えありがとうございます。 >set beforestr=^^" >set afterstr=^^ ダブルクォーテーション消えました! ありがとうございました。 : [sage] 2017/11/05(日) 13:20:27.79:vm51NJQ8 どういうことに使うのか知らないけど、大切なデータなら止めとくべき 改行だけの行が消えるのは知ってると思うけど以下のような行があると(回避は可能だが) ab!cd!ef a! "b ^ : [sage] 2017/11/05(日) 13:40:33.57:rFS24mxQ ご心配ありがとうございます。 大丈夫です。ものは、<a href とかのhtmlタグで作成したリンクリストで、 正規表現とかエスケープっぽい記号等はなく、 そもそもプライベートファイルなので、これで素早くリストができて万々歳です。 : [sage] 2017/11/06(月) 15:18:34.73:K1roLwuw これじゃダメか? ていうかダメな例を教えてほしい for /f "delims=" %%i in (1.txt) do ( set a=%%i setlocal enabledelayedexpansion echo !a:^"=!.txt endlocal ) : [sage] 2017/11/06(月) 15:59:22.60:K1roLwuw 半角スペースだけの行は化けるな : [sage] 2017/11/06(月) 19:12:27.47:Mdq5cGE3 echo,とか、echo;とかで : [sage] 2017/11/06(月) 23:15:25.56:RrRem/45 バッチファイルに渡された引数が1つなのか2つなのかを判定したいのですが どのように記述すれば良いのでしょうか? 以下ではダメでした。 if defined %2 echo 引数は2つです else echo 引数は1つです : [sage] 2017/11/07(火) 01:14:40.14:xsgE2wk0 if not '%2==' : [sage] 2017/11/07(火) 07:09:27.79:4pg/kk0r ありがとう for /f "delims=" %%i in (001.txt) do ( set "a=%%i" setlocal enabledelayedexpansion set "a=!a:"=!" echo.!a!>>002.txt endlocal ) これで空行以外は完璧かな? : [sage] 2017/11/07(火) 10:05:04.55:1287flJj の奴で "echo "を"echo."にするとダメなのに"echo,"にするとOKなのは何故なんだぜ? 今まで、ピリオドとカンマ、セミコロンに違いがあるとは思ってなかったから ずっとピリオド使ってたのに : [sage] 2017/11/07(火) 22:51:26.28:4pg/kk0r "eol=" を指定しないと行頭文字が ; だと読み飛ばす "delims=" を指定しないと行頭の空白が無くなる 両方同時に指定する方法はあるのか? : [sage] 2017/11/08(水) 00:22:28.07:X1Aytah6 for /f delims^=^ eol^= : [sage] 2017/11/08(水) 00:40:11.94:pQrS+Zxc バッチリでした!THANKS! : [sage] 2017/11/08(水) 19:40:30.74:VTzaN0jn 「,」「;」「=」は特別区切り文字だから。 例えば、C:\直下に「a」ってフォルダ作って 「b.cmd」 for /f %%a in ('echo,b') do echo,%%a 「b b.cmd」 echo;c %1 pause のバッチ作成して、コマンドプロンプトで「C:\a」に移動してから 「b.cmd」を実行すると、()の中の「,」が消えた状態で表示される 「b b.cmd」を実行すると、「b.cmd」が実行される 「"b b.cmd"」を実行すると、「b b.cmd」が実行される 今度はファイル名を指定して実行で cmd /c "C:\a\b b.cmd" cmd /c "C:\a\b b.cmd" dを実行すると、pauseで止まるけど cmd /c "C:\a\b b.cmd" "d"を実行すると、一瞬で終わる cmd /c,"C:\a\b b.cmd" "d"なら動く 結構知られていないんだよね。 : [sage] 2017/11/08(水) 22:40:59.50:ZHWfUJ7q ありがとう。完全に動作しました そもそも eol の既定値が ; だとかヘルプに書いてないぞ ちなみに "eol=" とすると eol が空になるのかと思ったら 今度は行頭に " があると読み飛ばすようです 何なんだ、これは。for 文のバグですかね : [sage] 2017/11/09(木) 12:26:56.09:NEfZ8eBs @echo off prompt $g set a=/? set b=exe set c= off echo on echo,%a% echo;%a% echo.%a% echo.%b% echo.%c% echo pause : [sage] 2017/11/10(金) 12:50:53.03:5BeFn7Xg 一時的なwindows資格情報の付与 付与→(再起動)→ポップアップを閉じるまで作業→(再起動) の流れをバッチ実行一発で済ませたいと思ってる。 (○.bat) cmdkey 書き込み copy **.batを配置 schtasks 再起動後のタスク登録(**.bat実行) shutdown 再起動 ↓ (ログイン) (**.bat) echoでmsgbox表示(閉じるまで待つ) cmdkey /delete ←ここで資格情報が消えない schtasks /Delete タスク消去 del /f "%~dp0 自己消去 タスクは一応highest タスク実行だとcmdkey通らないとかある? bat素人で何が原因で消えないのかわからない・・・ ポップアップ表示中にcmd開いてcmdkey打つとちゃんと消える : [sage] 2017/11/10(金) 18:22:22.05:5BeFn7Xg 回りくどい方法ですが自己解決できました。 .vbsにcmdkey /deleteを入れ cmdの管理者権限起動用ショートカットを作成 schtasks からhighestをぬいて、管理者権限でcmdを再起動 vbsを実行で資格情報を消すことができました。 : [] 2017/11/11(土) 23:58:13.74:Smy5DbHD copy /b 1.mp4+2.mp4 3.mp4 上記で結合した3.mp4の動画に2.mp4の内容が追加されないのですがなぜかわかりますか? 3.mp4のファイルサイズだけは1.mp4+2.mp4の容量になっています すぐ出来ると思ったのにつまづいた泣 : [sage] 2017/11/12(日) 01:15:27.00:1rXZudmc ちゃんと結合されている バイナリで結合してフォーマットが1.mp4の分しかないだけ コマンドプロンプトでなく動画フォーマットの勉強しろ : [] 2017/11/12(日) 01:38:03.29:/fk063EO ありがとうございます 出直します : [] 2017/11/12(日) 14:54:34.48:GpB3XqQ3 動画形式の勉強など、自分でやるものじゃない 動画編集アプリを使うべき : [sage] 2017/11/12(日) 14:57:17.00:43gC7oaU 今の編集アプリだとmp4再エンコしなくてもそのまま繋げられるのかな? : [sage] 2017/11/12(日) 15:08:29.51:MOg5phwx バッチから結合を指示できる動画編集アプリよろしくね : [sage] 2017/11/12(日) 15:14:20.67:Xj6DjuPw ffmpegでええやん : [] 2017/11/20(月) 14:42:11.56:rhJshzCP 64bitOS環境 バッチ1つでWOW64内のcmdで実行する方法ってありますか? : [] 2017/11/20(月) 15:06:54.45:rhJshzCP すみません普通にSTARTで呼んでできました… : [sage] 2017/11/22(水) 13:08:53.67:i4qRIFe0 呼び出し元バッチに戻る終了方法を追加してほしい exit /B だとcmdを終わるだけ戻らない call で呼び出さなくても戻る機能をつけてほしい exit /r や return文で : [sage] 2017/11/23(木) 17:36:40.78:cAVsYuht startに待つオプションあるだろ : [sage] 2017/12/06(水) 10:57:13.74:RImq1PQL 昔から無劣化で繋げられるけど?? : [] 2017/12/23(土) 19:00:05.09:Jw1Bivzx ダウンロードしたローカルアプリ(Jane Styleなど)が 重要な場所のローカルファイルから情報を盗もうとしてないかどうか念のため監視したいのですが、 ttp://jump.5ch.net/?https://technet.microsoft.com/ja-jp/sysinternals/handle.aspx このdosで使える handle は出力ファイル名の日本語が文字化けするんですが、何かいい方法ないですか? 文字化け以外に関しては非常に便利です 出力をdosで加工してエクスプローラーのログを除外して、ユーザー+プロセス+ファイル名が初登場の時だけ出力してます これでもし見慣れないファイルアクセスがあったら目立ちます(GUI系はリアルタイムで消えるので) : [sage] 2017/12/23(土) 22:54:57.75:FPRjmoIB ファイル名のようなシステム要件には、半角英数字だけを使う。 半角空白も使うな。Mac でバグる すべてのアプリの開発者が、多国語のファイル名では、テストしていないから、 多くのアプリでバグる 特に、書庫を使う、圧縮解凍アプリでバグる : [sage] 2017/12/24(日) 08:43:36.04:WeE5WMFr echo. で空行を表示できると知りましたが この「.」には何の意味があるのでしょうか? : [] 2017/12/24(日) 15:38:49.19:9EARh1KB 意味を考えてはいけません。調べてませんが、英語のピリオドなので文字列なしで終わりという意味合いからそうしたのでしょう。 : [sage] 2017/12/24(日) 15:51:26.20:nsKMF0PM echoの直後の文字列は出力されないんだっけ? 「.」の以外の文字列でも空行になるけど1番問題が起きにくいとかそんなのかな : [sage] 2017/12/24(日) 18:22:33.52:T/PAdelQ ちょっと前にその辺の話が出てた : [sage] 2017/12/26(火) 01:03:48.59:9+DFjrUc 特別区切り文字というものがあるなんてここで初めて知ったんだけど…(本当かどうかはまだ確かめていない)。 もはや紙媒体で信用できる会社からの体形的な出版物が無いのよね。 …ある?? : [sage] 2017/12/26(火) 01:08:10.71:NGPwifm5 こんなのは仕様じゃなくて実装上の結果にすぎない undocumennt specと言ってもいいが、正式な本に仕様として載るようなもんじゃないと思う : [sage] 2017/12/26(火) 01:23:11.58:9+DFjrUc そりゃ分かるんだけど…。 UNIX の bash だっておかしいところが結構あってさ。 でも「構文解析が未熟な時代、全てを(記号ですら)コマンドだと置いた結果」という説明の仕方ができるそうな。 C言語の仕様だっていい加減後付けが多い。でも説明を試みた結果がANSI。無理が多いけど。 Windows界隈ってそういうのが貧しいと思う。 スレ違いだけど、PowerShell も Core とか言い出してからなんかおかしくないか? : [sage] 2017/12/27(水) 01:13:01.79:1X8kZn43 bashはかなーり最近のプロダクトだと思うのだが : [sage] 2017/12/27(水) 19:45:46.24:8XzWQMmb 特別区切り文字という言葉はアレだけど cmd /? で表示されるヘルプの最終行に =;, は特別な文字として列挙されてますよ。 : [sage] 2017/12/28(木) 06:04:09.70:HvFHYdEd 要はさんざん検証して挙動を確認しないと恐くて使えないってこったなw : [sage] 2017/12/28(木) 07:32:44.10:psxJdr/O 関係ない話ですまんが いまだに cmd /? の表示が変だな、一部重複してる マイクロソフトは直す気が無いのか たぶんNTの頃から変なんだが : [sage] 2017/12/28(木) 08:43:15.72:V28V958v バグレポートに誰も上げていないか、 あるいは上げられていても優先順位がものすごく低いのでしょう。 : [sage] 2017/12/28(木) 18:35:17.03:QlD4+lUL 非成長分野、非収益持ち出し分野とみなされて、最低限の人数しかいないのでは おまけに優秀なのは来ない : [sage] 2017/12/28(木) 19:17:17.28:uuf5XAZw 優秀な奴はさらっと変更して賞賛されるけど、 そうじゃない奴がさらっと変更すると、 勝手なことすんなって怒られるんだよな。 : [sage] 2017/12/28(木) 22:46:38.96:8hIgR6GI bash が最近のプロダクトだとか…ヨボヨボの痴呆が入ったおじいちゃんか? UNIX で bash が出たのって 20世紀なんだが。 これのことか?明らかに違う。 > 引用符が必要な特別な文字は次のとおりです: > <スペース> > &()[]{}^=;!'+,`~ 自分が新規で書けるなら VBScript でいい。 「これは例外、あれも例外、それも例外」なブツなんか触りたくない。 そんな時間があるなら生産的な言語に費やしたい。 触らざるを得ないからイラつく。阿呆か。 PowerShell は Windows の自動化から管理系を抜き出した方向に行こうとしているので何だかねぇ… : [sage] 2017/12/29(金) 00:43:01.22:oAr+Y8wr GNU後の新造品じゃねーか。モダンもいいところだろ。 歴史を知らないバカとは話が出来ないってのは本当だな。 : [sage] 2017/12/29(金) 07:36:55.45:kfbFSvw+ 今時VBScriptとか言ってる老害の相手するなよ... : [sage] 2017/12/29(金) 08:54:48.93:oAr+Y8wr 年寄りのくせにGNU前を知らないんだとしたら、死んだ方がいいね。 : [sage] 2017/12/29(金) 10:58:34.56:dNvcaBYU VBScriptは依然として結構イケると思うけどな : [sage] 2017/12/29(金) 14:50:59.06:Xr0syokO 真面目にそう思ってるならちょっとヤバイぞ : [sage] 2017/12/29(金) 17:11:52.20:oAr+Y8wr VBAと混同してる人がいるようだ : [] 2017/12/29(金) 23:12:55.18:1POkgVP3 はあ? : [sage] 2017/12/30(土) 17:45:48.22:RVllgMXp バッチファイルなのになんでVBの話になるのん : [sage] 2018/01/01(月) 14:25:38.32:TmlLnuaw コマンドのバグ ⇒ 全世界のユーザーに影響出るから下手に直せない コマンドのヘルプの文言誤り ⇒ 優先度低いのでなかなか直さない ってことかなるほど。 : [sage] 2018/01/03(水) 18:47:59.00:G1jkbehM cscriptで自身を実行する外見バッチ中身WSHみたいなんもあるにはあるし… : [sage] 2018/01/03(水) 20:04:05.34:NAv6VFfd 元を辿ってみると、が話を逸らしたせいだ そこからどんどん逸れてvbに行き着いた batに埋め込めるのはjscript(条件コンパイルの構文がbatとうまい具合にかみ合った)だけでvbscriptは無理 : [sage] 2018/01/03(水) 20:12:05.39:lLEkaf6s > vbscriptは無理 ちょっとはググれよ ttp://jump.5ch.net/?https://blogs.yahoo.co.jp/tt77tt77tt77mm/12847863.html : [sage] 2018/01/03(水) 21:17:45.06:NAv6VFfd wsfの手があったか、あとjsでもスクリプトエンコードで書けばなんとかなるね : [sage] 2018/01/13(土) 16:23:41.90:t3TbTPGI powershellで似たような事はできませんか? 1ファイルにしたくて : [sage] 2018/01/13(土) 16:32:17.66:9pJBMU57 【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net ttps://mevius.5ch.net/test/read.cgi/tech/1480109402/ : [] 2018/01/18(木) 18:41:19.43:lAsosfYH どうしても分からないので質問致します。 @echo off @rem バッチファイルのディレクトリに移動 cd /d %~d0%~p0 set USR_INPUT_STR1= ttp://jump.5ch.net/?https://www.openrec.tv/live/fKGMub0cd6j @rem 引数有無と引数名チェック if "%USR_INPUT_STR1%"=="" goto ERROR echo;%USR_INPUT_STR1%|findstr /R /C:"^http" /C:"openrec" >NUL||(echo "%1" を処理できません) && goto ERROR @rem URLのアドレスとHTMLを環境変数へ設定 set ADDR=%USR_INPUT_STR1% for %%I in (%USR_INPUT_STR1%) do set HTML=%%~nxI @rem HTMLダウンロード curl -L --max-redirs 10 -R -O %ADDR% if not %ERRORLEVEL%==0 goto ERROR @rem Shift-JISに文字コード変換 nkf -s --overwrite %HTML% : [] 2018/01/18(木) 18:41:39.14:lAsosfYH set TARGET=%TARGET:playlist=chunklist% @rem ffmpegで動画吸い出し ffmpeg -c copy "%TITLE%.ts" -i "%TARGET%" @rem 最後にcurlで出力したソースファイルを削除 @rem for /R %%f in (*.) do del /Q "%%f" pause exit :ERROR echo 引数が無効のため処理できませんでした pause exit このようなbatファイルを作ったのですが、どうしても最後に sourcefile= ttp://jump.5ch.net/?https://station303.openrec.tv/live1/667d4bef5cb4af8db6b9198cab7b3148e957e477/chunklist.m3u8: Invalid argument と無効な引数と言われてしまい動画の吸い出しが出来ません 完全に手詰まりなため、丸投げにはなってしまいますがご教授いただければと思います よろしくお願いします : [sage] 2018/01/18(木) 19:11:35.69:r+5+UL4/ とりあえず最初の行を rem @echo off にしてどこでエラーになってのか確認しろよ : [sage] 2018/01/18(木) 19:15:53.38:pm/tv2ru これ途中の処理抜けてない? TARGETにURLが入らないんだけど : [sage] 2018/01/18(木) 19:34:30.33:pm/tv2ru 170のやつを適当に書き直したら動いたよ for /F tokens^=2^ delims^=^" %%I in ('type %HTML%^|find /I "data-sourcefile"') do set "TARGET=%%~I" : [] 2018/01/18(木) 19:58:03.19:lAsosfYH の最初が抜けてました・・・ @rem HTMLから文字列抽出 for /F "tokens=2 delims=<>| " %%I in ('type %HTML%^|findstr /R /C:"<title>"') do set TITLE=%%~I for /F "tokens=* delims=data-file= " %%I in ('type %HTML%^|find /I "playlist.m3u8"') do set TARGET=%%~I : [] 2018/01/18(木) 20:06:19.33:lAsosfYH ありがとうございます・・・ エラーを見たのですが、なぜかsourcefile=が付いてしまっていました 何度もありがとうございます : [sage] 2018/01/29(月) 01:16:37.30:s5lQXlw3 echo abc 1>x1 1>x11 2>x2 3>x3 とするとDOS窓が応答しなくなった x11 x2 x3 ファイルができるが x1ファイルはできない : [sage] 2018/01/29(月) 14:21:26.57:e8Iu9+Yp compフォルダ配下にはa,b,c,…ってフォルダがあって、 そのフォルダの中にはzipとrarの圧縮ファイルがある compopenってフォルダを作って、compの中のフォルダ階層は変えないで、compopenフォルダ内のaやb,cのフォルダにそれぞれすべて展開させたいときってどうするの? zipやrar毎にフォルダ作って展開させたい D:/ ├comp/ │ └ a/ │ └ 111.zip │ └ 222.zip │ └ b/ │ └ xx1.rar │ └ xx2.rar │ └ c/ │ └ ttt.zip │ └ rrr.rar D:/ ├compopen/ │ └ a/ │ └ 111/ │ └ 222/ │ └ b/ │ └ xx1/ │ └ xx2/ │ └ c/ │ └ ttt/ │ └ rrr/ : [sage] 2018/01/29(月) 15:15:09.99:LZ9wDs2K の方法で相対パスを取得すれば出来ると思うよ : [sage] 2018/01/29(月) 16:22:04.20:LZ9wDs2K 自分用に書いたbatを流用してみた 多分こんな感じで動くはず ttp://jump.5ch.net/?https://pastebin.com/zEpvpdCa : [sage] 2018/01/30(火) 00:28:24.66:fZrZLUfh set "a=D:\comp" & set "b=D:\compopen" setlocal enabledelayedexpansion for /L %%i in (4,1,1000) do if "!a:~%%i,1!"=="" set "c=%%i" & goto x :x endlocal & set "c=%c%" for /r "%a%" %%i in (*.zip *.rar) do set "d=%%~dpni" & set "e=%%~i" & call :y goto :eof :y setlocal enabledelayedexpansion 7z x -o"!b!!d:~%c%!" "!e!" : [sage] 2018/01/30(火) 04:04:55.14:I+jPXl6+ なるほど 自分のは冗長に書きすぎてたね : [sage] 2018/01/30(火) 16:28:50.07:/nodnUUg 使い回しあんまり考えなければ -------- ここから set path=C:\Program Files\7-Zip;%path% cd /d D:\comp for /f "usebackq delims=" %%i in (`dir /ad /s /b`) do ( echo,"%%~i" set "tmppath0=%%~i" call set "tmppath1=D:\compopen%%tmppath0:~7%%" pushd "%%~i" call 7z.exe x *.* -spe -bso0 -o"%%tmppath1%%\*" 2>>D:\compopen\errlog.txt popd ) -------- ここまで マズいフォルダ(パス)名が無いことを前提に、もろもろ 7-Zip に良きにはからってもらう : [] 2018/01/30(火) 17:10:39.08:25OUwAYA ありがとうございます! 150GBくらいあるから、まだ展開し終えてないけど、 動き出しました。 実際のcompの中のa,b,c,・・・フォルダの中のzipやrarの名前は、 今のところ、下記みたいにフォルダの文字列含んでて、階層を上にしてもよかったかなと思いつつ、 例外も出てくるかもしれないので、このまま走らせてみます。 しっかり解凍しだしてフォルダ生成してくれてます。 D:/ ├comp/ │ └ a/ │ └ a111.zip │ └ a222.zip │ └ b/ │ └ xx1b.rar │ └ xx2b.rar │ └ c/ │ └ cttt.zip │ └ crrr.rar : [sage] 2018/01/31(水) 00:35:03.40:ah9e2u9N そもそも、そんな複雑な手続きには、PowerShell, Ruby などを使えw : [sage] 2018/02/03(土) 09:54:54.05:y+J4EMEq コマンドプロンプトの仕様についてだけど、遅延展開ってデフォでONじゃダメだったのかな? あれ打ち込むのマンドクサ('A`) : [sage] 2018/02/05(月) 04:53:11.12:j3KUW6ez 1.test.exeという実行ファイルがある。 2.test.exeのフルパスは必要に応じて「test.exeをShift+右クリック」→「パスをコピー」して変数testExeに格納してもらう。 このフルパスには"D:\a bc\test.exe"のように空白が含まれることがあるとする。 3.FOR文でこのtest.exeを--helpオプションつきで実行し、結果からfindstr&setしたい。 ---作成バッチ--- @echo off cd /d %~dp0 set testExe="D:\a bc\test.exe" FOR /F "tokens=3" %%a IN ('%testExe% --help ^| findstr "TargetStr"') DO ( set kekka=%%a ) @echo %kekka% pause ---実行結果--- 'D:\a' は、内部コマンドまたは外部コマン ド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ---解1--- testExeを設定する際、全体をダブルクォートで囲むのではなく、 空白を含むフォルダだけをダブルクォートで囲むようにする。 set testExe=D:\"a bc"\test.exe 解1はtestExeの設定が地味に面倒になってしまうので回避したいのですが、何か良い方法はないでしょうか? : [sage] 2018/02/05(月) 05:04:15.80:j3KUW6ez 追記 パスに空白を含む場合も問題ですが、 set testExe="D:\abc\test.exe" のように空白を含まない場合には ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 と言われてエラーになるので、それも含めてなんとかしたいという点を書き忘れていました。 「FOR文でフルパスでコマンドを実行したい場合、どうすればよいのでしょう」というのが根本的な質問です。 : [sage] 2018/02/05(月) 05:55:25.28:j3KUW6ez すみません。ですが、直接フルパスで実行するのではなくフォルダに移動して実行することで一応解決しました。 --- @echo off cd /d %~dp0 set testExe="D:\a bc\test.exe" FOR /F "tokens=1 delims=" %%I IN (%testExe%) DO ( IF "%%~nxI"=="test.exe" ( pushd "%%~dpI" FOR /F "tokens=3" %%M IN ('.\%%~nxI --help ^| findstr "TargetStr"') DO ( set kekka=%%M ) popd ) ) @echo %kekka% pause --- 問題点や、もっとスマートな方法があれば、教えていただけると助かります。 : [sage] 2018/02/05(月) 08:19:13.38:ETXmgzVd @echo off cd /d %~dp0 set testExe="D:\a bc\test.exe" for /f "tokens=3" %%a in ('start /wait /b "" %testExe% --help ^| findstr "TargetStr"') DO ( set kekka=%%a ) @echo %kekka% pause : [sage] 2018/02/05(月) 08:24:05.58:chwOG0ZE 自分もこの問題に直面して同じ解決策とったんだけどこれって何が原因でこうなるの? : [sage] 2018/02/05(月) 10:47:37.64:ETXmgzVd こっちのがいいかも 前に似たようなネタがあったような set testExe="D:\a bc\test.exe" for /f "tokens=3" %%a in ('cmd /s /c "%testExe% --help | findstr "TargetStr""') do ( : [sage] 2018/02/05(月) 11:16:40.07:j3KUW6ez できました!なるほど、startを使えばよかったのですね・・・。ありがとうございます。 なんなんでしょうね。仕組みがよくわからないです・・・。どなたか解説を・・・。 : [sage] 2018/02/05(月) 11:23:08.71:ETXmgzVd やっぱり の cmd はダメだな testExe や TargetStr の中のスペースがデリミタ扱いされる スペースが2個以上続くと誤動作する の start がいい : [sage] 2018/02/05(月) 11:37:48.40:j3KUW6ez 重ねてありがとうございます。 cmdの場合は以下でうまくいくようです。 set testExe="D:\a bc\test.exe" FOR /F "tokens=3" %%a IN ('cmd /c %testExe% --help ^| findstr "TargetStr"') DO ( : [sage] 2018/02/05(月) 13:08:35.91:Emu9UBTE 括弧の中の最初と最後の引用符が削除される? : [sage] 2018/02/05(月) 14:11:13.29:ETXmgzVd やっと思い出したぞ裏技w 前後の端にダミーの二重引用符 ^" を付けるんだった のおかげで思い出したぜ set testExe="D:\a bc\test.exe" for /f "tokens=3" %%a in ('^"%testexe% --help ^| findstr "targetstr"^"') do ( : [sage] 2018/02/06(火) 13:18:25.70:m2OYikdE できました。なるほど、そういう解釈がされるんですね・・・。 バッチってほんと思わぬところでひっかかりますよね。とても勉強になりました。ありがとうございます。 : [] 2018/02/07(水) 10:59:47.18:fDqCQtuz VBでプログラムを作っているのですが、行き詰ってしまったので質問させていただきます。 バッチでiniファイルを読み込み、iniから取得したデータを格納した変数をVBのソース内で使いたいのですが可能ですか? exe形式での納品となるのでiniファイルの読み込みはどうしてもバッチ内で行いたいのです。 ちなみに処理の流れとしては、iniファイル読み込み→exeファイル実行となっています。 どなたかご教授ください。よろしくお願いいたします。 : [sage] 2018/02/07(水) 11:12:08.68:fDqCQtuz 申し訳ございません。 バッチでiniファイルを読み込み、iniから取得したデータを 格納した変数をVBのソース内で使いたいのですが可能ですか? VBのソース内の変数に格納したいのですが可能ですか? ○ でした。 : [sage] 2018/02/07(水) 11:43:25.21:LQaGrglb バッチで、ini ファイルを読み込み、必要な値を取り出して、 それらを引数にして、exe を起動する そして、exe 内では、引数から読み込んだ値を使う : [] 2018/02/07(水) 12:00:38.62:fDqCQtuz どう調べたらいいか分からず困っていたのですが、引数の取得で検索すればなんとかなりそうですね。 後は自分で調べてやってみます。ありがとうございました。 : [sage] 2018/02/07(水) 16:46:31.34:EyPJd6fI バッチだと for文を使います 複雑なことをするのであればVBで直接読み込む方法もあります : [sage] 2018/02/10(土) 12:18:28.89:/lSv2IRR バッチでiniファイルなんて読み込めるの? VBとかからGetPrivateProfileStringとかのAPIを使うんじゃないの? まあ力技で出来ないことはないんだろうけど自分が知らないだけで一般的なやり方というのがあるのかな? : [sage] 2018/02/10(土) 15:32:33.27:K6TfvilX ググればふつうに出てくるようだが。(内容まではちゃんと見てない) : [sage] 2018/02/10(土) 16:29:19.90:Sj+J5yD3 の言うようにfor文を使う わかりやすいとは言えないし特殊文字が含まれると色々面倒なのでおすすめはしない : [sage] 2018/02/11(日) 19:16:43.96:l1W9SMIH バッチファイルでファイル操作って一見ちゃんと動いてるように見えて穴だらけって場合が多いからやりたくないな wshで実装したりps辺りで既存のAPI呼び出す方がいい : [sage] 2018/02/11(日) 19:44:19.46:+WWL4Di4 batで設定呼び出したい時はiniじゃなくてsetting.batに変数を直接記述してcallしてるわ このやり方も良いやり方なのかどうか分からんけど : [sage] 2018/02/12(月) 12:02:40.25:OYWjTvif ttp://jump.5ch.net/?http://ascii.jp/elem/000/001/630/1630041/ Windows 10 RS4に追加された「curl」と「tar」コマンド って curl と tar が追加されるんだ PowerShell にも curl コマンド(エイリアス)があってややこしさが増すな でも、標準で使えるようになるのはバッチファイル使ってる身とすれば 嬉しくはある : [sage] 2018/02/12(月) 15:53:42.90:BbO5lIMB もうRS4か RS3の不具合なんとかしてくれよ : [] 2018/02/18(日) 16:07:03.48:OqSvNe2j ファイル圧縮バッチを hta の画面にドロップするだけで実行するやつ作った ttps://medaka.5ch.net/test/read.cgi/csaloon/1518353191/843-846 ファイルをバッチファイルにドロップして引数受け取りは普通にあるけど ファイル名の一部を文字列としてドロップしても起動されないのでこういう方法を取った。 : [sage] 2018/02/18(日) 16:25:37.39:ZqWPhgUg Windows10 なら、WSL で、MS Store から、Ubuntu 16.04 LTS をダウンロードすれば、 curl, tar も入っている 他のLinux のコマンドも、一杯ある : [sage] 2018/02/18(日) 19:16:35.61:yvQzNzLN それはバッチから使えるの? : [sage] 2018/02/18(日) 19:20:27.56:F2O3xW/S 普通に使える ubuntu run curl --help : [sage] 2018/02/19(月) 04:53:30.17:xIEc0S27 Linux(Ubuntu)側のbash、Windows側のPowerShell・コマンドプロンプトから、 相互のアプリ・コマンドを実行できる 相互のパイプも、つなげられる つまり、Linux側のbashは、Windows10 の1つのアプリになっている : [sage] 2018/02/19(月) 08:14:36.88:2cNNs3G6 > Ubuntu 16.04 LTS をダウンロードすれば、 この手の前提条件が無いことがバッチのメリットなのに... : [sage] 2018/02/19(月) 22:58:00.92:oh22XJYs Web開発テスト用の範囲を超えてない。 当のMSが「運用には使ってくれるな」つってるのによ。 お前馬鹿か?馬鹿だろ。 : [sage] 2018/02/19(月) 23:41:31.81:9tX9GnHd なんでこの人「運用」とか言い出してんの? : [sage] 2018/02/19(月) 23:44:41.90:uhfYTKrf WSLはウェブサービス開発で使って、 実際にそのウェブサービスを動かす(=運用)するのは ネイティブなLinuxの上だぞ。例えばAzure上のLinuxとか 運用に使ってくれるなっていうのは、WSL上でウェブサービスを動かして 実際に不特定の人にサービスを提供するなっていう意味だ : [] 2018/02/20(火) 00:06:58.45:amqSspGZ WSL 上で、Webサーバーとかを常時接続させて運用できない まあ最初から、自分のデスクトップPC を外部につなげて、 そんなサービスをする奴は、居ないだろ : [sage] 2018/02/20(火) 00:08:38.09:ZtM0s1po バッチで使うのは運用ではないと? : [sage] 2018/02/20(火) 00:13:22.58:XC4KsyV/ 端末のスタートアップスクリプトに使うのも用途外。 だから「使える」とか言うのは明らかに言い過ぎ。 お前馬鹿か?馬鹿だろ。 : [sage] 2018/02/20(火) 00:40:00.47:wdwe47Ke > 端末のスタートアップスクリプトに使うのも用途外。 端末のスタートアップスクリプトの話なんかしてないんだが、 何を言い出してるんだ? そもそも端末のスタートアップスクリプトの 意味わからねぇw 運用っていうから悪いんだよ。 「一般ユーザーに対してのウェブサービスの提供」 MSが使うなって言ってるのはこれだけだよ : [sage] 2018/02/20(火) 00:43:54.06:wdwe47Ke うん、ちゃんとFAQに書いてあったね ttp://jump.5ch.net/?https://docs.microsoft.com/en-us/windows/wsl/faq > Also, even though you will be able to run many popular server applications (e.g. Redis), > we do not recommend WSL for server scenarios ? Microsoft offers a > variety of solutions for running production Ubuntu workloads in Azure, Hyper-V, and Docker. サーバーアプリケーションを実行できるが、サーバーとしてのシナリオは推奨してないと : [sage] 2018/02/20(火) 00:46:37.66:wdwe47Ke もう一つ、誰のためのものですか?という質問には > Who is this for? > This is primarily a tool for developers -- > especially web developers and those who work on or with open source projects. 第一に開発者、特にウェブ開発者やオープンソースプロジェクトを行ってる人 > This allows those who want/need to use Bash, common Linux tools (sed, awk, etc.) and > many Linux-first tools (Ruby, Python, etc.) to use their toolchain on Windows. bashや多くのLinuxツールや言語を使いたい人のためのものと : [sage] 2018/02/20(火) 00:57:48.56:amqSspGZ Windows のコマンドプロンプトから、 wsl bash -c "echo 'hello'" 出力結果 : hello これぐらいのLinux の起動・実行・終了は、1秒! 定時処理ぐらい楽勝 サーバーみたいに常時実行しなければ大丈夫 : [sage] 2018/02/20(火) 01:27:38.14:wdwe47Ke wsl.exeを使うなら bash -c はいらないぞ wsl echo hello でよい wsl echo --help と wsl /bin/echo --help の実行結果が違うから wslの中ではbash上で動いているっぽい wsl ps axfu やってもbashいないんだけどな まあ詳しい人に聞けば、そこら辺の動きは知ってるだろう。 あと、別にLinuxは起動してるわけじゃないのでLinuxの起動と書かれると違和感がある。 WSLはLinuxカーネルを模したサブシステム : [sage] 2018/02/20(火) 01:41:53.13:amqSspGZ Windows のコマンドプロンプトで、 >where wsl C:\Windows\System32\wsl.exe >where ubuntu C:\Users\ユーザー名\AppData\Local\Microsoft\WindowsApps\ubuntu.exe wsl, ubuntu(Linux), bash の関係がよくわからない 漏れのノートPC は、i3、メモリ8GB、SSD だけど、 Windows10 の単なるアプリだから、起動・実行・終了で、1秒ほど WSLは、もう正規版だし、単なるアプリとして使う分には、問題ないだろ : [sage] 2018/02/20(火) 01:44:26.24:amqSspGZ 書き忘れた Windows のコマンドプロンプトで、 >where bash C:\Windows\System32\bash.exe : [sage] 2018/02/20(火) 01:53:46.64:amqSspGZ Windows のコマンドプロンプトで、 >wsl echo hello >ubuntu -c "echo hello" >bash -c "echo hello" これらは皆、hello が出力されるけど、書き方が異なる wsl では、echo がサブコマンドになっているのかも : [sage] 2018/02/20(火) 01:58:14.32:wdwe47Ke 俺もちゃんと調べたわけじゃないけど、 開発の歴史からすると、 最初はbash on ubuntu on windowsという扱いで bash.exeでUbuntu上のbashが起動できる(おまけでLinuxコマンドも使えるよ!)という扱いだった。 このbashが起動できるという仕組みを提供しているものの名前がWindows Subsystem for Linuxだったわけだが 開発が継続しLinuxカーネルとの互換性があがってもうbashだけが起動するもんじゃないよねってことで Windows Subsystem for Linuxの略であるwslと呼ばれるようになり。 wsl.exeができた(おそらくbash -c "コマンド" と面倒な書き方をしなくて良いラッパー) それと前後して、ubuntuだけじゃなくopenSUSEやFedoraも動くよ!(いやFedoraまだリリースされてないんだが) ということになり、bash.exeやwsl.exeで起動するのはどっちのディストリよ? ってことでそれを切り替えることができるwslconfig.exeができた。 また直接wslconfig.exeの設定によらず、ubuntuやopensuseを直接起動するための ubuntu.exe やopensuse-42.exe が出来た。 こんな所だと思う : [sage] 2018/02/20(火) 02:00:13.61:ZtM0s1po なんでバッチスレでパソコン博士がWSLでイキってるの? : [sage] 2018/02/20(火) 02:01:02.04:wdwe47Ke ubuntu /?をするとわかるが、 ubuntu run echo helloが正しい ubuntu.exeもwsl.exeもbash.exeもパラメータの扱いが違うだけで ディストリ上のbashを実行していることは確かなようだ : [sage] 2018/02/20(火) 02:01:43.71:wdwe47Ke Windows 10において、バッチファイルでWSLと連携するのは 当たり前の話になってきているから : [sage] 2018/02/20(火) 02:04:18.90:wdwe47Ke ubuntuは Usage: <no args> - Launches the distro's default behavior. By default, this launches your default shell. と書いてあるから、bashじゃなくてデフォルトシェルが呼び出されるのかも。 うーん、どれを使うのが良い(汎用的)なのだろう? : [sage] 2018/02/20(火) 02:51:43.01:amqSspGZ wsl(Linux のbash)・PowerShell・コマンドプロンプトの3つが、 パイプでもつなげられるし、シームレスになってきて、CUI が統合されてきているから、 個別の話よりも、3つのCUI をパイプでどうつなげるかの方に、 話の焦点が移ってきている : [sage] 2018/02/20(火) 03:10:41.01:amqSspGZ bash は、C:\Windows\System32\bash.exe を起動する ubuntu は、bash, zsh など、自分がデフォルトに設定した、シェルを起動する。 環境変数、$SHELL >wsl echo $SHELL /bin/bash wsl コマンドが、ubuntu, open suse など、 自分がデフォルトに設定した、Linux を起動 >wslconfig /list Windows Subsystem for Linux ディストリビューション: Ubuntu (既定) 推測で書いたけど、普段は、wsl を使うと良いかも : [sage] 2018/02/20(火) 06:46:25.63:+0IlbXev オモチャ買ってもらった子供が「見て見てこれすごいんだよー」って言ってるような感じ 暖かく見守ってやれ : [sage] 2018/02/20(火) 12:42:35.46:ZtM0s1po WSL出た頃なら仕方が無いが... やっぱパソコン博士レベルだと今頃になってやっとおもちゃを見つける感じなのか。 : [sage] 2018/02/20(火) 19:54:28.42:+0IlbXev へへーん、ぼくなんてまえからもってるもんねー それはすごいねー w : [sage] 2018/02/20(火) 21:48:42.53:BI5N21qv さすがにスレチだからもうやめとけと思うけど、WSLについて少し調べてみようと思うきっかけにはなったわ。 : [sage] 2018/02/20(火) 22:56:06.68:wdwe47Ke パソコン先生に恨みでもあるのかな? そんな話をしてもバッチファイルを書く上で 何の意味もないと思うんだが、話をしたいのだろうね : [sage] 2018/02/20(火) 23:00:35.05:wdwe47Ke Bash on Ubuntu on Windowsは、早く使いたかったんで Inside Previewに変えてまで使ったよ。 GUIアプリには対応していないって書いてあったが仕組み上 GUIアプリ動くんじゃね?ってそこの頃はまだ情報が少なかったけど 実際に自分で試してxeyes は動いたーって2ちゃんねるに書いた記憶がある : [sage] 2018/02/20(火) 23:11:12.21:BI5N21qv 自分語りとか余計なことをダラダラ書き連ねるから嫌われるんだよ。 : [sage] 2018/02/20(火) 23:20:45.61:wdwe47Ke 嫌うのは相手の問題だからどうしようもない 俺に対する勘違いは、俺の問題だから解決する必要がある : [sage] 2018/02/21(水) 02:19:50.48:PXpce9sQ パソコン先生、怒りの連投きたー : [sage] 2018/02/21(水) 02:50:21.44:1KGQWp4x 連続してね~じゃんw : [sage] 2018/02/25(日) 16:07:21.04:97AlcoLv 例えば「aaa」という名前のODBCの設定は以下のコマンド reg query HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa を実行すると HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa Driver REG_SZ C:\WINDOWS\system32\SQLSRV32.dll Server REG_SZ aaa Database REG_SZ aaaDB LastUser REG_SZ ***** Trusted_Connection REG_SZ Yes のように表示できますが この設定の接続先データベース(上記ではaaaDB)をコマンドで変更することは出来るのでしょうか? : [sage] 2018/02/25(日) 17:44:24.52:f0GbsyKa reg add HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa /v Server /t REG_SZ /d bbbDB とかでだめなん : [sage] 2018/02/25(日) 19:41:52.11:97AlcoLv 「/v Server」は「/v Database」の間違いですよね? これでバッチリいけました。ありがとうございます! : [sage] 2018/02/28(水) 10:04:11.85:xTKxXp1v windows10 のコマンドプロンプトの、文字色を変えるエスケープシーケンスで、 prompt ^[[1;36m[$d$s$t$h$h$h] ^[[1;33m%USERNAME% ^[[37m$p$_$g$s prompt $e[1;36m[$d$s$t$h$h$h] $e[1;33m%COMPUTERNAME% $e[37m$p$_$g$s echo ^[[1;36mバッチファイル^[[37m は動作しますが echo $e[1;36mスクリプト$e[37m だと駄目でず。 ( ^[ は、CTRL+[ で入力する制御文字(\x1B)) echo で有効な「$e」の様な入力方法は有りますか? : [sage] 2018/02/28(水) 10:18:01.40:xTKxXp1v 自己解決しました : [] 2018/03/16(金) 22:05:15.90:HEHaQcsS バッチファイルで 空行を除く最終行にhogeって文字がなかったら追加して改行 -- hogeとかになってたら削除してhoge追記して改行 って事をやりたいんですけどどうやったらできるかおせーてください : [sage] 2018/03/17(土) 05:37:29.93:nxO/ldT7 Ruby で作った require 'stringio' ary = [] File.open(ARGV[0]) do |io| text = io.read text.rstrip! # 末尾の連続した空白を、すべて削除する sio = StringIO.new text ary = sio.readlines # 全行を配列に読み込む if ary[-1] == '-- hoge' ary[-1] = "hoge\n" elsif /hoge/ !~ ary[-1] # hoge を含まない ary[-1] += "hoge\n" else return end end # 一旦ファイルを削除してから、書き込む File.open(ARGV[0], 'w') { |io| io.write ary.join } : [] 2018/03/17(土) 12:51:31.78:HNxDhnRb あのーバッチって聞いてるのにrubyのスクリプト出されても困るんですけど : [sage] 2018/03/17(土) 13:17:48.14:FI/uI0vX やらなくても言い余計なことをして場を混乱させる人って必ずいるよね : [sage] 2018/03/17(土) 13:29:47.44:Y0/A+N6A ルビ厨の相手するなよ... : [sage] 2018/03/17(土) 13:33:32.46:T/uji2Bj ロジック真似すればいいだけじゃん 作ってくれじゃなくて教えてくれなんだから Lispで回答されて読めないのは理解できるが 上のRubyくらいなら何の問題もないだろ : [sage] 2018/03/17(土) 15:03:38.07:RY7g5/8I 聞かれてるのはバッチでの実現手段なのにロジックとか言い出してどうすんだよ : [sage] 2018/03/17(土) 15:06:43.59:9hc/1qQU 文字列の比較も削除も面倒だから バッチではやらないほうがいい : [sage] 2018/03/17(土) 17:30:52.69:4x6FsbbS vbscript版作ったけどバッチ限定なら貼らなくいい? : [sage] 2018/03/17(土) 18:08:03.98:RY7g5/8I 一応無理矢理ここまで作ってみたけど、ファイルの中身や指定文字列に特殊文字が入ってると 容赦なくコケるという地獄仕様のままなんで、限定的にしか使えないと思う。 有意な最終行の内容にあわせて結果ファイルを出力するバッチ ttp://jump.5ch.net/?https://pastebin.com/mh9BZDCv コケないようにやるにはどうすればいいのかな・・・。誰かうまいやり方があれば教えてくれ。 : [sage] 2018/03/17(土) 18:14:53.08:4x6FsbbS 読んでてなんか泣けてきた : [sage] 2018/03/17(土) 18:22:19.25:RY7g5/8I 俺の選んだ手法がアホなだけかもしれんけど、バッチって基本的に制約多くて泣けてくるもんだから・・・( ノД`) せっかくだしvscript版もどこかに貼ってもらえるとありがたいな。 : [sage] 2018/03/17(土) 18:29:59.15:71uTBaAx にそれらしいことは書いてあるから、ダメってことはないだろう ただ、「Jscript・Perl等の埋め込み」って何だろう バッチファイルに他言語のコードを埋め込めるのか? : [sage] 2018/03/17(土) 18:38:49.28:RY7g5/8I 「バッチ JScript」とかでググればいいんじゃないか : [] 2018/03/17(土) 19:54:28.64:HNxDhnRb ありがとうございますとても参考になりました : [sage] 2018/03/17(土) 21:16:57.69:Eknm4yJC @echo off set n0=0 set n1=0 set n2=0 set file="xxx.txt" set newfile="new.txt" set word=xxx type nul>new.txt for /f "tokens=1* delims=:" %%i in ('findstr /n "." %file%') do set n0=%%i for /f "tokens=1* delims=:" %%i in ('findstr /n /c:"%word%" %file%') do set n1=%%i for /f "tokens=1* delims=:" %%i in ('findstr /n /c:"-- %word%" %file%') do set n2=%%i if %n0% equ %n1% if %n1% neq %n2% goto :eof if %n0% equ %n2% (call :del-line %n2%) else (copy /y %file% %newfile%>nul) call :add-line move /y %newfile% %file%>nul goto :eof :del-line for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" %file%') do if %%i neq %1 echo;%%j>>%newfile% goto :eof :add-line echo;%word%>>%newfile% goto :eof : [sage] 2018/03/18(日) 00:33:29.96:Sr1iY1Ai ループ回しすぎじゃね? 小さいファイルならいいだろうけど でかいログファイルとかだと辛いかも : [sage] 2018/03/18(日) 01:44:49.36:WKBkcipr バッチのfor /f ~ in (ファイル)って1行ずつシーケンシャルにメモリに読んでるって考えていいのかな? : [sage] 2018/03/18(日) 04:17:33.81:Cc3+LG/u wordってのがどれだけの頻度で出現するかで違ってくる もし殆ど書かれてないのなら、最後が --hogeならforループはほぼ2回分(wordが各行当たり前にあるのなら4回分) hogeやなしならforループはほぼ1回分(wordが各行当たり前にあるのなら3回分) wordと--wordの検索は一緒のループでできそうだけど あと、データ中に、&|^%"'\や%date%を入れてみたけど問題ないみたいだ(win7) : [sage] 2018/03/18(日) 04:26:44.33:Cc3+LG/u いや各行にwordと--wordのどっちかしか無いとするなら--wordの場合で最大でも3回分か : [sage] 2018/03/18(日) 05:31:06.94:5/8yH4g6 set /a a0=0,b=0,c=1,e=1 for /f "delims=: tokens=1*" %%i in ('findstr /n .* in.txt') do ( set "a%%i=%%j" if defined a%%i set /a b=%%i set /a c=%%i+1 ) setlocal enabledelayedexpansion if not "!a%b%!"=="!a%b%:hoge=!" set /a c=b set "a%c%=hoge" del out.txt :y echo.!a%e%!>>out.txt set /a e+=1 & if !e! leq !c! goto y : [sage] 2018/03/18(日) 07:42:25.76:Cc3+LG/u 1万行ある適当なテキストファイルでテストしてみた の方、3.1秒 (最後に-- hoge行を加えた場合 7.5秒) の方、2分14秒(最後に-- hoge行を加えた場合 2分14秒) ってな結果になった の方はforのループ回数は多いが、比較すると速いという結果になった : [sage] 2018/03/18(日) 16:56:47.62:93ta1lhd Oh...ワタシ findstr /n ノキョドウカンチガイシテタネ... : [sage] 2018/03/18(日) 20:22:40.18:93ta1lhd 、は対象ファイルの行頭にコロンがあると消されちゃうね。 : [sage] 2018/03/18(日) 22:13:27.07:WKBkcipr そういう後から判明するバグが紛れ込むからバッチで文字列処理は嫌なんだよな : [sage] 2018/03/18(日) 22:14:36.65:5/8yH4g6 先頭から連続するデリミタは全て消される , どっちもダメ は /? もダメ abc :::def /? -- hoge : [sage] 2018/03/18(日) 22:17:56.90:5/8yH4g6 /? は の方がダメだった : [sage] 2018/03/18(日) 22:45:10.52:WKBkcipr 俺が仮組みしてみたやつもforの変な仕様で空行削除されてた バッチだけで手軽には無理だな 素直に適当なスクリプト使った方がいい : [sage] 2018/03/18(日) 22:59:27.55:Cc3+LG/u セミコロンをピリオドとかコロンとにするといいみたい echo; → echo: : [sage] 2018/03/18(日) 23:05:58.69:Sr1iY1Ai 424のほうのgoto labelをfor(/L)にすると多少速くなるけど findstrを繰り返し使ったほうが速いね メモリにも優しい : [sage] 2018/03/18(日) 23:09:22.00:WKBkcipr どの文字に変えてもその文字が来ればデミリタ判断されておかしなぶった切りが起こるから デミリタ文字のエスケープ処理が必要になるんでは : [sage] 2018/03/19(月) 02:29:30.41:VE4HgUIn ラデミリタ ○デリミタ : [sage] 2018/03/19(月) 06:32:04.04:UCUeI8NE UTF8扱えない時点で限界を感じる : [sage] 2018/03/19(月) 09:11:01.79:cAxnz/N1 set /a a=0,b=0,c=0,d=1 & del out.txt 2> nul for /f "delims=:" %%i in ('findstr /n . in.txt') do set /a a=%%i for /f "delims=:" %%i in ('findstr /n hoge in.txt') do set /a b=%%i if %a%==%b% set /a c=b for /f "delims=0123456789 tokens=*" %%i in ('findstr /n .* in.txt') do ( set "e=%%i" setlocal enabledelayedexpansion if !d!==!c! goto x echo.!e:~1!>>out.txt endlocal set /a d+=1 ) :x echo hoge>>out.txt : [sage] 2018/03/20(火) 06:19:09.67:5rDh/omp 元ファイルにechoで追加ですむ場合もあるが ファイル終端が改行になってるか確認する方法が思いつかない : [sage] 2018/03/20(火) 08:03:38.21:BuzmWDFp 終端に改行があろうがなかろうが、echoで出力すれば改行は付加されるよ あとは参考になるかわからんが set LF=^ setlocal EnableDelayedExpansion findstr /n .* in.txt findstr /n $ in.txt findstr /n !LF! in.txt の出力の差で終端改行のありなしの見分けがつくかも (setとsetlocal行の間の空行は省略しないこと) 改行コードが、CR/LF、LF、CRで違った結果が出るところが面白いよ : [sage] 2018/03/20(火) 19:42:04.51:5rDh/omp ファイル終端が改行になっていないと最後の行の後ろにhogeがくっつくだけだよ で試してみなよ echoで空行を追加してからhogeを付ければいいんだけど それだとファイル終端が改行になっていたら余計な空行ができる : [sage] 2018/03/20(火) 20:10:53.11:to9q6Sr+ コマンドプロンプトの画面で以下の<コマンド①>を入力すると現在の年月日時分秒が表示されるのですが これを変数に入れるにはどうすれば良いのでしょうか? 以下の<コマンド②>ではうまく入りませんでした・・・ <コマンド①> powershell -command "date -f yyyyMMddHHmmss" <コマンド②> set NICHIJI=powershell -command "date -f yyyyMMddHHmmss" : [sage] 2018/03/20(火) 23:06:27.49:BuzmWDFp のことじゃなかったのか : [sage] 2018/03/20(火) 23:18:51.64:aHaiWzOW for /f "delims=" %%G in (‘powershell -command “date …”’) do set “NICHIJI=%%G" : [sage] 2018/03/20(火) 23:52:48.01:BuzmWDFp 外部プログラムの標準出力を取り込むのが目的ではなくて、単に現在日時をセットするだけならバッチのみで済むけど set NICHIJI=%date:/=%%time::=% set NICHIJI=%NICHIJI:~0,-3% : [sage] 2018/03/21(水) 01:09:02.52:UBrEBSgZ すみません、分かりにくい文でした を改造しようとしたが改行がネックだと言う話 以下の通り改造してみた の4行目と5行目の間に一行挿入 if %c%==0 goto y ラベル:x以降は変更 :x echo hoge>>out.txt goto :eof :y copy in.txt out.txt & call :x for /f %%i in ('findstr .* out.txt') do set "e=%%i" if "%e%"=="hoge" goto :eof copy in.txt out.txt echo.>>out.txt goto x : [sage] 2018/03/21(水) 01:15:45.86:UBrEBSgZ あ、for /f "delims=" かな : [sage] 2018/03/22(木) 16:25:40.46:pbBa6R9F echo と同じ行で何か実行すると空白が入る echo.>a echo.>b & rem dir a b : [sage] 2018/03/22(木) 17:04:47.92:pbBa6R9F 豆知識その2 echo と同じ行でパイプ実行すると表示が変わることがある set a=%%b%% set b=xxx echo %a% echo %a% | more : [sage] 2018/03/22(木) 17:12:47.60:pbBa6R9F 豆知識その3 文字化け嫌なら遅延展開で @echo off set "a=a > nul" set "b=b & rem" echo %a% echo %b% echo ------ setlocal enabledelayedexpansion echo !a! echo !b! pause : [sage] 2018/03/22(木) 21:50:43.44:TJWufbYh プログラムからファイルの追加・削除・変更などを行っている最中のフォルダに対して「dir /s」のコマンドを実行した場合 そのせいでプログラムからの処理を邪魔してしまうことってあるのでしょうか? : [sage] 2018/03/24(土) 19:48:05.05:pj5y8nH5 絶対に邪魔をしないと言い切るのは難しいな。悪魔の証明 : [sage] 2018/03/25(日) 01:41:58.87:cTYVl2v9 普通は影響しないと思ってていいだろう そのプログラムがシビアな待ち時間を気にするような造りにさえなってなければね : [sage] 2018/03/25(日) 14:43:32.24:8LXGoh28 dirはファイル自体を見に往くわけじゃないから : [sage] 2018/04/03(火) 02:29:58.94:yDWDpnwx ちょっとハマってしまったのでアドバイスをいただきたく。 @echo off cd /d %~dp0 setlocal ENABLEDELAYEDEXPANSION FOR /f "delims=" %%i IN ('cmd /u /c ECHO;名') DO ( SET CR=%%i SET CR=!CR:~0,1! ) SET LF=^ set CRLF=!CR!!LF! set DATA=alpha beta gamma set DATA2=%DATA: =!CRLF!% @echo ---------------------------------------------- @echo !DATA2! @echo ---------------------------------------------- (@echo !DATA2!) > testdata2.txt @echo -------------FOR開始--------------- FOR /F "tokens=*" %%a in ('echo !DATA2! ^| findstr /C:"be"') DO ( @echo FORに入った @echo %%a ) @echo -------------FOR終了--------------- :last pause : [sage] 2018/04/03(火) 02:42:57.22:yDWDpnwx でやりたいこと ・空白区切りの文字列群が入っている環境変数DATAがある。 ・ここから、特定の文字列(ここでは"be")を含む文字列だけを取り出したい。 ・空白を改行(CRLF)に置換してfindstrすればいいかと思ったが、 @echo !DATA2! > testdata2.txt では確かに改行されたファイルができるものの、 @echo !DATA2! | findstr /C:"be" だと、そもそも @echo !DATA2! が "alphaCRLFbetaCRLFgamma"のような単一行扱いでfindstrに渡されるらしく(?)、うまくいかない。 出力結果は -------------FOR開始--------------- FORに入った alpha -------------FOR終了--------------- となってしまう。 (echo alphaCRLFbetaCRLFgamma をやろうとして、CRLFのとこまでしか出力してないということ?) ・type testdata2.txt | findstr /C:"be" にすればいいのだが、できれば一時ファイルへの出力は行いたくない。 何か良い方法はないでしょうか。 : [sage] 2018/04/03(火) 18:08:30.38:dFuhrusg 日立だな : [sage] 2018/04/03(火) 21:08:04.29:NTm1Ga+l 空白区切りならcallとshiftで回せばいいのでは @echo off set DATA=alpha beta gamma call :SEARCH %DATA% goto :eof :SEARCH if "%1" == "" goto :eof echo %1 | findstr be shift goto SEARCH : [] 2018/04/05(木) 19:45:55.97:9RkYEovX とあるプロンプトを表示して確認画面でyes/no入れてyesが表示されたら処理を続けるnoが入れられたらgoto ENDって事がワンライナー(一行)でやりたいんですけど良い方法ありませんか? : [] 2018/04/05(木) 19:54:59.74:9RkYEovX は例えば↓なのを一行でやりたいんです setlocal set /p answer="実行しますか(y/n)? : %answer%" if "%answer%"=="y" ( echo "start" ) else if "%answer%"=="n" ( echo "cancel" exit /b 1 )else ( echo "other key" exit /b 1 ) endlocal : [sage] 2018/04/05(木) 21:02:59.97:KYHgmfzR ワンライナー云々抜きに choice.exe は使ったらダメ? : [] 2018/04/05(木) 21:10:59.87:vXFo65tf 環境的にツールの導入は認められません : [sage] 2018/04/05(木) 22:30:55.38:ivnu80TE choiceはWindowsに標準搭載されてるが ttp://jump.5ch.net/?https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/choice : [sage] 2018/04/05(木) 22:40:55.26:BdFdoEej database.txt にある複数の文字列を delete.txt の内容で消去したいと考えているのですが 「複数の文字列 削除」でぐぐっても複数ファイルから単一の文字列を削除するtipsしかヒットせず迷子の状態になってしまいました。 調べ方を教えていただけないでしょうか、よろしくお願いします。 [database.txt] りんご,ごりら,らっぱ,ぱんだ,だちょう,うし,しお,おにぎり,りす, [delete.txt] ごりら ぱんだ うし りす [output.txt] りんご,らっぱ,だちょう,しお,おにぎり, : [sage] 2018/04/05(木) 23:13:44.90:KYHgmfzR XP なら追加が必要だが、Microsoftさまのリソースキットにはある 2003 もしくは XP 64bit 以降なら のいうように標準で存在する まさか XP? : [sage] 2018/04/06(金) 01:14:00.52:fUXQxuPE 確かWindowsXPだけでなくWindowsNT4.0やWindows2000の場合も 別途リソースキットからchoice.exeを持ってくる必要があったな。 : [sage] 2018/04/06(金) 01:53:25.80:eal1pYjS Ruby で作った # 行区切りのキーワードファイル text_kw = File.read 'keyword.txt' keywords = { } text_kw.each_line do |line| # 1行ずつ処理する line.chomp! # 末尾の改行を削除する # 0文字でなければ、ハッシュに追加する keywords[line] = true unless line.length == 0 end text = File.read 'data.txt' # 末尾の改行を削除して、カンマ区切りで配列に入れる words = text.chomp!.split(',') # その単語がハッシュにあれば、配列から削除する words.delete_if { |word| keywords.has_key? word } # カンマで連結して、ファイルに上書きする File.write('out.txt', words.join(',')) : [sage] 2018/04/06(金) 03:19:39.27:Jw59w3Z9 このrubyガイジはバッチスレにも住みついてんのか : [sage] 2018/04/06(金) 07:06:54.89:1XYxdGEK ↓ガイジのおともだち 667 名前:ピラフ ◆9Jro6YFwm650 [sage] 投稿日:2018/04/05(木) 22:04:35.89 ID:SYfKFmGc * * * + グッジョブ! n ∧_∧ n + (ヨ(* エ∀`)E) Y Y * : [] 2018/04/06(金) 07:12:37.58:n8Wm7bZP rubyマンワロタ 本スレでやれよw : [sage] 2018/04/06(金) 10:00:35.29:fQXPpScw いただきたく。 ください。 なんでわざわざ長ったらしい書き方するんだろうね。 しかも質問してるくせに偉そうという。 : [sage] 2018/04/06(金) 23:57:01.63:LzrMMW4f 何故かWindowsPEに入っていない不思議 : [] 2018/04/07(土) 09:33:59.62:QDDx5b92 日立マンワロタ 日立スレでやれよw : [sage] 2018/04/07(土) 13:50:49.47:VdZT6mQb 回答者でもないお前が質問者の態度を問うな : [sage] 2018/04/07(土) 15:41:13.15:1zm7m+j1 おれは日本人としての道徳を説いてるんだが : [sage] 2018/04/07(土) 21:08:07.97:dWk4eLw8 あそこは日本人じゃなく山猿が結構いるよ : [sage] 2018/04/07(土) 23:31:37.19:pb/9IsOI for /l %%n in (1,1,10) do ( : [sage] 2018/04/11(水) 23:23:30.97:sp32so0L 質問させてください。 プログラムの標準出力を変数に代入する方法を調べ、以下のような方法を見つけて動作を確認しました。 FOR /f "DELIMS=" %%A IN ('ECHO ABC') DO SET ABC=%%A しかし、'ECHO ABC' の部分にダブルコーテーションが含まれているとうまく動作しませんでした。 何らかの方法でダブルコーテーションをエスケープする必要があると思うのですが、 その方法をご存知の方がいらっしゃれば教えていただけないでしょうか。 よろしくお願いします。 : [sage] 2018/04/12(木) 05:05:32.49:8z3G53ms と同じ話かな : [sage] 2018/04/12(木) 07:05:02.54:UI16Z2bS @echo off FOR /f "delims=" %%A IN ('ECHO hoge^"hoge') DO SET "ABC=%%A" echo %ABC% pause : [sage] 2018/04/21(土) 16:41:01.08:x8Crqpim こんなファイルがありまして 2018/04/21 09:30:00 count 10 2018/04/21 10:00:00 count 20 ↓のように変換出力したいです 2018/04/21 09:30:00<tab>10 2018/04/21 10:00:00<tab>20 どのようにしたらいいでしょうか : [sage] 2018/04/21(土) 18:30:43.44:9o1T2SLn <tab>はTABコードだと判断したが、もし単なる文字列ならその部分は修正してくれ @echo off setlocal EnableDelayedExpansion type nul>out.txt for /f "delims=N" %%I in ('cmd /u /c echo 三') do set TAB=%%I set n=0 for /f "tokens=* delims=" %%i in (in.txt) do ( set d!n!=%%i set /a n+=1 if !n! geq 3 set n=0&echo.!d0!%TAB%!d2!>>out.txt ) endlocal : [sage] 2018/04/21(土) 20:19:07.52:kVqs7sc1 下手にバッチでやるよりエディタ等で \ncount\nをtabに一発置換するだけのような : [sage] 2018/04/21(土) 20:38:40.63:6+H6buOa >'cmd /u /c echo 三' ナニコレ : [sage] 2018/04/21(土) 21:33:42.67:x8Crqpim これでできました でも難しくて意味が分からないけど 秀丸でやったらできました これは楽ですね お二人ともありがとうございます : [sage] 2018/04/21(土) 21:41:42.48:9o1T2SLn 今まで何度か出てたはずだけど覚えてないかな? 漢字の三は、SJISでは8E4Fだが、Unicodeでは、U+4E09 英字Nは、ASCII(SJIS)で、4E HT(水平タブ)文字は、ASCII(SJIS)で、09 : [sage] 2018/04/22(日) 03:16:01.56:HWr0EbfP は3行1セットを大前提として1行目+タブ+3行目で1行として出力するバッチやね 中身が何かっての全く確認しないから変な行あったら以後盛大に誤爆する : [sage] 2018/04/22(日) 06:56:22.77:Lev+VBnm @echo off type nul>out.txt setlocal enabledelayedexpansion set n=0 for /f "delims=" %%i in (in.txt) do ( set "d!n!=%%i" & set /a "n=(n+1)%%3" if !n! equ 2 if not "%%i"=="count" echo.!d0!>>out.txt&set n=1& set "d0=%%i" if !n! equ 0 echo.!d0! !d2!>>out.txt ) !d0!と!d2!の間は普通にtab入力 : [sage] 2018/04/22(日) 07:14:11.56:H/AU6k7y だからなに? : [sage] 2018/04/22(日) 19:58:53.86:Ai4JHVEf バッチは不特定多数に提供するんでなければ、やっつけでいいんだよ 取り合えず用が足せればいい ああいう場合にどうだとか余計なことはそういう場面に遭遇してから対処すればいい まあ違う考えを持ってる人もいるだろうから俺の考えではと限定しての意見だが : [sage] 2018/04/22(日) 21:50:25.52:Lev+VBnm もやっつけだよ 不具合だらけ : [sage] 2018/04/23(月) 00:48:13.86:+coOi68A 元となったデータを見てると、何かのプログラムで出力した結果のようだから イレギュラーなデータはそもそもあり得ないのかもしれない それをイレギュラーなデータがあったらと考えていろいろ対処するのどんなもんなのかな : [sage] 2018/04/23(月) 01:49:13.44:+coOi68A あと、は、こういう処理をしているんだからそれを念頭においてねってことだけで、 何もその点を修正しろとか言ってないわけよ も、何をしてるのか分かっていて使う分にはそれで良いと思ってるんじゃないのかな : [sage] 2018/04/23(月) 16:55:05.27:75V+260b が > でも難しくて意味が分からないけど こんな事言ってるから何してるのか書いただけよ それ以外の意味は無い : [sage] 2018/04/26(木) 21:33:25.10:iUADfoHj バッチファイルを直接ダブルクリックした時は処理の最後にpauseをかける(=コマンドプロンプトウインドウを 閉じずにホールドする)条件にして、コマンドプロンプトから呼び出された場合はpauseはかけずに処理を 終了するという実装をしたいんですが、いい方法ありますか? : [sage] 2018/04/26(木) 21:43:36.77:g7ZPMx3V 引数で処理を分けるか、pause有無でバッチファイルそのものを分ける。 : [sage] 2018/04/26(木) 21:50:58.00:5PgkCptO 適当でいいなら%CMDCMDLINE% : [sage] 2018/04/26(木) 21:57:48.38:vlAm5Lzz %0 参照して分岐すれば? echo %0 pause : [sage] 2018/04/26(木) 22:30:55.90:iUADfoHj レスありがとうございます>各位 すいませんダブルクリックと書いたのでミスリードになってしまったのですが、実際にはD&Dで引数も使用します。 なのでの環境変数参照して/Cオプション実行しているかどうかで分岐しようと思います。 : [] 2018/04/27(金) 01:23:21.22:XIoO9rX1 ログファイルで確認するようにすればいいのに。 : [sage] 2018/04/27(金) 19:57:13.14:CQ9eqs6l え? : [sage] 2018/05/01(火) 06:45:44.95:aXoGd7xG 64桁の10進数を16進数に変換する方法、探したけど見つからなくて バッチファイルだけでやるのは無理があるでしょうか。 javascriptでなら巨大な桁数いけるサイトはあったのですが バッチファイル内で大量に処理したいのです。 : [] 2018/05/01(火) 08:40:01.76:04a9c6T+ ネットワークカードに複数IPアドレスをバッチファイルで当てる方法教えてください。 netsh interface ipv4 set add name="ローカル エリア接続" static addr1="192.168.15.35" このあと 192.168.1.35も割り当てたい、よろしくお願いいたします。 : [] 2018/05/01(火) 08:45:13.16:04a9c6T+ 自己解決 netsh interface ip add address name="ローカル エリア接続" addr=192.168.1.35 mask=255.255.255.0 : [sage] 2018/05/01(火) 17:14:01.70:cVB2iu29 取り敢えず、これでやったらどう? ttp://jump.5ch.net/?https://technet.microsoft.com/ja-jp/sysinternals/hex2dec : [sage] 2018/05/01(火) 23:59:01.96:7h2ZqymN 普通の手段だと無理だと思う。 1. 整数演算はOSのbit数の上限までしかできない 2. 文字列として変換するにしても255⇒0xFFが限界 …。 3. そもそも符号無し16進??有りの16進?? : [sage] 2018/05/02(水) 00:09:36.26:bQsnMWtx ほぼ無理 自転車で崖を上がりたいというようなもの あきらめて、これを機に何かの言語を覚えるといろいろな場面で一生使える 一番簡単なのはinstall不要なgawk : [sage] 2018/05/02(水) 00:34:38.73:69djG7nz 訂正。64bit環境でも調べたけど、最大2147483647(符号付32bitのMAX)だった。 : [sage] 2018/05/02(水) 02:01:56.61:z5LQTSUi ありがとうございます。hex2decは試行済でした。 1234567890000987654321000000 を渡すと 7766001854005038656 = 0x6BC6618A48FECE40 このように崩れます。 やはり無理がありますか。。。 gawkはlinuxのようですね。windowsで実現する方法を求めていました。 バッチファイルでは出来そうにないのでWSH JScriptあたりを探してみたりしていました。 他手段を探してみたいと思います。ありがとうございました。 : [sage] 2018/05/02(水) 03:07:32.00:KFhIKBMV batでも出来るんだけど、実用な時間で出来るかと言われると何ともねえ @echo off setlocal set hex=0123456789ABCDEF set in=1234567890 set out= set bin= :loop call :div2 in s set bin=%s%%bin% if defined in goto :loop :loop2 set h=000%bin:~-4% set /a h=("%h:~-4,1%<<3")+("%h:~-3,1%<<2")+("%h:~-2,1%<<1")+%h:~-1% set bin=%bin:~0,-4% call set out=%%hex:~%h%,1%%%out% if defined bin goto :loop2 echo.0x%out% endlocal goto :eof :div2 set dst= set s=0 :divloop set d=%in:~0,1% set in=%in:~1% set /a s=s*10+d set /a h="s" set /a s%%=2 if defined dst (set dst=%dst%%h%) else if %h% gtr 0 set dst=%dst%%h% if not defined in set in=%dst%&goto :eof goto :divloop : [sage] 2018/05/02(水) 03:13:02.96:q7DG1Lgj 生きている間に終わらないってこと? : [sage] 2018/05/02(水) 03:17:05.83:KFhIKBMV これはやっつけで作ったんで、もっとスマートにできるかも知れない なお、div2ルーチンは最初変数を独立させるためにsetlocalで別環境にしてた名残が呼び出し元の引数に残ってる(無意味だから何で付けてるのって思わないように) : [sage] 2018/05/02(水) 03:19:47.60:KFhIKBMV いや実際やってみればわかる 64桁程度なら一応待てる??時間内で終わるよ? inに10進数値をセットするが、%1に書き替えて起動時の引数で与えるようにすれば色々試せるだろう : [sage] 2018/05/02(水) 06:44:11.75:D/jExvSh awkなら速くできるの? : [sage] 2018/05/02(水) 07:02:56.10:ESv7owpX 元の質問者じゃないけど、これ動かすとたまに「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」って出る。 自分で書いたbatもループとかcallが多いとこれが出たりリダイレクトに失敗してたりする事があるんだけど何が原因? ごくごく稀に飛ぶはずのないラベルに飛んで動作不良起こしたりもする。 : [sage] 2018/05/02(水) 18:25:33.72:vWDYKqwa これとかは? ツール関係の小部屋 ttp://jump.5ch.net/?http://sky.geocities.jp/hp_gabo200x/room_tool.html C-style arbitrary precision calculator ttp://jump.5ch.net/?http://sky.geocities.jp/hp_gabo200x/mysoft/gcalc.lzh : [sage] 2018/05/02(水) 21:55:01.98:KFhIKBMV OSは何だろう? こっちは、win7pro 64bit 通常そういう変な動作はワークエリアが残ってない場合なんかに起きる 環境変数をいっぱい定義して領域が残ってないとか そういう場合、コマンドプロンプトを一旦閉じて再度起動して初期状態にして試してみる win2000で環境変数領域は2048バイト、winXPでは8192バイト、それ以外はヘルプにコマンドプロンプト関連のの説明が無い でもまあ大抵はbatに問題がある のはこっちでは70桁を指定しても正常に動作してるが、 setlocalで子環境を作ってて、サブルーチンから抜けるときにはendlocal無しにgoto :eofしてるので その辺が問題なのかもしれない この辺はよく分からないので、一度setlocal,endlocalを削除して試してくれ : [sage] 2018/05/02(水) 22:06:46.67:KFhIKBMV そのメッセージがbat実行直後なら(つまりあまりに瞬時で実行してるように思えない場合)、 本当にbatファイルが別プロセスで使用中なのかも知れない 裏で何かのプログラムがbatファイルを握って離さないとか (インデックスサーチとかセキュリティチェックとかは、俺は作動させてないのでどうなのかは知らない) : [sage] 2018/05/03(木) 05:58:29.18:KZ8lRGiM OSはwin10 64bitです。 セキュリティソフトはWindows Defender、インデックスサーチはWindows Search、Everythingを使ってます。 これらは利用者多いのに同様の不具合は聞いたこと無いから関係無いかも? 環境変数はいくつか自分で追加したけど問題になるほど登録してるとも思えないしよく分からない。 他になにか悪さをしているソフトがあるのかなあ。 : [sage] 2018/05/03(木) 11:45:15.41:Ox4SBvDu もう見てないかも知れないが、 俺の古いPCで、64桁で0.4秒ほどの実行時間です @echo off setlocal enabledelayedexpansion set "a=1234567890123456789012345678901234567890123456789012345678901234" set "g=0123456789ABCDEF" set "h=" set /a b=8,e=100000000 for /L %%i in (8,8,56) do if not "!a:~%%i,1!"=="" set /a b=%%i+8 set "a=0000000%a%" set "a=!a:~-%b%!" for /L %%i in (%b%,-8,8) do set /a "a%%i=1!a:~-%%i,8!-e" :x set /a c=0,f=0 for /L %%i in (%b%,-8,8) do set /a "d=a%%i+c*e,a%%i=d,f|=a%%i,c=d&15" set "h=!g:~%c%,1!%h%" if %f% neq 0 goto x for /f "delims=0 tokens=*" %%i in ("%h%") do set h=%%i echo %h% pause : [sage] 2018/05/03(木) 18:33:32.97:Ox4SBvDu の gcalcを使用すると簡単 >type a printf("%x\n", 1234567890123456789012345678901234567890123456789012345678901234) >gcalc < a > b >type b 0x30046030f26f462d7ac21a27eb9d53fff233c7acd12d87e96aff2 : [sage] 2018/05/03(木) 18:53:18.66:Ox4SBvDu すまん、printfの次の行にexitを追加して : [] 2018/05/04(金) 16:14:55.26:hkAWCjpW すごい!ありがとうございます! なんか微妙だなーと思って戻ってみたら凄いスマートなのリプきてた。 gcalcとも比較してみましたがかなり早いですね。㍉秒二桁くらい違う。 使わせていただきます。ありがとうございました! : [sage] 2018/05/04(金) 23:52:47.93:Ry3XO9FI Ruby では、 num = 9999_1234567890_1234567890_1234567890_1234567890_1234567890_1234567890 num.to_s(16) #=> "184e78450dd8c1fca3b502d65e4f6fb73c42c47ccff196ce3f0ad2" : [sage] 2018/05/05(土) 00:20:09.03:uOR+hZGm dcなら 値1 値2 : 値n 16of : [sage] 2018/05/05(土) 04:13:57.15:nqyvYHZY gcalc面白いね こんな書き方が通っちゃうんだー --bat-- @echo off gcalc -d config(\"tab\",0), base(16), <in.txt; quit; rem gcalc -d config(\"tab\",0), base2(16), <in.txt; quit; --in.txt--- 1111111111 2222222222 3333333333 : [sage] 2018/05/14(月) 16:02:14.00:vCNzBA31 %1や環境変数が数字だけか判定するのが面倒 ぐぐってやりかたはわかったが、もっとすっきりくっきりな方法はないですか 正規表現だと ^\d+$ でおわりなのに set W=x%1 set W=%W:0=% set W=%W:1=% set W=%W:2=% set W=%W:3=% set W=%W:4=% set W=%W:5=% set W=%W:6=% set W=%W:7=% set W=%W:8=% set W=%W:9=% if '%W%=='x echo 数字 : [sage] 2018/05/14(月) 16:37:10.19:qPzKX5Gg set X=100 echo %X%|findstr /X "[0-9][0-9]*"&&echo 数字 こうとか : [sage] 2018/05/15(火) 01:55:36.53:VsPlEm8N @rem 2147483648 以上の数は扱えないため、大きい値が入る条件には不向き。 set "W=%1" set DUMMY=a set /A "DUMMY=W*1" if not "%W%"=="%DUMMY%" (echo 数字以外) else echo 数字のみ : [sage] 2018/05/15(火) 15:39:31.76:Aaz/hbaw -123 数字のみ : [sage] 2018/05/15(火) 15:47:52.58:Aaz/hbaw 0001 数字以外 : [sage] 2018/05/16(水) 00:05:23.47:vNnFvDtx ありがとうございます findstって正規表現のようなことができるのですね、知らなかったです 英字だけ、数字だけだといいのですが、英数字混在文字列でエラーになりました *1 の代わりに +0も同じでした : [sage] 2018/05/16(水) 03:54:43.21:Hrg3NbAG @echo off call :check_num %1 result echo %result% pause goto :eof :check_num if "%~1"=="" set "b=FALSE" & goto :eof for /f "delims=-+0123456789 tokens=* eol=" %%i in ("%~1") do ( set "a=%%i" if defined a (set "b=FALSE") else set "b=TRUE" ) endlocal & set "%2=%b%" : [sage] 2018/05/16(水) 04:03:04.73:Hrg3NbAG 7行目の :check_num の次の行に setlocal を追加願います : [sage] 2018/05/16(水) 04:13:36.97:Hrg3NbAG なんか間違ってたので書き直した @echo off call :check_num %1 result echo %result% pause goto :eof :check_num setlocal if "%~1"=="" set "b=FALSE" & goto x for /f "delims=-+0123456789 tokens=* eol=" %%i in ("%~1") do ( set "a=%%i" if defined a (set "b=FALSE") else set "b=TRUE" ) :x endlocal & set "%2=%b%" : [sage] 2018/05/16(水) 16:36:26.52:VQztSlVV 1"2 result"=="" set "b=FALSE" & goto x の使い方が誤っています。 : [sage] 2018/05/16(水) 16:48:32.10:VQztSlVV "1" TRUE 1"2" ECHO は <OFF> です。 : [sage] 2018/05/16(水) 21:51:04.87:Hrg3NbAG 引数の中の " の対策すると大変なんで、やりたくない やりたい人、どうぞ : [sage] 2018/05/16(水) 22:31:00.96:VQztSlVV 1^2 1|2 1&2 : [sage] 2018/05/16(水) 23:12:48.91:Hrg3NbAG 引数の中に cmd で特別な意味を持つ文字が有る場合は左に ^ を付けるか 全体を " で囲むしかないよ : [sage] 2018/05/16(水) 23:15:29.43:VQztSlVV は宛て 的には、1^^2 : [sage] 2018/05/16(水) 23:50:08.13:Hrg3NbAG FALSE になるようだが何か問題があるの? : [sage] 2018/05/17(木) 00:05:45.00:TsNh8oQN ああ分かった リテラルが 1^2 の場合ね 失礼 : [sage] 2018/05/17(木) 00:31:20.52:TsNh8oQN call :check_num "%~1" result にでもすりゃいいのかな こういうのは考え出すときりが無い様な気がするが : [sage] 2018/05/17(木) 01:18:19.29:zVFG07SK 分かってるのかどうか知らないが、 1"2"が、ECHO は <OFF> です。になるのは、eol="が効いてるため : [sage] 2018/05/17(木) 06:56:29.62:TsNh8oQN eof= を消すと副作用があるし どっちにしろ引数に ; があると誤動作するみたいだし こりゃあもうお手上げだな : [sage] 2018/05/17(木) 07:02:08.36:TsNh8oQN あ、eol= だった : [sage] 2018/05/17(木) 07:11:43.15:pqvSuRzJ 質問者が「もっとすっきりくっきりな方法」と言ってるんだから複雑でトリッキーな方法は求められてなないだろう : [sage] 2018/05/17(木) 08:50:29.12:zVFG07SK : [sage] 2018/05/17(木) 09:36:13.96:cmWUEZX7 いつもそうなるけど、バッチじゃ諦めろ、が正解になってしまうよw : [sage] 2018/05/17(木) 10:17:41.58:TsNh8oQN どんな方法でも良いから 引数の中に " とか ; が入ってても 正しく動作するのを頼む というのは絶対に無理なのかね : [sage] 2018/05/17(木) 11:47:23.61:TsNh8oQN が不可ならそれを前提条件にするしかないだろ ちょっと直してみた @echo off call :check_num "%~1" result echo %result% & pause & goto :eof :check_num setlocal set "b=FALSE" & if "%~1"=="" goto x for /f "delims=-+0123456789 tokens=*" %%i in ("%~1") do ( set "a=%%i" & if not defined a set "b=TRUE" ) :x endlocal & set "%2=%b%" : [sage] 2018/05/17(木) 17:15:43.43:TsNh8oQN とりあえず引数の " と ; の対策らしきもの 引数は行末まで1個のみ もう嫌気がさしたのでこれ以上はやめとく @echo off set a=%*" set /a b=0,c=0 setlocal enabledelayedexpansion :x set d="!a:~%b%,1!!a:~%b%,1!" if !d!=="" goto y if !d!=="""" set /a c+=1 if !d!==";;" set /a c+=1 set /a b+=1 & goto x :y endlocal & set c=%c% set "e=FALSE" & if %c% gtr 1 (goto z) else set "a=%*" for /f "delims=-+0123456789 tokens=*" %%i in ("%a%") do ( set "a=%%i" & if not defined a set "e=TRUE" ) :z echo %e% : [sage] 2018/05/17(木) 17:16:28.81:zVFG07SK @echo off set "arg1=%1" call :check_num arg1 result echo %result% & pause & goto :eof :check_num setlocal EnableDelayedExpansion set "b=FALSE" for /f "delims=0123456789 tokens=*" %%i in ("!%1!") do ( set "a=%%i" & if not defined a set "b=TRUE" ) :x endlocal & set "%2=%b%" goto :eof 引数に ; は指定できない(半角空白、カンマ、セミコロン、=は引数の区切りを示すため) なお、遅延環境変数の展開を使わないでも以下のようなチェックで最初に弾けば可能 if "%arg1:"=%" equ "%arg1:"=”%" (echo ^"なし) else echo ^"あり : [sage] 2018/05/17(木) 17:18:28.36:zVFG07SK なお、+-は除くのが吉 +1+2-3 : [sage] 2018/05/17(木) 18:05:24.87:TsNh8oQN >554.bat 1"&ab" 'ab""' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 TRUE : [sage] 2018/05/17(木) 21:22:44.52:zVFG07SK これ以上はファイル渡しにすべきだろう set /p or for /f delimes^=^ tokens^=*^ eol^= : [sage] 2018/05/17(木) 21:53:53.10:TsNh8oQN 554.bat とあるが実際は のバッチ処理結果です バッチ2行目の set コマンドの、左側の " が悪さをしてる 当然、下にあるチェック文もそのままでは使えない 引数 1;2 は実際には2つに分かれるが これで TRUE を返すのは違和感あるので では FALSE を返している 2つの %* を %1 にすれば TRUE を返せる筈 : [sage] 2018/05/18(金) 12:57:02.82:CQAI+hTy これが分からない ttp://jump.5ch.net/?https://social.technet.microsoft.com/Forums/ja-JP/610268b2-c3f7-4e4f-8aa2-9d32353804e4?forum=win10itprogeneralJP : [sage] 2018/05/18(金) 15:14:59.49:nWqd9LPa for /f %%i in ('"cmd /k prompt $h <nul"') do set BS=%%i set /p AAA=".%BS% 必要ですか?(y/n):" : [] 2018/05/23(水) 19:31:22.87:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 1FF18 : [sage] 2018/05/24(木) 10:48:33.72:cPlRxlDn 1FF18 : [sage] 2018/06/10(日) 03:50:12.86:TMZk6u5D バッチファイルと同じ階層に複数のテキストファイルがあって、 バッチファイルに次々とドラッグ&ドロップしたファイル名(拡張子含む)のみリスト化していくのは下記でできるのは分かったのですが… @echo off for %%f in (%*) do ( echo %%~nxf ) >> list.txt しかし、バッチファイルと同じ階層(別の階層でも良いですが)に複数フォルダがあり、各フォルダ内にテキストファイルが複数ある場合に、 フォルダをバッチファイルに1つ1つD&Dすることにより、そのフォルダ内のファイル名(拡張子)のみリスト化していくコマンドが分からず詰まっています。 /rを使わずにわざわざ1つずつD&Dするのは、単にファイル名の順番ではなく、リスト化を意図した順番にしたいからです。 どなたかお願いします。 : [sage] 2018/06/10(日) 16:08:13.36:fV9CYqGb なんだって? : [sage] 2018/06/10(日) 19:14:45.63:UcKh88So @echo off cd /d "%~1" for /r %%f in (*.txt) do ( echo %%~nxf ) >> "%~dp0list.txt" : [sage] 2018/06/10(日) 20:30:30.29:T1x52eBJ まずは、 >リスト化を意図した順番 これを詳しく説明するところからだな : [sage] 2018/06/10(日) 20:59:39.63:TMZk6u5D できました ありがとうございます! 意図した順番というのは、D&Dした順番、という意味でした : [] 2018/07/04(水) 22:24:09.32:gFgZc5FG GTD : [sage] 2018/07/05(木) 16:48:32.11:AeL6VB/V GTD : [sage] 2018/07/08(日) 09:59:18.33:48/+VLR1 ファイル名に半角スペースを含んで拡張子も一つじゃない複数のファイルをドロップしてファイルごとに処理したいんだけどどうfor書いたらいい? 今はこんな感じで書いてるんだけど半角スペースで切れちゃう for %%f in (%*) do ( echo "%%~nxf" ) : [sage] 2018/07/08(日) 17:55:51.22:fq5YPvHI それで問題なさそうなんだけど、 どういう問題なのか分からないから詳しく現象を説明してくれ : [sage] 2018/07/08(日) 18:29:00.73:48/+VLR1 ごめん半角じゃなくて全角スペースで切れてるみたいだ "aaa bbb.txt" こうなるはずがファイル一つドロップするだけで↓になる "aaa" "bbb.txt" : [sage] 2018/07/08(日) 19:34:33.35:ayaOLpVg forじゃないけど、こんなんじゃあかんの? :loop echo %~nx1 shift if not "%~1"=="" goto :loop : [sage] 2018/07/08(日) 20:03:03.50:noo5aK3K aaa bbb.txtとかa&b.txtみたいなのは%1等で受け取っても切れるね cmdの独特なコマンドラインパース処理が悪いともいえるし 半角スペース含まれてないのをいいことにD&D時にダブルクォートで囲わないOS側が悪いともいえるし困ったもんだな D&Dで処理するのはスクリプト言語使った方がいいかもしれん : [sage] 2018/07/08(日) 20:56:02.67:O/180cHX いまだにスペース問題抱えてるとは思わないよな もう10数年以上前からあるのに : [sage] 2018/07/08(日) 20:57:49.35:3ARFRdhF こういうの直すと互換性の問題でも起きるの? : [sage] 2018/07/08(日) 21:45:56.33:PKG5RTYD >571 こうで良くないかなぁ?/d を使うパターン。 for /d %%f in (%*) do ( echo %%~nxf ) そういう仕様に依存している過去のコードの動作に影響が出るのさ。 そういうコードは今までずっと企業内で使われている。 作者不詳のまま… : [sage] 2018/07/08(日) 21:49:43.77:PKG5RTYD ごめん、/d でも全角はアウトですた。 わけわからーん : [sage] 2018/07/08(日) 22:24:06.32:vrRjc8/F 昔、どこかのサイトで似たようなの見たけど %* を加工して解決しようとしてたが 数十行もあったようなw でも、俺が動作確認したら全然ダメだったし : [sage] 2018/07/08(日) 22:50:01.23:E+arm29j Windows 10 Home 1803 だけど全角空白も & もで問題なく処理できるよ : [sage] 2018/07/08(日) 22:57:56.95:vrRjc8/F 引数はフルパスだからな フォルダ名に半角スペースあるだろ : [sage] 2018/07/08(日) 23:16:12.53:dDjh6KF7 for の代わりに forfiles を使うと ""付きファイル名なのでうまくいく(たぶん) : [sage] 2018/07/08(日) 23:36:45.60:U6QPmMsx 全角スペースを文字として扱うか、半角スペースと同じように扱うかについて、 cmdは中途半端な扱いをしているようだしな。 フルパスに半角スペースがあると、全角スペースは文字として扱われるが、 フルパスに半角スペースがないと、全角スペースは半角スペースと同じ扱いになる。 しかもクォートしただけでは対処できないという困ったことに。 対処方法としては、フルパスの何処かに半角スペースを入れてクォートするだけ。 : [sage] 2018/07/08(日) 23:38:41.06:PKG5RTYD Win10 Pro 1803 64bit。 全角がアウト。 : [sage] 2018/07/08(日) 23:39:37.04:O/180cHX 昔からある不具合なんだから互換性も糞もない : [sage] 2018/07/08(日) 23:53:08.78:E+arm29j , ああなるほど すまん、ボケてたわ : [sage] 2018/07/09(月) 00:39:27.28:CF6LQR6B 全角空白の場合、ダブルクォーテーションで括られないのに、引数の区切り記号として取り扱われるってことか 間に、ダブルクォーテーションで括る操作をかませばいいか @if (0)==(0) echo off set arg=%* for /f "delims=" %%f in ('cscript //nologo /e:jscript "%~f0" %%arg%%') do echo %%f pause goto :eof @end for(var i=0,arg=WScript.arguments;i<arg.length;i++) WScript.Echo('"'+arg(i)+'"'); : [sage] 2018/07/09(月) 00:46:29.65:CF6LQR6B いや引数を各行に分解したから、括る必要もないな 最終行訂正 for(var i=0,arg=WScript.arguments;i<arg.length;i++) WScript.Echo(arg(i)); : [sage] 2018/07/09(月) 01:05:14.62:CF6LQR6B やっぱり括ってたほうがトラブルが少ないかも あと、半角空白が無いと括られないから、 a^b.txt とかはBATに入ってくる時点でもうダメだな %CMDCMDLINE% とか見てやれば可能だけど : [sage] 2018/07/09(月) 01:10:51.13:CF6LQR6B 結論としては、色々苦労して対応するより、 必ず半角空白をいれたフォルダにファイルを置くようにしたほうがいいね : [sage] 2018/07/09(月) 01:30:40.02:M0pRa/sz これらは""で括れば問題ない a=b.txt a;b.txt a^b.txt : [sage] 2018/07/09(月) 01:50:11.67:M0pRa/sz これは""で括ってもechoで化ける %cd%.txt : [sage] 2018/07/09(月) 21:52:59.96:JZ4qv3b5 俺はバッチスクリプトを生成するスクリプトをPerlだのPhysonで書くときは ダブルクォートで囲わずに全部キャレットでエスケープしてる。 今回の件は %* が勝手に全角空白で区切る仕様が駄目なんだけど… スクリプトから呼ぶ場合には何とかなっても、D&Dの時点で引数を加工できないってとこに問題がある。 shift しても無駄、っていうところ…。 解決策…、ある??俺は思いつかない…。 : [] 2018/07/09(月) 22:17:13.68:FlHlLFRn nbspでもなるな : [sage] 2018/07/09(月) 22:21:09.09:CF6LQR6B a&b.txtとかはcmd. exeに入る前に対処しないとね BAT以外の別スクリプトにD&Dして、そっちで引数を加工後にBATを呼んでもらうようにするぐらい : [sage] 2018/07/09(月) 22:25:10.86:CF6LQR6B ところでcmdスレなのに、なんでcmd. exeがNGワードなんだよ : [sage] 2018/07/09(月) 22:54:28.83:XFrzb5uR 確認してないけどcloudflareがコマンドインジェクション対策で弾いてんるんじゃないの ls -lとかもできなかったはずだし : [sage] 2018/07/10(火) 07:31:20.48:LbQkaO6y Ruby, PowerShell を使った方が良い バグるのは低品質だし、時間の無駄 : [sage] 2018/07/11(水) 20:28:10.61:mCCOIiej Ruby は実行環境のインスコがいる。 PoerShell はD&Dできない。 それ以前に、特殊な世界ではいまだに XP が現役だったりする。 Win7SP1以降のアップデートパッチを1個でも当てたら動作保証しませんなどというフザけた業務システムも実在する。 レジストリを汚すインスコは駄目だけど、ネイティブコンパイルしたコマンドをコピーして使う分にはおk、てな環境もある。 とりあえず、スクリプトを使用した D&D のファイルパス問題回避の最大公約数的解決は VBScript しかないんじゃないかな。 (さすがに Win9X な環境はもうないだろう…と思うけど) 使える環境なら検討した方がいいけど、安易な「○○使えばいい」という回答は頭が悪すぎる。 : [sage] 2018/07/11(水) 21:11:59.69:/R7esjNT なら環境毎に勝手に使えばいいんだから最大公約数なんて決める必要ないのでは : [sage] 2018/07/12(木) 01:03:34.20:MfQE+JgU NTも現役だよボケ : [sage] 2018/07/12(木) 11:56:39.69:72SuVZq5 それ以前に、DOS自体が、現e(ry : [sage] 2018/07/12(木) 14:54:19.05:+klw6xr1 無理矢理にバッチで書いてみた @echo off set "a=%cmdcmdline:"=""%" setlocal enabledelayedexpansion set /a b=0,n=0 set "s=" & set "d="" :x1 if not "!a:~%b%,1!"=="/" set /a b+=1 & goto x1 :x2 if "!a:~%b%,1!"=="!d!" set /a n+=1 if !n! equ 6 set /a b+=2 & goto x3 set /a b+=1 & goto x2 :x3 set "a=!a:~%b%,-2! " & set /a b=0 :x4 if not defined a goto x8 if "!a:~%b%,1!"=="!d!" set /a n=0 & goto x6 下に続く : [sage] 2018/07/12(木) 14:54:43.36:+klw6xr1 :x5 if not "!a:~%b%,1!"==" " set /a b+=1 & goto x5 set "s=!s!!d!!d!!a:~0,%b%!!d!!d! " & set /a b+=1 set "a=!a:~%b%!" & set /a b=0 & goto x4 :x6 if "!a:~%b%,1!"=="!d!" set /a n+=1 if !n! equ 4 set /a b+=1 & goto x7 set /a b+=1 & goto x6 :x7 set "s=!s!!a:~0,%b%! " & set /a b+=1 set "a=!a:~%b%!" & set /a b=0 & goto x4 :x8 set "s=!s:""="!" endlocal & set s=%s% for %%f in (%s%) do echo "%%~nxf" pause : [sage] 2018/07/12(木) 20:30:02.59:Gmf0IrMF ファイル名に全角スペースが含まれていない場合に""が一つ余計に出力されます : [sage] 2018/07/12(木) 20:30:48.00:Gmf0IrMF 訂正 全角スペースが含まれず半角スペースが含まれている場合 : [sage] 2018/07/12(木) 20:48:15.33:+klw6xr1 レスありがとう でもこちらでは再現できない 出来たら具体例を : [sage] 2018/07/12(木) 21:08:43.02:+klw6xr1 もしかしたらset文の行末にスペースがありませんかね? 行末のスペースが有ったら全て削除してみて下さい : [sage] 2018/07/12(木) 21:25:30.03:Gmf0IrMF もうちょい検証してこんなファイル名で発生するのを確認しました "aーa b.txt" "" 専ブラからコピーしたんでスペースとかはありませんでした 長めのスクリプト貼るときはpastebinとか使ったほうがいいかもしれません : [sage] 2018/07/12(木) 21:31:57.91:+klw6xr1 バッチファイル名にスペースがあると不味いようです : [sage] 2018/07/12(木) 21:37:35.42:+klw6xr1 違うな... ファイル名なんですか? : [sage] 2018/07/12(木) 21:39:01.64:Gmf0IrMF バッチファイル自体はtest6.batなのでスペースはありません このファイル名だと処理自体が終わらなくなりました ーa ーb ーc.txt : [sage] 2018/07/12(木) 21:39:34.44:Gmf0IrMF 最初に検証したファイル名は aーa b.txt です : [sage] 2018/07/12(木) 21:52:50.96:+klw6xr1 バッチファイル名 "test.bat" がOK, "test - コピー.bat" が NG "ー" がダメ文字っぽい なんだこりゃ : [sage] 2018/07/12(木) 22:45:26.82:+klw6xr1 とりあえず最初の3行を @echo off setlocal enabledelayedexpansion set "a=!cmdcmdline:"=""!" set "a=!a:ー=/1!" 最後の5行を :x8 set "s=!s:/1=ー!" set "s=!s:""="!" endlocal & set s=%s% for %%f in (%s%) do echo "%%~nxf" pause ダメ文字の詳細は不明 まだ有ったら、/2 /3 ... 置換 : [sage] 2018/07/12(木) 23:31:47.70:+klw6xr1 これも追加 5行目 set "a=!a:―=/2!" :x8の次の行に set "s=!s:/2=―!" : [sage] 2018/07/13(金) 00:39:35.42:7GlypEZW 漢字コードが関係しているのかも shift-jis chcp 932 utf-8 chcp 65001 で試してみたら : [sage] 2018/07/13(金) 06:59:58.30:laaSwUH8 if文のバグ? @echo off setlocal enabledelayedexpansion set a=ーー set b=―― set c=xx set d="" if "!a!"=="!d!" echo NG1 if "!b!"=="!d!" echo NG2 if "!c!"=="!d!" echo NG3 pause 結果は NG1 NG2 : [sage] 2018/07/13(金) 19:59:02.76:laaSwUH8 if "!a!"=="!b!" echo NG4 結果は NG4 まあ、見た目は似ているが... : [sage] 2018/07/13(金) 20:29:29.46:laaSwUH8 ちなみに をメモ帳にコピペして 変数 a の文字列で検索したら、なぜか変数 b にも一致したりする 逆もまた然り : [sage] 2018/07/14(土) 06:43:27.53:8rUsawXH if文の不具合は引用符絡みのようなので それを削除して書き直しました @echo off call :set_arg arg if not defined arg goto :eof for %%f in (%arg%) do echo "%%~nxf" pause & goto :eof :set_arg setlocal enabledelayedexpansion set a=!cmdcmdline! set /a b=0,n=0 set "s=" & set "c=/" & set "e= " & set "d="" :x1 if not !a:~%b%^,1!==!c! set /a b+=1 & goto x1 :x2 if !a:~%b%^,1!==!d! set /a n+=1 if !n! equ 3 set /a b+=2 & goto x3 set /a b+=1 & goto x2 下に続く : [sage] 2018/07/14(土) 06:43:59.73:8rUsawXH :x3 set a=!a:~%b%,-1!& set /a b=0 :x4 if not defined a goto x8 if !a:~%b%^,1!==!d! set /a n=0 & goto x6 :x5 if not !a:~%b%^,1!==!e! set /a b+=1 & goto x5 set s=!s!!d!!a:~0,%b%!!d!!e!& set /a b+=1 set a=!a:~%b%!& set /a b=0 & goto x4 :x6 if !a:~%b%^,1!==!d! set /a n+=1 if !n! equ 2 set /a b+=1 & goto x7 set /a b+=1 & goto x6 :x7 set s=!s!!a:~0,%b%!!e!& set /a b+=1 set a=!a:~%b%!& set /a b=0 & goto x4 :x8 if defined s set s=!s:~0,-1! endlocal & set %1=%s% : [sage] 2018/07/14(土) 09:47:55.50:17hM4zE5 パスに全角半角含むかどうかに関わらず a.pngがNG a - コピー.pngがOK あ.pngがNG : [sage] 2018/07/14(土) 18:45:20.78:8rUsawXH すみません。:x3 の下の行を下記に訂正します :x3 set a=!a:~%b%,-1!!e!& set /a b=0 : [sage] 2018/07/14(土) 22:32:02.01:utl6Xayz IT土方してるけどいまだにVB6のメンテ案件がたくさん来る (・_・;) 古いシステムを使い続ける企業って多いんだなあ : [sage] 2018/07/14(土) 23:07:08.10:LxoRiW+E 日本は異常なほどソフト弱すぎだわな : [sage] 2018/07/15(日) 00:45:51.50:LqRrN2Y+ リダイレクト使ってバッチ内に記述したテキストをファイルに出力すると、行数が増えるにつれて どんどん処理が遅くなるんですが(多分ファイルのオープンとクローズの処理が重たい んだとは思うけど)、何十行もあるテキストでも一括で書き込んで早くする方法とかないですか? ただ不思議なのは、ソースとなるテキストを別のテキストファイルからforで読み込みして 各行を逐次出力ファイルにリダイレクトで書き出した場合はそんなに遅くないんですよねぇ。 : [sage] 2018/07/15(日) 07:47:51.60:3kOM020K 俺はそう思ったことはないなぁ…具体的なコードを見せて。 一括での書き込みは、処理をカッコで括るとできる。 ( echo start : : echo end ) > test.txt : [sage] 2018/07/15(日) 10:00:49.84:LqRrN2Y+ コードといっても何も特別なことはしてないんだけど、何十行というのは嘘で 当該箇所確認してみたら実際には何百行もありました。 ----- sample1.bat echo [%time%] 開始 type nul > "D:\tmp\out-file.txt" echo hoge>> "D:\tmp\out-file.txt" echo hoge>> "D:\tmp\out-file.txt" ~延々と600行近い繰り返し~ echo hoge>> "D:\tmp\out-file.txt" echo hoge>> "D:\tmp\out-file.txt" echo [%time%] 終了 exit /b ----- これで大体3~4秒くらい。実際のコードは文字列も長いし、 途中条件式が入ってたりするのでもうあと1~2秒ほど長い。 前の投稿で「forで回してリダイレクトした方が何故か早い」と書き込んだけど、勘違い。 改めて確認したらほとんど変わらなかった。 : [sage] 2018/07/15(日) 10:01:23.98:LqRrN2Y+ ----- sample2.bat echo [%time%] 開始 type nul > "D:\tmp\out-file.txt" for /f "usebackq delims=" %%L in (`findstr /n .* "D:\tmp\hoge-source.txt"`) do ( set str_temp=%%L call :redirect-loop ) echo [%time%] 終了 exit /b :redirect-loop echo %str_temp%>> "D:\tmp\out-file.txt" exit /b ----- 教えてもらった全体を()で囲ってまとめてリダイレクトしたら一瞬で処理完了しました。ありがとうございます。 実際のコードは条件式の他に変数展開した文字列の中に()が含まれていたりするので、要所要所で使い分けが必要そうですが。 : [sage] 2018/07/15(日) 11:22:20.37:SEkGxxwq へー(エ・∀・`) : [sage] 2018/07/15(日) 12:40:32.94:3kOM020K あー、600行もあったらファイルのオープン・クローズ処理の影響が大きくなるねぇ。 カッコで括ると「括った内容、1行で延々書かれたものとして処理」してくれる。多分こういう用途のためにあるんだと思う。 なのでカッコ内の特殊文字エスケープは通常と変わらなかったはず…。(確証はないけど) 俺はヒアドキュメントっぽいことがしたい時、いちいちリダイレクトを入れるのが面倒&読みづらいこともあってこう書いてるわ。 : [sage] 2018/07/18(水) 10:40:36.37:w8OpeSfX 別のバッチファイルにするのは駄目なん? call b.bat >file なら()の処理とか不要では。 : [sage] 2018/07/18(水) 21:57:41.23:6GF3Pq4/ 別のバッチファイルにする必要も無いんじゃね? @echo off call :abc > d.txt goto :eof :abc echo xxx echo yyy echo zzz : [sage] 2018/07/18(水) 22:23:21.60:pnNaFbbR それもいいんじゃない? : [sage] 2018/07/18(水) 22:31:48.09:pnNaFbbR ちょっと聞きたいんだが… for /f "tokens=1* delims=:" %%A in ('findstr /n "^" filename.txt') do echo.%%B これ、バッチが標準入力から受け取ったものを処理する雛形らしいんだけど… findstr /n "^" これアリか?正規表現として成立してない!?何だこれ?? findstr /n ".*" ならアリだしこう書くべし。正規表現として何でもマッチする。 なんだけど何で findstr /n "^" が通るのか分からんわ。 : [sage] 2018/07/18(水) 22:46:17.26:6GF3Pq4/ それ、確か : で始まる行が不味いんじゃね? : [sage] 2018/07/18(水) 23:08:39.37:apOKL4Dj findstrはあくまで検索パターンにマッチする行全体を返す。 行頭文字があればマッチと判断するんだな、たぶん"$"でも通るんじゃね?w : [sage] 2018/07/18(水) 23:17:52.69:pnNaFbbR ttp://jump.5ch.net/?https://blogs.yahoo.co.jp/kerupani/15344574.html が上手いことやってる。感心した。万能ではないらしいが検証中。 tee が作れるかもしれん。 マジだった。findstrはアホの子だった。 : [sage] 2018/07/18(水) 23:20:00.00:pnNaFbbR あー、もっとも、find /v "" が空文字列にマッチする時点で駄目ではある。 : [sage] 2018/07/18(水) 23:47:59.03:Ppp31GO+ このスレは勉強になる : [sage] 2018/07/19(木) 00:47:19.86:oVpGn6oR 正規表現としてじゃなくて cmd のエスケープかと。 echo;abc | findstr /n "" FINDSTR: 検索文字列がありません。 echo;abc | findstr /n "^" 1:abc : [sage] 2018/07/19(木) 06:16:34.58:hT+uAClu ^ の左側に " があるので ^ はただの文字 : [sage] 2018/07/19(木) 08:15:18.80:31+wDFSY プロセスが特定の文字列を出力したら処理を終了させたくて下記のようなの書いてみたけど思うように動かないです。 process.exe | find "hoge"&&TASKkill /F /im process.exe &&で指定したコマンドは元のプロセスが終了しないと実行されないのでしょうか? : [sage] 2018/07/19(木) 08:26:36.29:HqFtoS+0 多分、process.exeが終了しなくても、標準入出力をクローズすればパイプは渡ってくるんじゃないかな? : [sage] 2018/07/19(木) 22:23:54.31:I1yUatr2 リファレンス読めよ。 &&を何かに変えれば多分動くぜ。 : [sage] 2018/07/20(金) 01:23:20.22:FDkJiEQ5 コマンドプロンプトって、論理和使えないんだっけな : [sage] 2018/07/20(金) 02:06:59.97:2iB3qPvx & コマンドの連結 && 前のコマンドの実行結果が正常(ERRORCODE=0の場合)に後ろのコマンドを実行する || 前のコマンドの実行結果が失敗(ERRORCODE>0の場合)に後ろのコマンドを実行する : [sage] 2018/07/20(金) 02:28:52.11:2iB3qPvx ERRORLEVELだったよ あと、環境変数は実行前に展開されるため、前のコマンドで設定した値を後ろのコマンドで参照すると思わぬ結果になる for文での注意と同様で、遅延環境変数を使うとかすれば大丈夫だが また行を分ける場合に%errorlevel%を使うなら参照だけにすること (設定すると単なる環境変数として扱われる) あと、そもそも前のコマンドが終了してないのにパイプにデータが渡ってくるのかも要確認 : [sage] 2018/07/20(金) 04:26:00.68:ukKUYn/2 レスありがとうございます 標準入出力をクローズというのがちょっと分からないんですがどのようにすればいいのでしょうか? : [sage] 2018/07/20(金) 06:55:00.15:gIwkChrm process.exe に標準入出力をクローズさせるんだよ : [sage] 2018/07/22(日) 19:18:33.01:WPYgWuMH そんなことするぐらいならvbsのExec使えばいいと思うの : [sage] 2018/07/22(日) 19:49:03.97:Gp0M410Q の言ってることは戯言だから気にするな。 process.exe が終了したら勝手にクローズする。 : [sage] 2018/07/22(日) 20:27:20.33:jf6K150S 終了してから TASKkill しても見つからんエラーが出るだけで無意味 : [sage] 2018/07/22(日) 20:27:43.37:oUJ4s6M9 リダイレクトしてテキストファイルに出力しながらstartで立ち上げた別のbatにfindして貰う事で解決しました。 : [sage] 2018/07/22(日) 23:35:54.49:FoHjHQaV process.exeってのが自作の場合、そうしろってことだろ : [] 2018/07/23(月) 17:41:55.79:1W7qAEKf Linuxでコマンド実行した結果とWindowsでコマンド実行した結果を 一つのファイルに書き出したいんだけど、改行コードが違っている バッチファイルでCR LFではなくLFで出力したいなと思って このコードを見つけたんだが何やってるのかさっぱりわからない <NUL set /p=message が set /p=message <NUL と同じ意味で 「メッセージを表示してユーザーの入力内容を変数に入れるコマンド」の 代入先変数の省略 + 入力内容省略 = 改行なしecho ということはわかったんだけど、^%LF%%LF% がなんなのか なんでこれでうまく動くのかわからん ttp://jump.5ch.net/?https://stackoverflow.com/questions/9876370/echo-line-to-a-file-on-windows-with-a-unix-linebreak SET LF=^ REM important to have two blank lines after the SET command <NUL set /p=test line^%LF%%LF%> t.txt : [sage] 2018/07/24(火) 01:43:43.96:tpeQiESg 違うこと調べていて、たまたま答えにぶつかったぜw ttp://jump.5ch.net/?http://ken sou1900.blog96.f c2.com/blog-en try-7.html : [sage] 2018/07/24(火) 01:44:16.69:tpeQiESg 違うこと調べていて、たまたま答えにぶつかったぜw ttp://jump.5ch.net/?http://kensou1900.blog96.f c2.com/blog-en try-7.html > キャレット(^)直後の文字がLFの場合は特殊な動作になる。 > キャレ ット(^)の後ろにLFがある場合、そのLFは削除され、 > 次の文字がエスケープされる。不思議なことにキャレ ット(^)の後ろにLFが2つ続く場合は、 > 前のLFは消えるが、後ろのLFは通常の文字のように扱われる。 > この動作を使ってLFをコマンドに渡したり、変数名や変数の値に使用することができる。 > > LFがエスケープされた場合、バッチファイルの続 きを取り込まないといけなく なる場合がある。その場合、1.から3.が再度行われるようだ。 set /p=test line^[LF][LF] これはこの部分だな > 不思議なことにキャレット(^)の後ろにLFが2つ続く場合は、 > 前のLFは消えるが、後ろのLFは通常の文字のように扱われる。 単なる不思議な動作か。なるほどな! SET LF=^ REM important to have two blank lines after the SET command こっちも未だよくわからいが、 まあこれも単なる不思議な動作だろう なっとくした : [sage] 2018/07/24(火) 01:45:28.43:tpeQiESg なんでこれが書き込めないんだよ fc2.com : [sage] 2018/07/24(火) 01:46:02.21:tpeQiESg ↑これは書き込めるのか ↓これはどうだ? a.fc2.com : [sage] 2018/07/24(火) 01:46:25.75:tpeQiESg kensou1900.blg96.fc2.com : [sage] 2018/07/24(火) 01:46:48.81:tpeQiESg blog96.fc2.com : [sage] 2018/07/24(火) 01:47:44.81:tpeQiESg aaaablog96.fc2.com とかいう文字が書き込めないみたいだな : [sage] 2018/07/24(火) 01:48:34.51:tpeQiESg aaaablog96.fc2.com/aaa.html : [sage] 2018/07/24(火) 01:48:55.71:tpeQiESg よくわからん aaaablog96.fc2.com/blog.html : [sage] 2018/07/24(火) 01:49:23.86:tpeQiESg よくわからん aaaa.blog.fc2.com/blog.html : [sage] 2018/07/24(火) 01:50:02.74:tpeQiESg 面倒くさいから今度からURLは全部短縮URLを使おう : [sage] 2018/07/24(火) 02:13:31.40:JJ11wMVF 改行は[LF]じゃなくて[CR][LF]だと思うんだが、どうなんだろう? : [sage] 2018/07/24(火) 04:54:02.60:tpeQiESg Windowsの改行コードは[CR][LF]だよ だけど、処理の一部として、Linux側にコマンドを投げ その出力をログファイルに書き込むんだよ Linuxの改行コードは[LF] その同じログファイルにWindowsからも書き込むんだよ こっちは当然[CR][LF] まざるとうざくなるので、どちらかに統一したかったんだよ : [sage] 2018/07/24(火) 06:25:50.86:c84rNbv+ どうでもいいが投稿練習は他でやれ : [sage] 2018/07/24(火) 12:14:08.82:HxFyIf/c Winでもコンソールは何故かLFだよ 混同すんなよ : [sage] 2018/07/24(火) 14:01:42.76:tpeQiESg コンソールがLFって意味わからん。 改行コードをどう出力するかはコマンド次第だろ Windowsはデフォルトの改行コードがCR LFだってだけ それに従わないプログラムもあるよ (例 nkf は出力改行コードを変更できる) : [sage] 2018/07/24(火) 18:49:48.84:bSDo/9Xp PSでもcmdでもいいんだけど一行で文字列+連番を出力できない? echo aaa + (1..10) とかやると別々に出ちゃう : [sage] 2018/07/24(火) 18:57:15.74:g/ZYUHlh for /L %%i in (1,1,10) do echo aaa %%i : [sage] 2018/07/24(火) 19:19:46.86:g/ZYUHlh 連番の意味を履き違えていたかもしれない : [sage] 2018/07/24(火) 23:16:42.86:MWPxR8WZ いまいちよくわからんけど abc1 abc2 abc3 abc4 … って言うのが欲しいの?PS なら [String]::Join(' ', (1..10 | %{ "abc$_" } )) でいける : [sage] 2018/07/24(火) 23:54:21.38:bSDo/9Xp ありがとう、でもエラーでうまく動かなかった 完璧です 助かりました : [sage] 2018/07/26(木) 13:37:52.34:wiek7dkQ CRTがテキストモードの時にはCRを足してくれてるんだよ? : [sage] 2018/07/26(木) 18:09:38.18:B1r9j6T7 改行コードはコマンドに依存する dir /? > d.txt sort /? > s.txt : [] 2018/07/29(日) 20:28:04.05:AzlFD5Cm 質問です ファイルをbatファイルにドラッグアンドドロップしてファイル名等を得たいのですが 2番目のドライブ名+パス名(ファイル名以外)が表示されません (%~dpと表示される) どう記述すればいいのでしょうか もう2時間悩んでおります echo off for %%f in (%*) do ( echo %%f echo %%~dp echo %%~nf pause ) : [sage] 2018/07/29(日) 20:35:34.14:u49zNrL5 %%~dpf だろ : [sage] 2018/07/29(日) 20:36:23.74:2kcGqgTd doの後のカッコ使うな : [] 2018/07/29(日) 23:23:01.82:AzlFD5Cm ありがとうございます それも試したと思っていたけどそうでなかったようですね 多くのサンプルではサブルーチンをつかっているようですが カッコを使うとバグの原因になりやすいとかそんな理由なのでしょうか : [sage] 2018/07/31(火) 00:35:30.31:eJ/lX+1f %%~dp → %%~df%%~pf callを使い %1などを使えるようにするため 昔は%~n1 など数字でないと動作無保証だった : [sage] 2018/07/31(火) 04:53:16.45:vnodIDx/ Win10のコマンドプロンプト画面では改行と折り返しを区別してコピーできるようになったね。これすごく便利。 他に改善点とかあるのかな? : [sage] 2018/07/31(火) 05:31:48.07:R/dSWHzC コピペでCtrl+C,Ctrl+Vも使える Alt+Enterで最大化 ウィンドウスナップ など。詳しくは ttp://jump.5ch.net/?https://japan.zdnet.com/article/35069776/ : [sage] 2018/08/03(金) 10:35:50.90:w2m/pEoW windows板のスレに書いてしまったので詳細はそちらを参照して頂きたいのですが ttps://mevius.5ch.net/test/read.cgi/win/1381119881/327 この件について詳細をご存知の方あるいは解説されているサイトをご存知の方は ご教示頂けないでしょうか? : [sage] 2018/08/03(金) 12:24:06.93:r+5aCgkd 再現しない。よくソース見直してみて おそらく単に遅延変数展開だけの問題に見える。 : [sage] 2018/08/04(土) 01:49:02.03:z4XK4aXP プログラムを問題の箇所だけ抜き出して実行しても同じ結果になります。 xxxを未定義状態にしてから%xxx%を引数にして実行するとやはり 「echo %aaa%|more」の結果がyyyと表示されます 当方の環境はWindows7 SP1です これはこう動作するように作られた仕様なのかそれともあてにならない不思議動作なのか cmdのバグなのか判断したいです : [sage] 2018/08/04(土) 03:29:11.21:XmDLxyoB ん?せやで?Windows 7はデフォルトの設定が違うんやで しらんかったんか?cmd /?とかしてみな。 : [sage] 2018/08/04(土) 05:41:55.21:z4XK4aXP cmd /? にも setlocal /? にも echo /? にも echoとパイプ併用時の環境変数の二重展開について記述は無いようです : [sage] 2018/08/04(土) 07:14:19.75:ZE1/UEds ありまぁ~す : [sage] 2018/08/04(土) 07:43:36.85:z4XK4aXP 別のものを見ているのかもしれません。 そちらには何と書いてありますか? : [sage] 2018/08/04(土) 07:51:40.55:HzKYXCJW パイプってCall文でサブルーチン処理してるような物だし、call文と同じ展開をすると思っとけばいいんじゃね? : [sage] 2018/08/04(土) 09:07:28.54:z4XK4aXP なるほど。 では逆にあえて二重展開したい場合はcallを使ったほうが無難でしょうか? : [sage] 2018/08/04(土) 11:22:09.92:HzKYXCJW call文で変数内変数が1ネスト展開されるのはパイプよりは有名だと思う : [sage] 2018/08/04(土) 11:35:44.15:1BI89n66 一番知られて無いのが、for /f文の('コマンド')が同じく二重展開されるってのかな : [sage] 2018/08/04(土) 11:40:02.48:1BI89n66 いや本当は、コマンドの中で^を付けてエスケープしないといけない場合があることは 結構知られているんだけど、それが二重展開のせいだってことが認識されてないわけで : [sage] 2018/08/04(土) 12:17:58.67:hhRJxbHb : [sage] 2018/08/05(日) 05:37:23.17:DoWKU022 理解できました みなさんありがとうございました : [sage] 2018/08/06(月) 20:49:35.73:9+kXWEFM echo は結構罠 if "%errlorleverl%" ... も罠。 はやくバッチから救われたい… : [sage] 2018/08/11(土) 19:21:13.27:vbsvSkjm 何が罠なのかわからん : [sage] 2018/08/11(土) 20:56:08.62:WNr/dTgn つづりを覚えられない奴には罠なんだろ w : [sage] 2018/08/11(土) 21:47:36.56:HlmNsX8I こういうことじゃないかな? set ERRORLEVEL=0 hogecommand if %ERRORLEVEL% gtr 0 goto :ERROR これが絶対真にならず、ジャンプしないとか : [sage] 2018/08/12(日) 03:12:06.01:lJZ67VC6 エラーは1以上とはかぎらないんだよな、コマンドによっては。 : [sage] 2018/08/12(日) 09:09:39.33:pT5cyKVs echo hoge > test.txt て書くと「hoge」の後の半角空白までがtest.txtに出力されるんだよ。 代入しなくても、errorlevel を環境変数として判定に使うと正常に動かない場合がある。 具体的には echo n | comp A.exe B.exe >NUL 2>&1 if not "%ERRORLEVEL%"="0" ( : このとき、何故か%ERRORLEVEL% は常に「0」。バイナリ不一致でも「0」。 echo n | comp A.exe B.exe >NUL 2>&1 if not errorlevel 1 ( : だと正常に動く。何故だか分からない。 : [sage] 2018/08/12(日) 09:13:22.78:pT5cyKVs にちょっと間違い。 〇 if "%ERRORLEVEL%"="0" ( ラ if not "%ERRORLEVEL%"="0" ( : [sage] 2018/08/12(日) 09:20:16.40:yoDY/qSn if の比較は = じゃなくて == だろ : [sage] 2018/08/12(日) 09:40:11.52:pT5cyKVs 悪い。typo。 〇 if "%ERRORLEVEL%"=="0" ( : [sage] 2018/08/12(日) 11:52:31.87:eNrGPpfD 何故か以前にいろいろ間違いすぎなんだよ ゼロから書き直せ : [sage] 2018/08/12(日) 14:40:43.26:IZr1Emsm > ゼロから書き直せ こんな感じっすかー? 0" ([HOME]if "%ERRORLEVEL%"==" : [sage] 2018/08/12(日) 16:49:52.15:dh6WaJfS >>706 ERRORLEVELは代入すると返却値として使えなくなるんじゃ なかったっけ? だからやるならば set ERRORLEVEL= だけにしないとだめなのでは ただ、これをやってバッチ内でERRORLEVEL環境変数の 初期化みたいなことしてもうまく動かないこともあったような 気がするけど何か勘違いしてるんだろうな : [sage] 2018/08/12(日) 18:02:08.07:aLWFoJnR パイプの動作が原因だろう パイプの右側は子タスクでの実行となる(おそらくは) メインタスクに環境を引き継がないんだと思う echo "a"|for /f %%i in ('find "a"') do set x=OK echo.%x% これで%x%には値が入らない echo "a"|find "a"&set x=OK なら%x%にはOKが入るが echo "a"|(find "a"&set x=OK) では%x%にはOKが入らない : [sage] 2018/08/12(日) 18:09:31.24:aLWFoJnR 下2つ&は&&の間違いだが、別に&だろうが&&だろうが(この場合の)結果は変わらない : [sage] 2018/08/12(日) 18:16:28.72:lJZ67VC6 パイプはcallと一緒だなやはり : [sage] 2018/08/12(日) 18:36:12.51:lJZ67VC6 setコマンドの長いヘルプの下の方に 「ユーザーがこれらの名前の変数を明示的に定義する場合、 その定義は下記の動的な定義を無効にします。」 と書かれてる。errorlevelをsetするのは回避した方がいいだろう : [sage] 2018/08/12(日) 18:40:34.53:aLWFoJnR ついでに言っとくと パイプはデータの受け手が子タスクになったけど for /fの'コマンド'は送り手が子タスクになる 従って、'コマンド'の中で環境変数に値を入れても、メインタスクには引き継がれない : [sage] 2018/08/12(日) 21:23:34.47:pT5cyKVs 難癖付けてばかりで話題提供もできない人はゼロから人生をやり直した方が(ry : [sage] 2018/08/12(日) 21:38:30.71:pT5cyKVs んー、俺はもうそこまで調べる気もなくてね…ほぼ諦めてる。 子タスクとかどこの文献見ればあるんだろう? あってもなくても、んなテクニック、引継ぎできる代物でもあるまい…。 例えば、 type data.txt | cscript //nologo hoge.vbs if not errorlevel 1 ( : これも実は…駄目なのだ!! VBScript側で Call WScript.Quit(1) で抜けられれば引っかかるが… 想定外の変なデータを食わされてランタイムエラーで落ちた場合には引っかからない。 cscript はスクリプトエンジンだから別物扱いしとこ…てなところで。 hoge.vbs が正常終了する直前に success.txt を空で作るようにしといて。 del success.txt type data.txt | cscript //nologo hoge.vbs if exist success.txt ( : ) del success.txt こんな感じにするしかなかったし、これならせめて引継ぎができると思う。 : [sage] 2018/08/12(日) 21:45:20.77:pT5cyKVs あ、ごめん。 if not errorlevel 1 ( 正常終了処理 ) else ( 異常終了処理 ) て書くべきだった : [sage] 2018/08/13(月) 00:05:28.17:MtAcIApx 勉強になる話題だけど、バッチファイルは言語仕様の規模に比して闇が深すぎると思う : [sage] 2018/08/13(月) 00:46:15.48:bTGAGeMt そだね だんだんとwslの利用者が増えていくのだろうな : [sage] 2018/08/13(月) 03:10:07.37:EnLsbSTB 子タスクと言ったのは俺の推測(想像)でしかないから データの受け渡しを行うのには、送り手と受け手の両者が存在しないと変だろうってことからね あと、タスクというのも、適当な概念だから 親の環境を引き継いで生成された子環境のことね 実体はスレッドだろうと想像するけど : [sage] 2018/08/13(月) 10:15:08.27:aFOAPcea 綴りといえばenabledelayedexpantionも罠レベルだよ・・・誰だこれ考えたの('A`) : [sage] 2018/08/13(月) 10:38:49.38:WsZfoIsu なるほど引っかかってる : [sage] 2018/08/15(水) 02:41:45.12:xax+OHuY 元の英語がわかれば enable delayed expansion を繋げただけなんだよ : [sage] 2018/08/15(水) 13:28:33.22:j7d0pce0 質問させてください。 Linuxでいうところの、/dev/nullで標準入力待ちを終了させるのはどうすればいいのでしょうか。 具体的には、Windows向けのopensslコマンドを実行しています。 openssl s_client -connect ~とやると標準出力が一通り出たところで入力待ちになる仕様で、 コマンドプロンプト上だとCtrl+Cで止めてあげる必要があります。 Linuxだと、末尾に< /dev/nullで終わらせられるのですが、Windowsバッチで同じように終了させる方法は無いでしょうか。 : [sage] 2018/08/15(水) 13:50:50.34:o8lgioa7 < nul じゃダメなの? : [sage] 2018/08/15(水) 13:54:24.10:j7d0pce0 書いてなくてすみません。それだとダメでした。 : [sage] 2018/08/15(水) 14:06:33.66:o8lgioa7 できるはずなんだけど… ttp://jump.5ch.net/?https://qiita.com/nightyknite/items/c4765697602eab1fb205 : [sage] 2018/08/15(水) 14:36:26.98:j7d0pce0 参考サイトありがとうございます。 先ほど教えていただいたのと同じ< nulですよね。 サンプルコマンドの通り打ってみても入力待ちで止まります…。 念のためOpenSSLを入れ直しても変わりませんでした。 サンプルでパイプで渡してる直前まで( < nul 2> nul)で試すと、 実行結果がダーっと出て、入力待ちで止まるんですよね…。 : [sage] 2018/08/15(水) 15:17:17.37:j7d0pce0 下のサイトのやり方も参考にしつつやってみましたが、どれも結果は変わらずでした。 後出しですみませんが、当方の環境はWin10 Pro 1803、opensslは1.0.2m.1.0.2oでやってました。 ttp://jump.5ch.net/?https://stackoverflow.com/questions/25760596/how-to-terminate-openssl-s-client-after-connection 回答くださった方、ありがとうございました。 もしやってみて、何言ってんだ、できたぞ?という方いらっしゃいましたら教えていただければ幸いです。 : [sage] 2018/08/15(水) 15:19:22.69:xax+OHuY 制御文字を入力できるエディタ(サクラエディタ等)で バッチを開いて nulの代りに[0x03]か0x04の制御コード入れてみては? : [sage] 2018/08/15(水) 15:25:45.29:jNJ7KLOy 普段OpenSSLは使わないけどたまたまインストールしてあったOpenSSL 1.1.0hで出来たよ コマンドはこう openssl s_client -connect example.com:443 < nul 2> nul | openssl x509 -text | findstr Not : [sage] 2018/08/15(水) 15:59:22.79:j7d0pce0 試していただいてありがとうございます。 そのコマンドを実行したときなのですが、コンソールが返ってくるまで1分ほどかかりませんか? すぐ返りますか? < nulの有無に関わらず1分ほど待つので、単にタイムアウトか何かで終了しているのかなと思っております。 nulを入力として受け取っているなら、すぐに1個目のパイプより前のコマンドは終わるはずだと思いまして…。 : [sage] 2018/08/15(水) 16:01:57.88:jNJ7KLOy すぐ返ってくるよ : [sage] 2018/08/15(水) 16:09:56.08:j7d0pce0 ありがとうございます。 ということはさんと同じ書き方でちゃんとできて、 私の環境起因で何かがおかしいってことですね…。 他のパソコン出してきて試してみようと思います。 さんもありがとうございます。 まずはバッチ化する前にプロンプト上で試している段階で躓いてました。 : [sage] 2018/08/15(水) 16:14:15.33:xax+OHuY 1)コマンドプロンプトで下記のように入力し、hoge.txtを作る copy con hoge.txt[Enter] [Ctrl+d] [Ctrl+z] 2)バッチの方で <hoge.txt とすればコンソールでCtrl+Dを入力したのと同じ効果となるはず : [sage] 2018/08/15(水) 16:47:26.04:j7d0pce0 です。 あの後うまくいきました!アドバイスありがとうございました! Windows向けに提供されている最新のインストーラを色々試したのですが、 openssl 1.0.2pだとダメ、1.1.0iだと< nulが効きました。 32bit向け、64bit向けのインストーラのどれでも同じ結果でした。 私の試してたのが1.0.2系だけで、さんは1.1.0hで成功してるので、 1.0.2系だとダメなのかもしれません…。 < nulはきっと汎用的なものなので、そんなわけはないと思いたいのですが…。 長々とありがとうございました、大変助かりました。 : [sage] 2018/08/15(水) 21:05:55.42:cg3gjcxB 悪いけど、Windowsバッチに鉄板を求めるのも、追いかけるのも無駄。 歴史的経緯でそうなってしまっている。マトモな資料なんかありゃない。 NULの解釈がコマンドによって違ったって全く不思議じゃあない。 犬のクソをクソだと知りつつカリントウだと思いながら食わなければならないような、そんな代物。 好きで書いてる奴なんかほとんどいないと思う。 バッチで書いた方が良いと判断できる材料がなければVBscriptやPowerShellで書いた方が遥かにいい。 環境が許せば他の言語の導入を検討するのも大いにいい。 よく知られたコマンドをよく知られたイディオム下で使うのでもなければ、バッチでなんか書かない方がいい。 それでもクソみたいにハマることがあるんだから。 : [sage] 2018/08/15(水) 21:14:01.94:OWPSpuGG UNCパスを一向に解釈しないのがとにかく糞だと思う : [sage] 2018/08/15(水) 21:52:07.27:X+03HcfZ 移動はできないけど解釈はできるでしょ… : [sage] 2018/08/15(水) 21:52:48.84:X+03HcfZ xcopy のヘルプは酷い。 Vistaでは「推奨されない。使わないで。robocopyを使って」みたいな文言が出てきた。理由は記述なし。 この文言、7以降では消えた。 ネットワーク越しにxcopy中に通信が切れたらどうなるか、MSは知ってたはずなんだが。 xcopyを使いまくってるクソベンダーどもから「直しきれない。フザけんな!」とでも突き上げを食らったんだろうか? こういうところも本当に信用できない。 : [sage] 2018/08/15(水) 21:58:51.70:X+03HcfZ cmd「あ、pushdとかでヨロ」 ネットワーク系で言えばpingが酷い。 if errorlevel そのものが効かない。エラーしたらズルズルっと抜ける。 あ、某SIer(富〇通)のバッチを思い出した。 pingでTCPの疎通確認?エラー処理なし? バッチとか以前の問題だった。 富〇通は日本から消え去ればいいと思った。 : [sage] 2018/08/15(水) 22:00:15.25:X+03HcfZ おいおい、さっきからレスに「ドット・エグゼ」を半角英数で書くと弾かれるようになってるぜ… なんだいこりゃ。 : [sage] 2018/08/16(木) 00:37:28.93:fpSDK1Rz 標準入力から読むんじゃなければ <nul なんか無意味だろうに... : [sage] 2018/08/16(木) 00:47:34.46:nXvfu44n pingは標準エラー出力の文言で処理するのが慣例だろ... : [sage] 2018/08/16(木) 04:14:43.69:W93QKVeg エロ動画.avi .exe : [sage] 2018/08/16(木) 06:00:01.74:3IMawj9A すみません、CMDを最近やり始めたのですが ネットで検索すると%Aと%%Aのように「%」が1つ付く場合と2つ付く場合があったのですが どういう違いがあるのでしょうか? : [sage] 2018/08/16(木) 06:18:11.25:nXvfu44n %Aはfor文内でのみつかう変数。for文をコマンドラインから直接実行する場合は%A バッチスクリプト内で記述する場合は%%Aとする。 for /? (またはhelp for) で表示されるヘルプの上の方に書かれている。 : [sage] 2018/08/16(木) 11:22:52.16:hWBtBIZ+ batファイルで任意のプログラムを実行し、一定時間後に強制終了させる(画面を閉じる)という処理は実現可能ですか? 任意のプログラムも同じDOS画面上で走ります。 タイマーでtaskkillを実行してcmdを終了させるというのを考えたんですが、cmdが複数あると使えないので他に方法があれば知りたいです。 : [sage] 2018/08/16(木) 15:41:05.25:KoNkkRtT START "test001" cmd /c test.bat TASKKILL /FI "WINDOWTITLE eq test001" : [sage] 2018/08/16(木) 19:34:15.23:hWBtBIZ+ ありがとうございます! : [sage] 2018/08/16(木) 20:50:06.40:qKowi4/2 否。 pingはICMP。pingが通ってもTCPが通るという保証は無い。 逆に、pingは返さないがTCPが通る環境だってある。 ただでさえpingコマンドの動きはおかしいのに、pingでTCP疎通確認しました!というのが大手SIer(富〇通とか)が首を釣るべきポイント。 ダミーの共有フォルダを用意して dir \\hoge.local\hoge とかでSMBを経由したTCPの疎通が確認できるんだぜ?? 頭が悪いとしか言いようがない。 もう一度言う。 pingではTCPの疎通は「絶対に確認できない」 : [sage] 2018/08/16(木) 20:52:58.55:qKowi4/2 言っとくけど、LinuxのpingでもTCPの疎通は確認できないからな。分かってると思うけど。 : [sage] 2018/08/16(木) 21:07:41.39:t6OwQxX1 そんなこと言い出したら特定のホストや特定のポートだけは通さないとかあるからモノホンの通信でないと確認なんて取れんわ 富〇通から何されたのか知らんけど富〇通に同情するレベルのバカ : [sage] 2018/08/16(木) 21:10:18.18:nXvfu44n プロトコルが別物というのはその通りだな、 コマンドプロンプトでのエラーハンドリングの話かと思ったわ(分かっちゃいるとは思うが) : [sage] 2018/08/16(木) 22:17:08.25:fpSDK1Rz わなくらい以降、SMBを通すようなネットワーク組むような業者はやばいだろ : [sage] 2018/08/16(木) 22:22:12.09:3IMawj9A ありがとうございます!理解しました。 : [sage] 2018/08/16(木) 22:30:01.84:3IMawj9A このスレは1年半前に立ってまだ760レスぐらいですが ここ1ヶ月半で見ると200レスぐらい書き込みがあるので CMDの人気が出てきたということでよいのでしょうか? : [sage] 2018/08/16(木) 22:36:21.06:qKowi4/2 富〇通のシステムのサーバーがシステムの動作に必要なファイルを共有フォルダで端末に公開してたからだよ。 「何でこうしないの?」だよ。アホか。 そこまで知らねーな。 SMBoverTCPを止めてWindowsの共有フォルダが機能しなくなるかどうかのテストまでしたことはない。 止まるらしいけどバッチの範囲内じゃなくなるからこの話はもうしない。 : [sage] 2018/08/16(木) 22:51:43.40:t6OwQxX1 > 富〇通のシステムのサーバーがシステムの動作に必要なファイルを共有フォルダで端末に公開してたからだよ。 > 「何でこうしないの?」だよ。アホか。 全然違う話ししだして笑う : [sage] 2018/08/16(木) 23:03:11.26:qKowi4/2 1. 富〇通のシステムは、端末の起動時にサーバーにTCPの疎通確認をする。それがただpingを打つ「だけ」。通ろうが通るまいが処理を続行。意味がない。 2. 俺はこう思った。「端末が見に行く共有フォルダをdirしてエラー検出した方が確実でしょ?何でこうしないの?」 て言わなきゃ分からないアレですか? : [sage] 2018/08/16(木) 23:07:16.23:m8VsM5un つまりイントラネットなわけね ならpingが通れば回線チェックできるとしても問題なかろう 鯖がpingを許可してるシステムだろうし : [sage] 2018/08/16(木) 23:19:02.45:qKowi4/2 おい。 十歩くらいは譲ってやる。 だがお前は馬鹿。 問題。 Windowsサーバーはネットワークの場所の検出に失敗することがあります。 パブリックと勘違いしたらpingを返さないことがあります。 さて、検出に失敗する場合はどのような場合でしょうか? 答えではないが発生例 富〇通に渡された手順通りにサーバーを再起動したらそうなった > ならpingが通れば回線チェックできるとしても問題なかろう pingの結果だけを信用したら駄目なんだよクソが!! どんだけレベル低いんだお前?? …ああもう呆れる…。 : [sage] 2018/08/16(木) 23:23:10.64:qKowi4/2 んー、バッチだけじゃなくてWinの挙動も関係すんなぁ…ネットワーク系は。 まあいい、また今度な。 : [sage] 2018/08/16(木) 23:27:50.00:qKowi4/2 あ、答えはTechNetとかに載ってるから興味ある人はてきとーに調べといて。 英語だけど。 : [sage] 2018/08/16(木) 23:59:08.11:fpSDK1Rz パブリックと勘違いしてるなら、それはpingでも検出できるじゃん。 : [sage] 2018/08/17(金) 01:30:25.51:a2i7eL0Z 絶対に正しい自分の主張を認めてもらいたいだけの人なんだから相手しても意味ないでしょ : [sage] 2018/08/17(金) 02:44:03.57:jfy/CF71 昔はpingを使っていたが、今は set errorlevel= arp -a|findstr 192.168.0. >nul if not %ERRORLEVEL% == 0 goto オフライン処理 : [sage] 2018/08/17(金) 05:25:51.61:KaaDwp63 本当に頭悪いんだな w いきなりdir \\hoge.local\hogeが失敗しただけだと何が起きてるのかわからん pingが通ってるかどうかで障害の範囲がある程度絞れる ちょっとしたシステムだとネットワークとサーバーで違うベンダーが構築してるとかあるからどっちを呼び出すかの切り分けに使ったりする : [sage] 2018/08/17(金) 06:18:35.06:+gK4oX51 ping ホスト名 で打ってるならその端末がWINS名前解決出来てるかは分かる でも「TCP疎通」ってタームはたしかに違和感ある。某省庁案件で富士通のインフラ部隊と仕事したが、そんなターム使って無かったけどな... : [sage] 2018/08/17(金) 07:30:14.12:J26jcjpU ネットワーク=TCPみたいに言ってる奴は見たことあるな たいてい文脈でわかるからいちいち指摘なんてしないけどね : [sage] 2018/08/18(土) 21:40:50.22:/0AtM/3Y ただの記号ですら言い方は人それぞれだからなあ ピリオド : ドット、ポチ、ポツ アスタリスク : アスター、コメ、ピカ アンダースコア : アンダーバー、アンスコ : [sage] 2018/08/18(土) 22:00:05.69:/4eOy7p1 アンスコは言いにくい : [sage] 2018/08/19(日) 08:47:38.57:DFKp/EIO 一番言いやすいだろ : [sage] 2018/08/19(日) 10:20:25.64:vvrGLkFs 777 : [sage] 2018/08/19(日) 20:48:42.50:10g4+5oK パブリックと誤検出した場合、当たり前だけどpingは返さない。 ドメインコントローラーが勘違いした場合、端末も勘違いすることがある。 クソな再起動手順がもたらす問題を回避するために…「全プロファイルでファイァーウォール停止」を要求されたらそりゃたまらんわ。 正しい再起動手順でやれば、そんな事態は一切おこらないってのにさ。 おまい、スレ違い。 ここはバッチスクリプトスレ。 過不足ない通信が可能かどうかを調べるバッチなりなんなりを使うのが主題。 実際にエラーが出て連絡を受けた人間が調査の手始めにpingを打つことは普通にある。 ???WINS名前解決??? 何世紀の人???? 「少なくとも、相手がTCPを使ったサービスを実行できる状態にある」の言いに使ってるけどね。間違いじゃないだろ。 本当に相手のサービスそのものがダウンしているかどうかにはtelnetを使ったりするし。MS純正じゃないのも含めて。 でもまぁここはバッチスクリプトのスレなので、pingが通った=TCPもイケる、は間違いなのは別で調べて頂戴。 arp -a って…ギャグのつもりなのか?笑えない。 : [sage] 2018/08/19(日) 21:11:07.45:t1KS71KR 頓珍漢な粘着男乙
凡例:
レス番
100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている
名前
名無しさん (青) → sage のレス
名無しさん (緑) → age のレス
ID
ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID
このページは2ch勢いランキング が作成したアーカイブです。削除についてはこちら 。