【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
普通に使える ubuntu run curl --help Linux(Ubuntu)側のbash、Windows側のPowerShell・コマンドプロンプトから、 相互のアプリ・コマンドを実行できる 相互のパイプも、つなげられる つまり、Linux側のbashは、Windows10 の1つのアプリになっている > Ubuntu 16.04 LTS をダウンロードすれば、 この手の前提条件が無いことがバッチのメリットなのに... >>363 Web開発テスト用の範囲を超えてない。 当のMSが「運用には使ってくれるな」つってるのによ。 お前馬鹿か?馬鹿だろ。 >>368 WSLはウェブサービス開発で使って、 実際にそのウェブサービスを動かす(=運用)するのは ネイティブなLinuxの上だぞ。例えばAzure上のLinuxとか 運用に使ってくれるなっていうのは、WSL上でウェブサービスを動かして 実際に不特定の人にサービスを提供するなっていう意味だ WSL 上で、Webサーバーとかを常時接続させて運用できない まあ最初から、自分のデスクトップPC を外部につなげて、 そんなサービスをする奴は、居ないだろ >>370 端末のスタートアップスクリプトに使うのも用途外。 だから「使える」とか言うのは明らかに言い過ぎ。 お前馬鹿か?馬鹿だろ。 >>373 > 端末のスタートアップスクリプトに使うのも用途外。 端末のスタートアップスクリプトの話なんかしてないんだが、 何を言い出してるんだ? そもそも端末のスタートアップスクリプトの 意味わからねぇw >>372 運用っていうから悪いんだよ。 「一般ユーザーに対してのウェブサービスの提供」 MSが使うなって言ってるのはこれだけだよ うん、ちゃんとFAQに書いてあったね 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. サーバーアプリケーションを実行できるが、サーバーとしてのシナリオは推奨してないと もう一つ、誰のためのものですか?という質問には > 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ツールや言語を使いたい人のためのものと Windows のコマンドプロンプトから、 wsl bash -c "echo 'hello'" 出力結果 : hello これぐらいのLinux の起動・実行・終了は、1秒! 定時処理ぐらい楽勝 サーバーみたいに常時実行しなければ大丈夫 >>377 wsl.exeを使うなら bash -c はいらないぞ wsl echo hello でよい wsl echo --help と wsl /bin/echo --help の実行結果が違うから wslの中ではbash上で動いているっぽい wsl ps axfu やってもbashいないんだけどな まあ詳しい人に聞けば、そこら辺の動きは知ってるだろう。 あと、別にLinuxは起動してるわけじゃないのでLinuxの起動と書かれると違和感がある。 WSLはLinuxカーネルを模したサブシステム 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は、もう正規版だし、単なるアプリとして使う分には、問題ないだろ 書き忘れた Windows のコマンドプロンプトで、 >where bash C:\Windows\System32\bash.exe Windows のコマンドプロンプトで、 >wsl echo hello >ubuntu -c "echo hello" >bash -c "echo hello" これらは皆、hello が出力されるけど、書き方が異なる wsl では、echo がサブコマンドになっているのかも >>379 俺もちゃんと調べたわけじゃないけど、 開発の歴史からすると、 最初は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 が出来た。 こんな所だと思う なんでバッチスレでパソコン博士がWSLでイキってるの? >>381 ubuntu /?をするとわかるが、 ubuntu run echo helloが正しい ubuntu.exeもwsl.exeもbash.exeもパラメータの扱いが違うだけで ディストリ上のbashを実行していることは確かなようだ >>383 Windows 10において、バッチファイルでWSLと連携するのは 当たり前の話になってきているから ubuntuは Usage: <no args> - Launches the distro's default behavior. By default, this launches your default shell. と書いてあるから、bashじゃなくてデフォルトシェルが呼び出されるのかも。 うーん、どれを使うのが良い(汎用的)なのだろう? wsl(Linux のbash)・PowerShell・コマンドプロンプトの3つが、 パイプでもつなげられるし、シームレスになってきて、CUI が統合されてきているから、 個別の話よりも、3つのCUI をパイプでどうつなげるかの方に、 話の焦点が移ってきている 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 を使うと良いかも >>383 オモチャ買ってもらった子供が「見て見てこれすごいんだよー」って言ってるような感じ 暖かく見守ってやれ >>389 WSL出た頃なら仕方が無いが... やっぱパソコン博士レベルだと今頃になってやっとおもちゃを見つける感じなのか。 へへーん、ぼくなんてまえからもってるもんねー それはすごいねー w さすがにスレチだからもうやめとけと思うけど、WSLについて少し調べてみようと思うきっかけにはなったわ。 パソコン先生に恨みでもあるのかな? そんな話をしてもバッチファイルを書く上で 何の意味もないと思うんだが、話をしたいのだろうね >>390 Bash on Ubuntu on Windowsは、早く使いたかったんで Inside Previewに変えてまで使ったよ。 GUIアプリには対応していないって書いてあったが仕組み上 GUIアプリ動くんじゃね?ってそこの頃はまだ情報が少なかったけど 実際に自分で試してxeyes は動いたーって2ちゃんねるに書いた記憶がある 自分語りとか余計なことをダラダラ書き連ねるから嫌われるんだよ。 嫌うのは相手の問題だからどうしようもない 俺に対する勘違いは、俺の問題だから解決する必要がある 例えば「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)をコマンドで変更することは出来るのでしょうか? reg add HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa /v Server /t REG_SZ /d bbbDB とかでだめなん >>400 「/v Server」は「/v Database」の間違いですよね? これでバッチリいけました。ありがとうございます! 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」の様な入力方法は有りますか? バッチファイルで 空行を除く最終行にhogeって文字がなかったら追加して改行 -- hogeとかになってたら削除してhoge追記して改行 って事をやりたいんですけどどうやったらできるかおせーてください 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 } >>405 あのーバッチって聞いてるのにrubyのスクリプト出されても困るんですけど やらなくても言い余計なことをして場を混乱させる人って必ずいるよね ロジック真似すればいいだけじゃん 作ってくれじゃなくて教えてくれなんだから Lispで回答されて読めないのは理解できるが 上のRubyくらいなら何の問題もないだろ 聞かれてるのはバッチでの実現手段なのにロジックとか言い出してどうすんだよ 文字列の比較も削除も面倒だから バッチではやらないほうがいい vbscript版作ったけどバッチ限定なら貼らなくいい? >>404 一応無理矢理ここまで作ってみたけど、ファイルの中身や指定文字列に特殊文字が入ってると 容赦なくコケるという地獄仕様のままなんで、限定的にしか使えないと思う。 有意な最終行の内容にあわせて結果ファイルを出力するバッチ https://pastebin.com/mh9BZDCv コケないようにやるにはどうすればいいのかな・・・。誰かうまいやり方があれば教えてくれ。 >>414 俺の選んだ手法がアホなだけかもしれんけど、バッチって基本的に制約多くて泣けてくるもんだから・・・( ノД`) せっかくだしvscript版もどこかに貼ってもらえるとありがたいな。 >>412 >>1 にそれらしいことは書いてあるから、ダメってことはないだろう ただ、「Jscript・Perl等の埋め込み」って何だろう バッチファイルに他言語のコードを埋め込めるのか? 「バッチ JScript」とかでググればいいんじゃないか >>413 ありがとうございますとても参考になりました @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 ループ回しすぎじゃね? 小さいファイルならいいだろうけど でかいログファイルとかだと辛いかも バッチのfor /f 〜 in (ファイル)って1行ずつシーケンシャルにメモリに読んでるって考えていいのかな? >>420 wordってのがどれだけの頻度で出現するかで違ってくる もし殆ど書かれてないのなら、最後が --hogeならforループはほぼ2回分(wordが各行当たり前にあるのなら4回分) hogeやなしならforループはほぼ1回分(wordが各行当たり前にあるのなら3回分) wordと--wordの検索は一緒のループでできそうだけど あと、データ中に、&|^%"'\や%date%を入れてみたけど問題ないみたいだ(win7) いや各行にwordと--wordのどっちかしか無いとするなら--wordの場合で最大でも3回分か 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 1万行ある適当なテキストファイルでテストしてみた >>419 の方、3.1秒 (最後に-- hoge行を加えた場合 7.5秒) >>424 の方、2分14秒(最後に-- hoge行を加えた場合 2分14秒) ってな結果になった >>419 の方はforのループ回数は多いが、比較すると速いという結果になった Oh...ワタシ findstr /n ノキョドウカンチガイシテタネ... >>419 、>>424 は対象ファイルの行頭にコロンがあると消されちゃうね。 そういう後から判明するバグが紛れ込むからバッチで文字列処理は嫌なんだよな 先頭から連続するデリミタは全て消される >>419 ,>>424 どっちもダメ >>424 は /? もダメ abc :::def /? -- hoge 俺が仮組みしてみたやつもforの変な仕様で空行削除されてた バッチだけで手軽には無理だな 素直に適当なスクリプト使った方がいい >>430 セミコロンをピリオドとかコロンとにするといいみたい echo; → echo: >>425 424のほうのgoto labelをfor(/L)にすると多少速くなるけど findstrを繰り返し使ったほうが速いね メモリにも優しい >>432 どの文字に変えてもその文字が来ればデミリタ判断されておかしなぶった切りが起こるから デミリタ文字のエスケープ処理が必要になるんでは 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 >>437 元ファイルにechoで追加ですむ場合もあるが ファイル終端が改行になってるか確認する方法が思いつかない >>438 終端に改行があろうがなかろうが、echoで出力すれば改行は付加されるよ あとは参考になるかわからんが set LF=^ setlocal EnableDelayedExpansion findstr /n .* in.txt findstr /n $ in.txt findstr /n !LF! in.txt の出力の差で終端改行のありなしの見分けがつくかも (setとsetlocal行の間の空行は省略しないこと) 改行コードが、CR/LF、LF、CRで違った結果が出るところが面白いよ >>439 ファイル終端が改行になっていないと最後の行の後ろにhogeがくっつくだけだよ >>419 で試してみなよ echoで空行を追加してからhogeを付ければいいんだけど それだとファイル終端が改行になっていたら余計な空行ができる コマンドプロンプトの画面で以下の<コマンド@>を入力すると現在の年月日時分秒が表示されるのですが これを変数に入れるにはどうすれば良いのでしょうか? 以下の<コマンドA>ではうまく入りませんでした・・・ <コマンド@> powershell -command "date -f yyyyMMddHHmmss" <コマンドA> set NICHIJI=powershell -command "date -f yyyyMMddHHmmss" >>441 for /f "delims=" %%G in (‘powershell -command “date …”’) do set “NICHIJI=%%G" >>441 外部プログラムの標準出力を取り込むのが目的ではなくて、単に現在日時をセットするだけならバッチのみで済むけど set NICHIJI=%date:/=%%time::=% set NICHIJI=%NICHIJI:~0,-3% >>442 すみません、分かりにくい文でした >>437 を改造しようとしたが改行がネックだと言う話 以下の通り改造してみた >>437 の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 echo と同じ行で何か実行すると空白が入る echo.>a echo.>b & rem dir a b 豆知識その2 echo と同じ行でパイプ実行すると表示が変わることがある set a=%%b%% set b=xxx echo %a% echo %a% | more 豆知識その3 文字化け嫌なら遅延展開で @echo off set "a=a > nul" set "b=b & rem" echo %a% echo %b% echo ------ setlocal enabledelayedexpansion echo !a! echo !b! pause プログラムからファイルの追加・削除・変更などを行っている最中のフォルダに対して「dir /s」のコマンドを実行した場合 そのせいでプログラムからの処理を邪魔してしまうことってあるのでしょうか? 絶対に邪魔をしないと言い切るのは難しいな。悪魔の証明 普通は影響しないと思ってていいだろう そのプログラムがシビアな待ち時間を気にするような造りにさえなってなければね ちょっとハマってしまったのでアドバイスをいただきたく。 @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 >>454 でやりたいこと ・空白区切りの文字列群が入っている環境変数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" にすればいいのだが、できれば一時ファイルへの出力は行いたくない。 何か良い方法はないでしょうか。 空白区切りなら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 とあるプロンプトを表示して確認画面でyes/no入れてyesが表示されたら処理を続けるnoが入れられたらgoto ENDって事がワンライナー(一行)でやりたいんですけど良い方法ありませんか? >>458 は例えば↓なのを一行でやりたいんです 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 ワンライナー云々抜きに choice.exe は使ったらダメ? database.txt にある複数の文字列を delete.txt の内容で消去したいと考えているのですが 「複数の文字列 削除」でぐぐっても複数ファイルから単一の文字列を削除するtipsしかヒットせず迷子の状態になってしまいました。 調べ方を教えていただけないでしょうか、よろしくお願いします。 [database.txt] りんご,ごりら,らっぱ,ぱんだ,だちょう,うし,しお,おにぎり,りす, [delete.txt] ごりら ぱんだ うし りす [output.txt] りんご,らっぱ,だちょう,しお,おにぎり, ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる