【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
終了してから TASKkill しても見つからんエラーが出るだけで無意味 リダイレクトしてテキストファイルに出力しながらstartで立ち上げた別のbatにfindして貰う事で解決しました。 >>652
process.exeってのが自作の場合、そうしろってことだろ Linuxでコマンド実行した結果とWindowsでコマンド実行した結果を
一つのファイルに書き出したいんだけど、改行コードが違っている
バッチファイルでCR LFではなくLFで出力したいなと思って
このコードを見つけたんだが何やってるのかさっぱりわからない
<NUL set /p=message が set /p=message <NUL と同じ意味で
「メッセージを表示してユーザーの入力内容を変数に入れるコマンド」の
代入先変数の省略 + 入力内容省略 = 改行なしecho
ということはわかったんだけど、^%LF%%LF% がなんなのか
なんでこれでうまく動くのかわからん
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 違うこと調べていて、たまたま答えにぶつかったぜw
http://ken sou1900.blog96.f c2.com/blog-en try-7.html 違うこと調べていて、たまたま答えにぶつかったぜw
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
こっちも未だよくわからいが、
まあこれも単なる不思議な動作だろう
なっとくした ↑これは書き込めるのか
↓これはどうだ?
a.fc2.com aaaablog96.fc2.com とかいう文字が書き込めないみたいだな aaaablog96.fc2.com/aaa.html よくわからん
aaaablog96.fc2.com/blog.html よくわからん
aaaa.blog.fc2.com/blog.html 面倒くさいから今度からURLは全部短縮URLを使おう 改行は[LF]じゃなくて[CR][LF]だと思うんだが、どうなんだろう? Windowsの改行コードは[CR][LF]だよ
だけど、処理の一部として、Linux側にコマンドを投げ
その出力をログファイルに書き込むんだよ
Linuxの改行コードは[LF]
その同じログファイルにWindowsからも書き込むんだよ
こっちは当然[CR][LF]
まざるとうざくなるので、どちらかに統一したかったんだよ Winでもコンソールは何故かLFだよ
混同すんなよ >>671
コンソールがLFって意味わからん。
改行コードをどう出力するかはコマンド次第だろ
Windowsはデフォルトの改行コードがCR LFだってだけ
それに従わないプログラムもあるよ
(例 nkf は出力改行コードを変更できる) PSでもcmdでもいいんだけど一行で文字列+連番を出力できない?
echo aaa + (1..10)
とかやると別々に出ちゃう >>673
for /L %%i in (1,1,10) do echo aaa %%i >>673
いまいちよくわからんけど abc1 abc2 abc3 abc4 … って言うのが欲しいの?PS なら
[String]::Join(' ', (1..10 | %{ "abc$_" } ))
でいける >>674
ありがとう、でもエラーでうまく動かなかった
>>676
完璧です
助かりました >>671
CRTがテキストモードの時にはCRを足してくれてるんだよ? 改行コードはコマンドに依存する
dir /? > d.txt
sort /? > s.txt 質問です
ファイルをbatファイルにドラッグアンドドロップしてファイル名等を得たいのですが
2番目のドライブ名+パス名(ファイル名以外)が表示されません (%~dpと表示される)
どう記述すればいいのでしょうか
もう2時間悩んでおります
echo off
for %%f in (%*) do (
echo %%f
echo %%~dp
echo %%~nf
pause
) >>681
ありがとうございます
それも試したと思っていたけどそうでなかったようですね
>>682
多くのサンプルではサブルーチンをつかっているようですが
カッコを使うとバグの原因になりやすいとかそんな理由なのでしょうか >>683
%%~dp → %%~df%%~pf
callを使い %1などを使えるようにするため
昔は%~n1 など数字でないと動作無保証だった Win10のコマンドプロンプト画面では改行と折り返しを区別してコピーできるようになったね。これすごく便利。
他に改善点とかあるのかな? コピペでCtrl+C,Ctrl+Vも使える
Alt+Enterで最大化
ウィンドウスナップ
など。詳しくは
https://japan.zdnet.com/article/35069776/ windows板のスレに書いてしまったので詳細はそちらを参照して頂きたいのですが
https://mevius.5ch.net/test/read.cgi/win/1381119881/327
この件について詳細をご存知の方あるいは解説されているサイトをご存知の方は
ご教示頂けないでしょうか? 再現しない。よくソース見直してみて
おそらく単に遅延変数展開だけの問題に見える。 プログラムを問題の箇所だけ抜き出して実行しても同じ結果になります。
xxxを未定義状態にしてから%xxx%を引数にして実行するとやはり
「echo %aaa%|more」の結果がyyyと表示されます
当方の環境はWindows7 SP1です
これはこう動作するように作られた仕様なのかそれともあてにならない不思議動作なのか
cmdのバグなのか判断したいです ん?せやで?Windows 7はデフォルトの設定が違うんやで
しらんかったんか?cmd /?とかしてみな。 cmd /? にも setlocal /? にも echo /? にも
echoとパイプ併用時の環境変数の二重展開について記述は無いようです 別のものを見ているのかもしれません。
そちらには何と書いてありますか? パイプってCall文でサブルーチン処理してるような物だし、call文と同じ展開をすると思っとけばいいんじゃね? なるほど。
では逆にあえて二重展開したい場合はcallを使ったほうが無難でしょうか? call文で変数内変数が1ネスト展開されるのはパイプよりは有名だと思う 一番知られて無いのが、for /f文の('コマンド')が同じく二重展開されるってのかな いや本当は、コマンドの中で^を付けてエスケープしないといけない場合があることは
結構知られているんだけど、それが二重展開のせいだってことが認識されてないわけで echo は結構罠
if "%errlorleverl%" ... も罠。
はやくバッチから救われたい… こういうことじゃないかな?
set ERRORLEVEL=0
hogecommand
if %ERRORLEVEL% gtr 0 goto :ERROR
これが絶対真にならず、ジャンプしないとか エラーは1以上とはかぎらないんだよな、コマンドによっては。 >>703
echo hoge > test.txt
て書くと「hoge」の後の半角空白までがtest.txtに出力されるんだよ。
>>704
代入しなくても、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 (
:
だと正常に動く。何故だか分からない。 >>706 にちょっと間違い。
〇 if "%ERRORLEVEL%"="0" (
× if not "%ERRORLEVEL%"="0" ( >>708
悪い。typo。
〇 if "%ERRORLEVEL%"=="0" ( 何故か以前にいろいろ間違いすぎなんだよ
ゼロから書き直せ >>710
> ゼロから書き直せ
こんな感じっすかー?
0" ([HOME]if "%ERRORLEVEL%"==" >>704>>706
ERRORLEVELは代入すると返却値として使えなくなるんじゃ
なかったっけ?
だからやるならば
set ERRORLEVEL=
だけにしないとだめなのでは
ただ、これをやってバッチ内でERRORLEVEL環境変数の
初期化みたいなことしてもうまく動かないこともあったような
気がするけど何か勘違いしてるんだろうな >>706
パイプの動作が原因だろう
パイプの右側は子タスクでの実行となる(おそらくは)
メインタスクに環境を引き継がないんだと思う
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が入らない >>713
下2つ&は&&の間違いだが、別に&だろうが&&だろうが(この場合の)結果は変わらない setコマンドの長いヘルプの下の方に
「ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にします。」
と書かれてる。errorlevelをsetするのは回避した方がいいだろう ついでに言っとくと
パイプはデータの受け手が子タスクになったけど
for /fの'コマンド'は送り手が子タスクになる
従って、'コマンド'の中で環境変数に値を入れても、メインタスクには引き継がれない >>710
難癖付けてばかりで話題提供もできない人はゼロから人生をやり直した方が(ry >>713
んー、俺はもうそこまで調べる気もなくてね…ほぼ諦めてる。
子タスクとかどこの文献見ればあるんだろう?
あってもなくても、んなテクニック、引継ぎできる代物でもあるまい…。
例えば、
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
こんな感じにするしかなかったし、これならせめて引継ぎができると思う。 あ、ごめん。
if not errorlevel 1 (
正常終了処理
) else (
異常終了処理
)
て書くべきだった 勉強になる話題だけど、バッチファイルは言語仕様の規模に比して闇が深すぎると思う >>721
そだね
だんだんとwslの利用者が増えていくのだろうな >>719
子タスクと言ったのは俺の推測(想像)でしかないから
データの受け渡しを行うのには、送り手と受け手の両者が存在しないと変だろうってことからね
あと、タスクというのも、適当な概念だから
親の環境を引き継いで生成された子環境のことね
実体はスレッドだろうと想像するけど >>703
綴りといえばenabledelayedexpantionも罠レベルだよ・・・誰だこれ考えたの('A`) 元の英語がわかれば
enable delayed expansion
を繋げただけなんだよ 質問させてください。
Linuxでいうところの、/dev/nullで標準入力待ちを終了させるのはどうすればいいのでしょうか。
具体的には、Windows向けのopensslコマンドを実行しています。
openssl s_client -connect 〜とやると標準出力が一通り出たところで入力待ちになる仕様で、
コマンドプロンプト上だとCtrl+Cで止めてあげる必要があります。
Linuxだと、末尾に< /dev/nullで終わらせられるのですが、Windowsバッチで同じように終了させる方法は無いでしょうか。 >>728
書いてなくてすみません。それだとダメでした。 >>730
参考サイトありがとうございます。
先ほど教えていただいたのと同じ< nulですよね。
サンプルコマンドの通り打ってみても入力待ちで止まります…。
念のためOpenSSLを入れ直しても変わりませんでした。
サンプルでパイプで渡してる直前まで( < nul 2> nul)で試すと、
実行結果がダーっと出て、入力待ちで止まるんですよね…。 下のサイトのやり方も参考にしつつやってみましたが、どれも結果は変わらずでした。
後出しですみませんが、当方の環境はWin10 Pro 1803、opensslは1.0.2m.1.0.2oでやってました。
https://stackoverflow.com/questions/25760596/how-to-terminate-openssl-s-client-after-connection
回答くださった方、ありがとうございました。
もしやってみて、何言ってんだ、できたぞ?という方いらっしゃいましたら教えていただければ幸いです。 制御文字を入力できるエディタ(サクラエディタ等)で
バッチを開いて
nulの代りに[0x03]か0x04の制御コード入れてみては? >>732
普段OpenSSLは使わないけどたまたまインストールしてあったOpenSSL 1.1.0hで出来たよ
コマンドはこう
openssl s_client -connect example.com:443 < nul 2> nul | openssl x509 -text | findstr Not >>734
試していただいてありがとうございます。
そのコマンドを実行したときなのですが、コンソールが返ってくるまで1分ほどかかりませんか? すぐ返りますか?
< nulの有無に関わらず1分ほど待つので、単にタイムアウトか何かで終了しているのかなと思っております。
nulを入力として受け取っているなら、すぐに1個目のパイプより前のコマンドは終わるはずだと思いまして…。 >>736
ありがとうございます。
ということは>>728さんと同じ書き方でちゃんとできて、
私の環境起因で何かがおかしいってことですね…。
他のパソコン出してきて試してみようと思います。
>>733さんもありがとうございます。
まずはバッチ化する前にプロンプト上で試している段階で躓いてました。 >>733
1)コマンドプロンプトで下記のように入力し、hoge.txtを作る
copy con hoge.txt[Enter]
[Ctrl+d]
[Ctrl+z]
2)バッチの方で
<hoge.txt
とすればコンソールでCtrl+Dを入力したのと同じ効果となるはず >>737です。
あの後うまくいきました!アドバイスありがとうございました!
Windows向けに提供されている最新のインストーラを色々試したのですが、
openssl 1.0.2pだとダメ、1.1.0iだと< nulが効きました。
32bit向け、64bit向けのインストーラのどれでも同じ結果でした。
私の試してたのが1.0.2系だけで、>>734さんは1.1.0hで成功してるので、
1.0.2系だとダメなのかもしれません…。
< nulはきっと汎用的なものなので、そんなわけはないと思いたいのですが…。
長々とありがとうございました、大変助かりました。 悪いけど、Windowsバッチに鉄板を求めるのも、追いかけるのも無駄。
歴史的経緯でそうなってしまっている。マトモな資料なんかありゃない。
NULの解釈がコマンドによって違ったって全く不思議じゃあない。
犬のクソをクソだと知りつつカリントウだと思いながら食わなければならないような、そんな代物。
好きで書いてる奴なんかほとんどいないと思う。
バッチで書いた方が良いと判断できる材料がなければVBscriptやPowerShellで書いた方が遥かにいい。
環境が許せば他の言語の導入を検討するのも大いにいい。
よく知られたコマンドをよく知られたイディオム下で使うのでもなければ、バッチでなんか書かない方がいい。
それでもクソみたいにハマることがあるんだから。 UNCパスを一向に解釈しないのがとにかく糞だと思う xcopy のヘルプは酷い。
Vistaでは「推奨されない。使わないで。robocopyを使って」みたいな文言が出てきた。理由は記述なし。
この文言、7以降では消えた。
ネットワーク越しにxcopy中に通信が切れたらどうなるか、MSは知ってたはずなんだが。
xcopyを使いまくってるクソベンダーどもから「直しきれない。フザけんな!」とでも突き上げを食らったんだろうか?
こういうところも本当に信用できない。 >>741
cmd「あ、pushdとかでヨロ」
ネットワーク系で言えばpingが酷い。
if errorlevel そのものが効かない。エラーしたらズルズルっと抜ける。
あ、某SIer(富〇通)のバッチを思い出した。
pingでTCPの疎通確認?エラー処理なし?
バッチとか以前の問題だった。
富〇通は日本から消え去ればいいと思った。 おいおい、さっきからレスに「ドット・エグゼ」を半角英数で書くと弾かれるようになってるぜ…
なんだいこりゃ。 標準入力から読むんじゃなければ <nul なんか無意味だろうに... pingは標準エラー出力の文言で処理するのが慣例だろ... すみません、CMDを最近やり始めたのですが
ネットで検索すると%Aと%%Aのように「%」が1つ付く場合と2つ付く場合があったのですが
どういう違いがあるのでしょうか? >>749
%Aはfor文内でのみつかう変数。for文をコマンドラインから直接実行する場合は%A
バッチスクリプト内で記述する場合は%%Aとする。
for /? (またはhelp for)
で表示されるヘルプの上の方に書かれている。 batファイルで任意のプログラムを実行し、一定時間後に強制終了させる(画面を閉じる)という処理は実現可能ですか?
任意のプログラムも同じDOS画面上で走ります。
タイマーでtaskkillを実行してcmdを終了させるというのを考えたんですが、cmdが複数あると使えないので他に方法があれば知りたいです。 >>751
START "test001" cmd /c test.bat
TASKKILL /FI "WINDOWTITLE eq test001" ■ このスレッドは過去ログ倉庫に格納されています