【.cmd】 バッチファイルスクリプト %7 【.bat】
@echo on
echo on に @ は要らんだろw
@@@@@@@@@echo 使えるのに使って悪いか?
@@@@@@@@@@@@@@@@@@@@echo もっといっぱい使ってやる
バッチファイルのサンプル集みたいなのありませんか? 勉強用とかでなくて実用的なサンプルを掲載されてるものです
実用的な?
実際に使用してるバッチファイルがないからなぁ
実際に使ってるバッチファイルを紹介して貰ったら実用的かも
実際に使用していて有名なのはautoexec.batじゃね? コンベンショナルメモリを無駄にしないためにはconfig.sysだけじゃなく autoexec.batも理解しないと意味ないしね
ググってヒットするサンプル集って けっこう実用的だと思うのはおれだけか
誰かバッチで標準入力から入力得る方法おしえてくらさい 以前自分が調べたやつから とりあえず基本 for文 FOR %%B IN (*.TXT) DO TYPE %%B if文 IF %FLG%==1 DIR REM コメントだこの野郎 GOTO相当 :START ECHO そして時は繰り返す GOTO START とりあえずチューリング完全
イミフ
うちのautoexec.batは空っぽだから実用的じゃねえ
昔のautoexec.batもそれ以外に使い道ないからちっとも実用的じゃねえ
単なる阿呆だなw
>>11
バッチファイルを使い続けて20年 ついに奥義遅延展開を会得したぜ
>>17 @echo off
setlocal enabledelayedexpansion
set 1=お
set 2=め
set 3=で
set 4=と
set 5=う
for /l %%a in (1,1,5) do echo !%%a!
endlocal
exit
遅延会得者に拍手w
遅延展開より、むしろ、華麗な CALL 使いの方に憧れる ここの前スレだったか、別板スレの前スレだったかはとても勉強になったよ でも会得してないので遅延展開使っちゃうけどw
こういうの @echo off setlocal set 1=お set 2=め set 3=で set 4=と set 5=う for /l %%a in (1,1,5) do call echo %%%%a%% endlocal
23 :
20 :2011/03/08(火) 19:04:57.04
24 :
21 :2011/03/08(火) 20:10:08.46
>>22 >>23 すげえええええ
call使えばもう1段階変数が外せるのか
てかcallの処理ってこんな風になってたんだね
まさに目から鱗だ
でも少し見にくいからやはり遅延展開!!の方が見やすいかも・・・
バッチファイルでFizzBuzzをお願い
28 :
デフォルトの名無しさん :2011/03/08(火) 21:35:00.23
バッチでBroken pipeってエラーが大量に出るんですが、これなんでしょうか? 引き渡してるパラメータはログ主力すると、正しく渡されてるようです。
setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=おめでとう for /f %%A in ( 'call echo %%!%o%!%%' ) do call echo %%!%%A!%% endlocal
>>28 windowsでBroken pipeなんて出るの?
まぁ、文字通りパイプが壊れてるんじゃないの?
オプションって言うよりは、入出力関係で不正な操作が起きるんじゃない?
>>29 バッチを読んでみた。
とりあえずバッチファイルを実行してみた、結果が表示された。
もう一度バッチを読み直してみた。
もう君がなにをしているのか訳がわからないよ。
setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=omedetou set omedetou=^^^>^^^>31 説明しても良いが、何故かもう一回展開できてしまって、この理由が全く説明できないから、展開されるタイミングとか勘違いしてるかもしれんが良いか? for /f %%A in ( 'call echo %%%%!%o%!%%%%' ) do call echo %%!%%A!%% endlocal
あれ…? 何か勘違いしてた… 説明できるかもしれんけど、もう少し良く考えてみる
34 :
デフォルトの名無しさん :2011/03/09(水) 07:00:45.31
>>30 windowsででちゃってます。入出力関係が問題ですか。
複数のバッチを同時起動してるのが、まずいのかもしれません。
標準入力とか使い回ししてるのかもしれないですね。
>>34 何か変なコマンド呼んでない?
複数起動禁止でスレッドセーフじゃないコマンドとか、そんなパターンじゃないかと…
UNIXだとbroken pipeは受け側のプロセスが先に終了して、向こう側が 閉じたパイプに書き込もうとしたときのエラー。 Windowsでも同じ状態をいうんじゃないのか?
>>32 %for /f %A in ( 'call echo %%!me!%%' ) do call echo %!%A!%
!for /f %A in ( 'call echo %%de%%' ) do call echo %!%A!%
call echo %%de%%
echo %to%
%A=u
%call echo %!u!%
!call echo %omedetou%
%echo ^>^>31
>>31 for /f %%A in ( 'call echo %%%%%%!%o%!%%%%%%' ) do call echo %%!%%A!%%
%for /f %A in ( 'call echo %%%!me!%%%' ) do call echo %!%A!%
!for /f %A in ( 'call echo %%%de%%%' ) do call echo %!%A!%
call echo %%%de%%%
echo %%to%%
%A=%u%
%call echo %!%u%!%
for /f %%A in ( 'call echo %%%%%%%%!%o%!%%%%%%%%' ) do call echo %%!%%A!%%
%for /f %A in ( 'call echo %%%%!me!%%%%' ) do call echo %!%A!%
%call echo %!%%u%%!%
cmd /c call echo %%de%%
to
cmd /c call echo %%%de%%%
u
38 :
37 :2011/03/09(水) 21:05:17.09
>>37 の結果から推察すると
for /f in ('') のコマンドの処理は単純に cmd /c と同じではなくて
%%→% の処理はされずに %環境変数の展開はされる。
ってことで合ってる?
はぁ?
%%→% はバッチだけだろ cmdの標準入力やコマンドラインは違うだろ
よくそんなんでやってきたな 表面的にしか理解していない証拠
そんなんでだめな証拠をみせろや
>>40 なるほど、コマンドプロンプトで試してみたら
call echo %%de%%
u
call echo %%%de%%%
%u%
となったから
>>37 と一致したよ
バッチではなくコマンドプロンプトでしてる時と同じ処理になるってことなのか。
ありがとう。
>>39 ,
>>41 そんな煽るだけの誰の役にも立たないクソレスしかつけられないなんて
かわいそうな子なんですね。
>>16 今更ながら気づいた。こういうことか
@echo off
setlocal enabledelayedexpansion
set /p mo=あ、そう。打ちたいなら何か打てば?
echo !%mo!
endlocal
exit /b
>>43 んじゃ、このバッチで復習を
setlocal enabledelayedexpansion
set o=me
set me=de
set de=to
set to=u
set u=omedetou
set omedetou=おめでとう
for /f %%A in ( 'call echo %%^^^!%%%%!%o%!%%%%^^^!%%' ) do call echo %%A
endlocal
質問です。 下記のバッチですが、if 文の条件に合わないのに、 なぜか変数 a の値が変わります。なぜでしょうか? @echo off set a="ー" echo BEFORE=%a% if %a%%a% == """""" set a="X" echo AFTER=%a% pause 2行目で変数に "ー" 以外を代入すると、値は変わりません。 "ー" はバッチ変数のダメ文字なんでしょうか?
47 :
46 :2011/03/10(木) 10:27:51.06
>>46 をブラウザからコピペしてバッチファイルを作成したら動作しませんでした。
set a="ー"
の末尾のスペースを削除したら動作しました。
もう、さっぱり分かりません。
エスケープ文字とか確認してみた?
49 :
46 :2011/03/10(木) 11:19:55.02
ありがとうございます! set a="^ー" にしたら正常に動きました。 なぜか末尾に半角スペースはダメなようです。 "ー"以外にもエスケープが必要な文字あるんでしょうかね。 実際は変数に何の文字が入るか分からないので、 全部エスケープすりゃいいのかな。 全角文字はやばいのかも。
どんだけ半角スペース入るのかわからんけど forのdelimsとかtokensとか使ってみたらどう?
" "の中でが^はエスケープにならないけどね
そもそも"がエスケープだからな
53 :
46 :2011/03/10(木) 12:51:26.32
>>50 半角スペース1個ですよ。
IE とかでレスをコピペしたら付くよ。
>>51 、
>>52 普通そうですよね。
では set a="^ー" で正常に動いた理由は?
54 :
46 :2011/03/10(木) 12:55:51.56
というか ^ じゃなくても同じだなw また、分からなくなってきた。
if文ではーと"が同一視されるとか
56 :
46 :2011/03/10(木) 14:19:31.45
"―" でも同じようだ。 if "―""―" == """""" echo 等しい 等しい だめだこりゃ
if aaaaa == a―a―a echo 等しい 等しい "とか^とか全然関係ないじゃん。 要するにif文の比較には駄目文字が存在するって事で。 ーと―は駄目だね。
if aーaーa == aaaaa echo bug
if aab==aーb echo x
バッチを直接使わずに自身を引数にWSHに渡すやり方が便利だ。 だがWSHはWindows 7だとデフォルトでは無効なんだっけか。 PowerShellを覚えなきゃいかんのかなぁ。
同左ってことですね
そうさ
なんでそうなってる? 外人さんにとって、横線は同左なのか?
65 :
sage :2011/03/10(木) 23:16:28.91
telnet通信越しにバッチを実行数と、たまに標準エラー出力に実行したコマンドが、 まるまる表示されるときがあるんですが、これなんですかね? バッチの動作は正しいんですが、気持ち悪いです。
つまり"コピー"が"コピピ"と同等なのかw 迷惑な仕様だな
>>64 この問題とは違う気がする
この事例だと"コピー"は"コピ?"となってーはワイルドカードみたいになるってこと?それか正規表現?
>>58 >>59 見ると正規表現っぽいけど
「同左」文字の一覧
半角カタカナの"ー"も同じっぽいけどね
if ゞ==々 echo ゞ=々 if not "ゞ"=="々" echo "ゞ"≠"々"
あはは
72 :
sage :2011/03/12(土) 12:29:23.18
Linuxでsyncに該当するコマンドってあります?
if あはは==あは々 echo あはは==あは々
75 :
デフォルトの名無しさん :2011/03/13(日) 12:13:23.68
>73 失礼しました。 Linuxでのsyncに該当するコマンドがwindowsであります?です。
ハードウェアの安全な取り外し?
78 :
デフォルトの名無しさん :2011/03/13(日) 21:27:59.41
>>77 まさにこれを探してました。ありがとうございます。
IF文の変数の比較判定は、思わぬ落し穴がある set a="b==c" if not %a%==%a% echo NOT EQUAL !!
どこが? おまえだけw
set a="b==c" if %a%==%a% echo EQUAL !! だけど?
ふーん。環境により変わるのか?
教えてくれ
>>80 の先生
俺は Win2kSP4 だが 何度やっても NOT EQUAL !! って表示されるな 古い cmd.exe のバグかね?
>79 ウチのWinXP(SP3)では何も表示されないな。 ついでに「 echo %a% 」を次の行に追加した場合は「 "b==c" 」と表示された。
今、XPのcmd.exeを拾ってきて試した 変数の展開が微妙に違うなw win2k >if not "b == c"=="b==c" echo NOT EQUAL !! NOT EQUAL !! winXP >if not "b==c" == "b==c" echo NOT EQUAL !!
>2kだと == が "" でエスケープされずに最初の == が比較演算子と認識されてるのかな? >スペースの付き方の違いをみるとそう受けとれる もしそうならあとがコマンドとして実行されてエラーになるだろ?
win2k は "b と c"=="b==c" を 比較して echo してる
win2kのバグ付きcmd.exeで動くバッチw @echo off set b=それは ^^" です。 set c=それは ^^" ではありません。 :x set a= set /p a=文字= if "%a%==%a%" ( echo %b% ) else echo %c% goto x
>>86-88 それなら「c"」までがif文となり、その後の「=="b==c" echo NOT EQUAL !!」
が、実行されてエラーになるんジャマイカ?
「"b == c"=="b==c"」の全体の「"」が外されて not「b」==「c"=="b==c」と解釈してると予想
バグってるソフトが、正常なエラーを出すかよw
>>93 手元に2000無いから分からんが、どう動くの?
文字=z >if "z == z" (echo それは " です。 ) else echo それは " ではありません。 それは " ではありません。 文字=" >if "" == "" (echo それは " です。 ) else echo それは " ではありません。 それは " です。
win2kのcommand.comもバグってるようだ
>>95 その結果だけみるとダブルクォーテーションでエスケープ出来ない感じ?
" は == に対しては何の効果もない。 " が奇数個だとまずい。 " も比較の対象。
2kなんかどうでもいいんだけど
Win2000のユーザはまだ多数いると思うぞ
MSですらサポートやめたOSにまで対応するのは愚かだよ
2kなんかどうでもいいからサポート中のOSだけでも直してほしいな
何を?
>>101 愚かだね。誰もそんな要求してないけど。
ここにそんな事を書いても無駄
どこかに書けば直すとでも?
否。でも無駄には変わりない。
だからなに?
そうですねw
おまえ誰?
\ / \ 丶 i. | / ./ / \ ヽ i. .| / / / \ ヽ i | / / / \ た わ し で す -‐ ー __ __VV >:::::::::::::::::::: < _>':::::::: ::::::::< ,>'::::: ::::::::< >::::::: :::::::::< >;;::::: :::::::< >i::::::::::::::ゞ< 'ヘトハト! ‐- / / ヽ \ / 丶 \ / / / | i, 丶 \ / / / | i, 丶 \
なんか面白いネタを頼む。愚痴は要らん
115 :
デフォルトの名無しさん :2011/03/16(水) 23:32:55.60
標準出力や、標準エラーを初期化する方法ってあります? 初期化って概念が、そもそも無いかもしれないですが。
>標準出力 2>標準エラー
>>115 初期化しないと生ずる不具合を教えてください
具体的にお願いします
追加になります。
で、溜まったまま出てこないの? 便秘かよw
Cでfflush(stdout)するようなもん? 違うか
それ初期化っていうかよ
ファイナライズとか?
closeだっちゃ
他スレから誘導されて参りました。 環境は Windows XP Service Pack 3 です。 sample.batという名のバッチファイルを作って、その挙動を 1.commandstring = "C:\sample_prgm.exe" のようにcommandstringという変数に右辺の文字列を代入する。 (バッチファイル中に直接書きこむ) 2.commandstringが有効なパスであるならば そのパスをコマンドとして(関連付けどおりに)実行させる。 (つまりコマンドプロンプトにcommandstringの中身を打ち込んだのと同じ動作をさせる) というふうにしたいのですが、どう書けばよろしいでしょうか? Pythonで言うなら ####################### import os, os.path commandstring = "C:\sample_prgm.exe" if os.path.exists(commandstring) : os.system(commandstring) ####################### です。 これをbatファイルでやりたいのです。 よろしくお願いいたします。
set commandstring=C:\sample_prgm.exe if exist %commandstring% %commandstring%
この手の方がパスにスペースを含むような使い方をするとはあんまり思わないけど スペースぐらいはケアした方が良いような・・・
クレクレマンにそんなに親切に対応する必要なし。
質問があります お聞きしたいことはバッチファイルで出力されたログを上手く取るコツです 今はこのように非効率だとおもいながらもバッチファイルで標準出力やエラー出力をlog.txtに追加しています (このteeはここではパイプで渡された入力をファイルに追記するために使っています) ( NanikaSuruA.exe 2>&1) | tee -a log.txt ( NanikaSuruB.exe 2>&1) | tee -a log.txt 以下続く ただこの方法ではコマンドごとに記述することが手間と 標準出力を利用したいときにエラーが記録しづらく困っています。 例えば TokubetuNaNanika.exe > output.txt TokubetuNaNanika.exe は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 このようなときにパスが通っていないエラーが記録されていませんでした このときはrun_test.batを作りその中で処理したいbatを呼び出し表示されるものをログに追記するとよさそうに見えますが 一つのバッチファイルのにつき、さらにもう一つのログをとるためのラッパーのためのバッチファイルを用意することになります test.bat | tee -a log.txt もう少しいい方法はないかと質問させていただきました
NanikaSuruA.exe >> log.txt 2>&1 TokubetuNaNanika.exe > output.txt 2>> log.txt
130 :
124 :2011/03/19(土) 14:34:32.99
>>125 ありがとうございます!
>>126 今後スペースが必要となったらその時自分で勉強して手を加えようとおもいます!
ありがとうございました。
>>128 再帰
if defined flag goto main
setlocal
set flag=1
%0 2>&1 | tee -a log.txt
goto :eof
:main
>>128 ラッパー(test.bat)の中身
NanikaSuruA.exe
NanikaSuruB.exe
TokubetuNaNanika.exe > output.txt
ラッパーの実行方法
test.bat 2>&1 | tee -a log.txt
133 :
128 :2011/03/20(日) 15:35:57.84
ありがとうございます!
teeというコマンドを使っていたのはファイルと画面にも表示したいのをさっぱり忘れていました
リダイレクトの方法
>>129 も含めて試してみます
>>129 なるほど、、
自己再帰する手があるのですね
>>132 用意する手間さえどうにかすればラッパーが一番楽そうですね
134 :
デフォルトの名無しさん :2011/03/23(水) 11:49:37.29
start /B "C:\Program Files\R\R-2.11.1-x64\bin\Rgui.exe" %* という内容のバッチファイルを書いて実行すると、期待したどうさに ならずに、コマンドプロンプトのロゴが出てしまいます。 解決策をご教示ください。 よろしくお願いします。
お前が期待している動作ってのは何だよ
start "title" "C:\Program Files\R\R-2.11.1-x64\bin\Rgui.exe" %* /Bなんか使うな必要ないだろ
138 :
デフォルトの名無しさん :2011/03/23(水) 21:33:06.74
>>136 ありがとうございます。startの引数を誤解していました。
そもそもstart使う意味あんの?
バッチが止まるだろw
そんなのイロハだろ?
アロハだよ
>>140 最初/bを使ってた時の問題がロゴが出る事だけだったんなら
止まることは何の問題にもなってなかったんじゃ?
頭悪いの?
>コマンドプロンプトのロゴが出てしまいます。 コマンドプロンプトが出てしまいます。
わからんちゅうのはなにがわからんのかなぜわからのかわからんからなw
日本語に不自由してるみたいだな
んが1つ足りないようだな
うんん
vbsからbatをプロンプト非表示で起動したい しかし このようにお願いします ファイルの場所 rscript\c1.vbs ↑実行ファイル rscript\tool\aw1.bat ↑vbsから実行されるbatファイル
>>151 プロンプトを非表示でbatを実行するためのvbsって微妙にスレチな気も…
c1.vbs
WScript.CreateObject("WScript.Shell").Run "tool\aw1.bat", 0
153 :
デフォルトの名無しさん :2011/03/25(金) 01:41:16.90
キー操作のCTRL+Zを自動入力させたいのですが、set /p input=0x1aとやってもうまくいきません。 どうすればうまくいくかご教授お願い致します。環境はWindowsXP SP3です。
できません
>>153 別プロセスのVBS立ち上げてSendKeys使えばOK
なにがやりたいのか?
>>153 その1バイト分の0x1aをバイナリエディタで入力して
適当なファイル名で保存し、入力リダイレクトに使うってのはどう?
ロジクールSetPoint.exeの再起動をbat or vbsで行いたいです taskkillでプログラムを終了→プログラムを起動 との事ですが全くわかりません…良ければご教示お願い致します
vbsならtaskkill使う必要ないけどね まぁスレ違いだけど
>>159 @echo off
taskkill /im SetPoint.exe
start SetPoint.exe
CTRL+Z はどうした
>>162 ありがとうございます
ですがすいません終了しなかったり終了しても再起動してくれないことが多いですorz
終了の待ち合わせが必要なんじゃね? あいだに sleep 10 か ping -n 10 localhost 入れてみ
>>165 ありがとうございます
ですが言う事聞きません…
再起動の方はディレイかければいけそうです
1/30回しか正常に動作してませんので検証不足ですがorz
@echo off taskkill /im SetPoint.exe ping -n 10 localhost taskkill /f /im SetPoint.exe start SetPoint.exe
timeoutなんていうコマンドの存在をつい最近知った俺… 2000の時からあるなんて知らなかったorz
>>168 ありがとうございます
/f付けとくといけるみたいですがタスクトレイにアイコンが残ってしまいます
強制終了以外に何かいい案ないでしょうか
あと待ち時間は
sleep 10
ping -n 10 localhost
以外にありますか?
waitfor signal /t 10 timeout /t 10
>>171 ありがとうございます
色々ググッたんですがトレイにアイコン残るのは仕様みたいですね
これで使わせてもらいます
ご回答いただいた皆様ありがとうございました
XCOPY V:\ts\*.mp4 "\\nas\contents" /D /M 録画機から自動エンコしたファイルをこのバッチからNASに飛ばすようにしてるんですが どうしても同名ファイルがあるとyes/noで止まったままなんです これをスキップして処理を継続することは出来ないのでしょうか
help見ただけだけど、replace /aかな?
/y スイッチ
/yはスキップせずに上書きしちまうだろ。
yes n とかすりゃいいんじゃねーの
送り先ファイルの存在確認してリネームして送る
yes/noで止まるのをスキップしたいのかと思ったんだが違うのか 古いファイルなんか残してどうすんの
ああ、スキップするって単純に送らないでそのファイルを飛ばすって意味だったんかな? だったら存在確認してリネームじゃなく単純に送らないだけだが。 ts\*.mp4って送り先からてっきり色々パラメータ変えてエンコした結果で 同名ファイルがあるものだと思ってたわ。 上書きしちゃ比較にならんからその線も除外してた。
robocopyは?
>>181 ここはそういう板じゃねーんだよ。ソフト板で頑張りな。
>>173-180 情報不足ですいません
>>180 さんの言う通り
受け側の同名ファイルの中身は別物ですので、送り側のファイルに置き換わってしまっては困ります
そこはスキップして後々手動でリネームする予定でした
ですので
bat実行
A.mp4←コピー済み
B.mp4←コピー済み
C.mp4(このファイルは転送先に既に同名ファイルが存在する、中身は別) 上書きyes/no選択肢が出て止まったまま
D.mp4←このファイルはまだコピーされていない
E.mp4←このファイルはまだコピーされていない
このC.mp4の判断をスキップしたいのです
調べ限りバッチではどう記述していいかわかりませんでした
リネームしてからコピーしたほうが楽じゃね?
コピー前に xcopy source destination /d /a /u /l > list.txt でリネーム対称ファイル名を取得して for /f 文でリネームするとか。
copyhereなら勝手に(n)付けてくれる
自動エンコなら公衆便所掃ジャーだな
>>185 それ、/y スイッチを追加しないと途中で止まる
コピー元の同名ファイルは、A属性を一時的にクリアすればコピーされない
rsyncつかえ
どっちにしろ自分でファイル名を変えなくちゃならん あとは copy でも何でもいいだろ
rsyncやcopyhereなら勝手に変えてくれるだろがw
>>190 =192
社会経験ゼロの厨房がw
そんな物が使えれば誰も苦労せんわ、馬鹿が。
それでいいならな 似たような名前でわかりにくくなるだろ 結局、自分で変更することになるんじゃ?
そんな物も使えん馬鹿が苦労してるわ。
俺は
>>193 じゃない。
質問者が使えるかどうかは知らん。
公衆便所掃ジャーがよっぽど使える
なんか使いたくないソフト名だなw
>>196 使うことを禁じられてんだよ
まともな会社で働いてから物言え糞ニート
原発の作業員並みの環境だな ヘリコプターで水かけてたのはいったい何だったんだろう 馬鹿の指示で動く兵隊は大変だな
お前みたいな馬鹿がいるから禁止してんだろw 会社も大変だなw
こういう社畜根性のバカばっかだから世の中がいつまでたってもまともになんないんだよな
>>183 コピー先に日付のディレクトリ作って、そこにコピーすれば良いじゃん
つまらんから次どうぞ
何でこのスレが常時伸びてるのか意味不明なんですが?
つまらんから次どうぞ
>>183 だから単純に
for /f "delims=" %%i in ('dir /b/aa V:\ts\*.mp4') do if not exist "\\nas\contents\%%~nxi" xcopy "%%~i" "\\nas\contents\%%~nxi" /M
こんなんでいいだろ。
俺だったら同名存在したら連番なり日付なり追加リネームしてコピーってのも
バッチ内でやると思うけど。
dir使って不要なループを避けるならxcopyのコピー対象外(/h無し)の 隠し属性とシステム属性も除外して'dir /b/aa-h-s V:\ts\*.mp4'だな 逆にxcopyのオプションだけで対応するのなら、forの拡張機能は使わないな
もう質問者は見ていないだろw
>>210 転送元がmp4な時点でシステム属性とか隠し属性なんて無いと思うけどw
>>212 録画のシステムが糞なら録画中のファイルがmp4で隠し属性になる可能性あり
それはコピーしなくていいのか?
もう質問者の中学生は見ていないだろw
会社で何してんだ?
バッチファイルをダブルクリックすると黒いウィンドウが開くんですがなんとかなりませんか?
218 :
デフォルトの名無しさん :2011/03/29(火) 18:08:10.99
color f0
batファイルのショーカットで起動 起動時の設定は最小化
問題は黒いではなくウィンドウが開くなんです
ショートカットだったw
個々にショートカットを作る以外の方法でお願いします
batファイルをexeに変換できるツールがどこかにあったような…
個々にexeを作る以外の方法でお願いします
関連付けのopenを cmd.exe /c start /b "%1" に変えればよくね?
よくねえ
start /b "" "%1" かな?
start /min "" "%1" かな?
/B 新しいウィンドウを作成せずにアプリケーションを起動します。 なのに変だね
どっちにしろ黒いのがチラッと…
>>228 よくねえ
ちったぁ試してから言えよ
役立たずばっか
試すわけないだろw 質問者が試せよw
試さなくたって分かるが?
だったら正解は?
cmd.exe /c start /min cmd.exe /c "%1" だよ
WScript.CreateObject("WScript.Shell").Run """" & WScript.Arguments.Item(0) & """", 0 だな
それも言うなら mshta.exe vbscript:close(CreateObject("WScript.Shell").Run("""%1""",0)) だな
ウィンドウは出したいけどアクティブにしないでっていうのは?
>>236 は batファイルにD&Dが効かなくなるな
すまんな、試してないんで
>>240 mshta.exe vbscript:close(CreateObject("WScript.Shell").Run("cmd.exe /c ""%1""",0))
ただし
>>241 >>241 cmd.exe /c start /min cmd.exe /c "%1" %*
ただし
>>240 外部ファイルを作れば別だが、どっちもと言うわけにはいかんな
保存する場所と名前は適当に変えてくれ WScript C:\callbat.vbs %* -- C:\callbat.vbs -- strCmd = "cmd.exe /c" For i=0 To WScript.Arguments.Length - 1 strBuf = WScript.Arguments.Item(i) If InStr( 1, strBuf, " ", 1 ) = 0 Then strCmd = strCmd + " " + strBuf Else strCmd = strCmd + " " + """" + strBuf + """" End If Next WScript.CreateObject("WScript.Shell").Run strCmd, 0
それより cmd.exe /c のショートカット作って c:\hoge.lnk "%1" %* でいいんじゃね
それ以前にもう .bat なんか捨てろ!!!!捨てろ!!!! もういいだろっ… こんな…ゲイツの気まぐれにっ…!!!! いっぱい!!!!いっぱい(SEが)死んだんだぞ!!!!
246 :
244 :2011/03/31(木) 02:42:04.35
ちなみに、ダブルクォーテーションエスケープでの %1 は 「何が起こっても不思議じゃない」 という覚悟でもなければもう書けない。 …マジで…ゲイツ氏ね…
コマンド プロンプトのデフォのウインドウ位置を弄れ。 ぎりぎり外へ押しやれば起動しても見えなくなるぞw
タスクバーに出るのもアウトらしいからw
ウイルスでも作りたいのかw
>>183 コピー先のリストをdirとかで取って/EXCLUDEに指定すればどうかな?
作業フォルダにxcopyして、そこからreplace /aでターゲットに
1582年6月13日
質問です。 下のバッチで、1個目と2個目の echo の表示が ユニコード文字があると化けるんだけど 仕様なの? for /f %%i in ('dir /b') do ( echo "%%i" echo "%%~i" echo "%%~nxi" )
ユニコード文字って何? 大概の文字はユニコードだけど?
シフトJISにない文字のことじゃね?
だったら仕様だな
for %%i in (*) do ( echo "%%i" echo "%%~i" echo "%%~nxi" ) なら化けんよ
ありがとうございます。やっぱ仕様ですか。 ユニコード特有の文字のことでした。
>ユニコード特有の文字のことでした。 だから意味不明だと言っとるだろがぼけ
うるせハゲ
だまれデブ
禿げてないけどぼけ
デブでないけどぼけ
ユニコード特有の文字って何だよぼけ
ぐぐれカス
カスらっくだぼけ
UNCパス上のバッチファイル実行するとサポートしてない云々のメッセージが出るけど、 これってカレントが強制的に%WINDIR%にされてるのかね? > nul で抑制できないけど、取り合えずバッチは動いてるみたい 支障が出る or 出そうな状況ってありますか?
>>267 確かに。だが、ボケはユニコード制御文字のことを言ってるのか?
>>270 相対パス使ってると支障でるんじゃね?
取り合えずUNC使う時はpushdとpopd使うようにしてる。
273 :
270 :2011/04/02(土) 03:00:19.58
>>272 なるほど<相対パス
今pushd/popdで試してみたら、やっぱ起動時のカレントは
C:\Windowsになってた@Win7
バッチ内で何かの実行ファイルをキックするような内容程度なら、
全部絶対パスで渡してやれば特に問題ないのかな
cmd /a
cmd /u で実行しても化けるよボケ
277 :
デフォルトの名無しさん :2011/04/02(土) 08:09:08.88
丂丄丅丌丒丟丣两丫丮丯
上みたいな字が混じってると
>>209 みたいなのが誤動作する可能性があるんだよボケ
文字コードの話になると、すぐ
>>256 みたいなガキが出てくるのなw
>>281 拘ってるのは、知識もスキルもない窓際管理職と掃き溜め管理部門だけ
>>276 cmd /u で実行したら化けないとは言ってないよボケ
/aと/uは出力を変えるだけだボケ
入力はa固定だボケ
(厨)皆いい年こいたおっさんです
いい年こいてるからボケてるんだよボケ
若年性もあるよボケ
あほぼけかすもユニコード特有の文字か?ボケ
何言ってるか分からんよボケ
290 :
デフォルトの名無しさん :2011/04/03(日) 18:14:08.41
C:\test.batというバッチファイルがあります。 『バッチファイルの内容』 ----------------ここから myprogram %1 ----------------ここまで myprogramというのは自作のプログラムです。」 このプログラムに引数を渡したいのですが、引数が「aaa bbb ccc」というふうに3つのキーワードを入れると、バッチファイルではaaaしか認識しません。 myprogram %1 %2 %3と書くことで取得できるのですが、引数に入れるキーワードの数は2個以上でいつも不規則な数になってます。 myprogram "%1"と書いても取得できませんでした どのようにして%1のみで全てを取得する事ができますでしょうか?
>290 "%~f1" でOK。(ただしWindows95/98/Meでは不可)
%*でいいんじゃね
>>291 ありがとうございます;;大変助かりました
そんなわけねーよ
何でそんなわけねーんだよ?
指定した文字から、指定した文字までを削除するバッチってどうやるんでしょうか? ai-1234_ueo.text 変換後 aiueo.text
「-1234_」を抜くって意味なら set a=ai-1234_ueo.text echo %a:-1234_=% 「-」〜「_」までなら set a=ai-1234_ueo.text set b=%a:*-=% call echo %%a:-%b%=%%%%a:*_=%%
ありがとうございます。
調べ方が悪いと思うんですが、解説サイトを見つけれ無かったので教えてください。 .batを並列で動かそうとしています。 例えば、 body.bat rem 動かない start “c:\a.bat“ start “c:\b.bat“ 上記なら動かない 下記なら動く body.bat rem 動く start ““ “c:\a.bat“ start ““ “c:\b.bat“ startの後のダブルクォーテーションが必要な理由を教えていただきたいです。 メンドクサイようでしたら、解説サイトを教えて頂けませんか。 宜しくお願いします。
こういうコマンドの使い方も知らずに適当な事やるやつってなんなんだろうね。
すぐに見つかったけど START ["タイトル"] [/Dパス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/WAIT] [/B] [コマンド/プログラム] [パラメータ] タイトルは省略可能。ただし、プログラム名が空白を含む等で " " で囲まなければならない場合、 start "C:\Program Files\prog1\prog1.exe" と書くと、これがタイトルとみなさる。
それじゃだめだとちょっと前に言ったばっかりだろ
>301-303さん 返事が遅くなりました。すいません、ありがとうございます。 start /? すいません、初歩でした。 上記を確認後に改めて、中身を確認すると、 a.batは、自作でtitleは書いていない。 b.batは、他人が書いたバッチでtitleを書いていました。 b.batは、タイトル書いているのに、 body.bat start ““ “c:/b.bat“ と書かないと動きませんでした。 この時のウインドウのタイトルを確認し忘れました。 ウインドウのタイトルがどうなってるのかは、明日、確認します。 start で設定するタイトル ““ とバッチ内で設定するtitleは、設定が違うのでしょうか? 相次ぐ質問で、申し訳御座いません。 お返事は、早くとも明日のこのぐらい時間か、明後日の朝になりますが、お付き合いお願いします。
壁に激突してください。
本当、一度死んだ方がいいよな。 タイトルそのものは全然関係無いってのに。
ひたすら丁寧口調で、自分の望む解凍を得るまで粘る、ってのがここ数年多いよね 気に入らない回答には罵倒して煽る、みたいなのがたくさんいた昔の方が 健全だったように思える
>お付き合いお願いします。 お断りします。
検索で何となくたどり着き、Q&Aサイトか何かと勘違いしてるんだろう。 ここが何なのかも分からずに。
>>301-303 こういうコマンドの使い方も知らずに適当な事やるやつってなんなんだろうね。
>>305 ["タイトル"] [コマンド/プログラム]
は位置パラメタなんだよ
FreeDOS暦10年の俺からすると温い質問ばっかりで飽き飽きするぜ
>>314 | 釣れまっか? ,
\ ,/ヽ
 ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,/ ヽ
∧_∧ ∧∧ ,/ ヽ
( ´∀`) (゚Д゚,,),/ ヽ
( ) (| つ@ ヽ
| | | ___ 〜| | ヽ
(__)_) |――|. ∪∪ ヽ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ヽ
/⌒\/⌒\/⌒\/⌒\|彡~゚ ゜~ ~。゜ ~ ~ ~ ~~ ~ ~~ ~ ~~ ~~ ~~
⌒\/⌒\/⌒\/⌒\/⌒\彡 〜 〜〜 〜〜 〜〜 〜 〜
ぼちぼちでんな
set /pで記号入力させて処理するの書いてるんだが %と&でバグるのはやっぱ防げないかね
状況が不明だけどこういう違い? @echo off cls set /p asdgf= echo echo %asdgf% echo %asdgf% echo echo "%asdgf%" echo "%asdgf%" @echo on set asdgf=%asdgf:&=^^^&% @echo off echo echo %asdgf% echo %asdgf% echo echo "%asdgf%" echo "%asdgf%"
ちょっと違った ファイル名に%や&が入ってるときに それを取り込もうとしてエラー出てた。
@echo off for /F "delims=" %%f in ('dir /b *.txt') do call :main "%%f" goto :EOF :main set fname=%~n1 echo %fname% 取り込みファイル名:%abc.txx 結果:abc
start "タイトル" "コマンド/プログラム" でタイトル変えない方法ないの?
だからお前は壁に激突しろと
カレントディレクトリが表示されるだけだし start "%cd%"とかでいいんじゃねーの
%abc.txx
@echo off setlocal enabledelayedexpansion for /F "delims=" %%f in ('dir /b *.txt') do call :main "%%f" goto :EOF :main set fname=%~n1 echo !fname! endlocal これでもだめだった。 for do~のあとにset fnameとやればできるんだが do callで遅延展開でできないのは謎
んなこたぁ分かってるんだよ ちゃんと訂正しなよレス欲しいんなら @echo off setlocal enabledelayedexpansion for /F "delims=" %%f in ('dir /b *.txt') do ( set "a=%%f" set "a=!a:%%=%%%%!" call :main "!a!" ) pause endlocal goto :EOF :main set "fname=%~n1" echo "!fname!"
ちなみに上の奴は ! の対策してないから a!b!c.txt とかが ac になったり
@echo off
for /f "delims=" %%f in ('dir /b *.txt') do set "a=%%f" & call :b
pause & exit
:b
setlocal enabledelayedexpansion
set "a=!a:%%=%%%%!"
endlocal & call :main "%a%"
goto :eof
:main
set "fname=%~n1"
echo "%fname%"
"!" に対応したところで完全じゃない(
>>278 とか)
^も^^になるな
やりたくないな そこまでしてなにがしたいんだか
337 :
デフォルトの名無しさん :2011/04/08(金) 00:27:12.19
>>335 はmain側で対応するしかなさそう
echo "%fname:^^=^%"
DOSでchcp 65001とutf-8で表示できるのですが、毎回入力するのが面倒なのでbatファイルにしたいのですが フォルダの位置はc:\code\2011\にしたいので chcp 65001 cd c:\code\2011\ と書いてbatファイルにしたのですが画面が表示されてすぐきえてしまいます どのようにしたら普通にDOSを立ち上げたときの状態に上のコマンドを実行した状態にできるのでしょうか?
@echo off cd c:\code\2011\ cmd /k chcp 65001
cmd /k chcp 65001 のショートカットにすればよい
ありがとうございます 使わせていただきます
バッチファイルに放り込まれたファイルの パスを拡張子だけ抜いて指定場所に書き込みたいのですが、 \の処理がうまくいきません どう記述するのが正しいのでしょうか? perl -Mencoding=cp932 -pe s/"Filedpn"/"%~d1\%~p1\%~n1"/ template.avs > "%~n1.avs"
バッチの問題じゃない。perlが`\'を解釈している。
>>345 おおう・・・ 実はperlのスレから誘導されてきたんです
どうしたものか・・・
お前、脳みそ無いの? \ → \\
すれ違い
>>344 単純に"Filedpn" → "%~d1%~p1%~n1" なら、
"s/\"Filedpn\"/\"%%~d1%%~p1%%~n1\"/"
streamの有無の判定は? if exist file:stream (echo Y) else echo N うまく行かん
■a.bat file=sample_2011_04_01.txt ■b.bat a.batに変数fileにファイル名を格納した場合 b.batでa.batの変数を利用するにはb.batでどのように書くのでしょうか?
call a.bat echo %file%
353 :
デフォルトの名無しさん :2011/04/16(土) 22:28:42.25
コマンドプロンプトで実行するとコマンドプロンプトに文字列を出力するプログラムがあります ファイル名を指定して実行で cmd /k test.exe としたのですが、batファイルにpauseを書いたようにしてプログラムの出力が終わったらキーボードをワンプッシュでコマンドプロンプトを閉じたいのですが無理でしょうか? batファイルでないとできませんでしょうか?
cmd /k test.exe&pause
cmd /c test.exe & pause
cmd /k test.exe & pause & exit
357 :
デフォルトの名無しさん :2011/04/16(土) 23:27:57.43
完璧です!ありがとうございます!
if exist 357 (echo さようなら) else (echo もういなくね?)
359 :
デフォルトの名無しさん :2011/04/17(日) 04:29:54.78
すみません、動画エンコードソフトの「HandBreak」のコマンドライン実行で、
以下のサイトのバッチを、サブフォルダ以下にも再帰的に実行させることはできますか?
http://bluemoonjp.blog96.fc2.com/blog-entry-22.html 出力先のフォルダに、ソースフォルダのディレクトリ構造を再現し、エンコードをおこないたいです。
(出力先の指定ディレクトリが存在しない場合は、HandBreak側で生成されます)
できれば、出力先フォルダでのファイル有無を見て、存在する場合はパスしたいです。
バッチファイルでそこまでって無理でしょうか。
>>359 出来なくはないけどperlとかpython使った方が楽じゃね?
`dir /s /b /a:d`取り込めばいいんじゃねーの
Haskell推奨
364 :
デフォルトの名無しさん :2011/04/17(日) 16:14:58.67
ファイル名を指定して実行でcmd /k d:でDドライブに移動できますが D:\2010\test\に移動したいのですが cmd /k d: cd 2010\testとやってもD:\のままになってしまいます 無理でしょうか?
cd /?
>>364 出来なくはないけどperlとかpython使った方が楽じゃね
cd /d
pushd
369 :
デフォルトの名無しさん :2011/04/17(日) 20:57:56.96
プロンプトを立ち上げた状態で cd /dは効くのですが ファイル名を指定して実行でcmd /k d: cd /d 2010\testとやってもD:\のままになります 使い方が間違ってるのでしょうか?
cmd /k d: && 2010\test
>>369 d: cd /d …
これで一つのコマンドだろ。そんなコマンド無いから
本来エラーで何も起きなくてもおかしくないが
偶然、d: の後が無視される仕様だからだけ動いてただけ。
ありがとうございます
どういたしまして
ちょっとした疑問なのですが%~dp0や%~dpn0などの特殊な変数?はどこかにドキュメントはないものでしょうか? helpコマンドを見てみましたが見つかりませんでした %~0で引数の0番目(ここではバッチファイル名)、dはドライブ、pはディレクトリ、nはファイル名という部分的なパスを取得するというのは実行結果からわかるのですが、 こういったことが書いてあるヘルプはないものかと思いまして
forコマンドのヘルプに載ってるよ
call/?だろ
ありがとうございます
どういたしまして
明示的に環境引数の変化を受け継ぎたい時以外は call foo.bat より start /wait cmd.exe /c foo.bat の方が影響受けづらくていいな。exit で親まで巻き添えにされたりすることもないし。
setlocal if "%a"=="a" (call :temp_a) else (call :temp_b) goto eof :temp_a echo a exit /b :temp_b echo_b exit /b :eof endlocal
そういうのをうだうだやらなくて済むって話
set aa=aa start /wait cmd.exe /c foo.bat aa echo %aa% -foo.bat echo %* echo %aa% set aa=bb
>>379 惜しいな
cmd.exe /c foo.bat
でいいよ
>>380 関係無いけど goto :eof と goto eof 使い分けるのは初心者イジメだなw
>384
関係あるよ
>>380 は単なる初心者だろ
goto :eofを知らない だからexit/bを使う
endlocalは不要を知らない
eofがどうとか言う以前に突っ込み所多すぎだろ。 動かないバッチ前にして何をグダグダやってんだか。
endlocalは不要を知らない endlocalは不要を知らない endlocalは不要を知らない
何をグダグダやってんだか。 何をグダグダやってんだか。 何をグダグダやってんだか。
392 :
デフォルトの名無しさん :2011/04/26(火) 19:33:02.70
フォルダにあるファイルの名前から数字とそれ以外を抜き出して、 違う名前にリネームしていきたいのですが、 g001hoge → "g" "001" "hoge" に分離 → "ghoge001" を生成 g002hoge → "g" "002" "hoge" に分離 → "ghoge002" を生成 g003hoge → "g" "003" "hoge" に分離 → "ghoge003" を生成 どう書けばよいでしょうか?
set/?
ヒントじゃなく答えを欲しがる人にはバッチや sed 系の何かより、 むしろ Flexible Renamer を勧めたい。
batファイルでxmlを操作するのって不可能ですか? <top> <tax>1.05</tax> <item name="たまご" price="250"> </top>
xslプロセッサかe4x使えよ。
どうやるんdすか?
毎日サーバからzipをダウンロードするのですがzipの中で特定の拡張子のファイルのみをbatファイルで一発で展開したいと思います 7Zipを使ってます これをbatファイルに保存して実行するとtest.zipの拡張子txtのファイルを全て展開します これを1回のコマンドでtxtだけでなくpdfもにも対応するにはどのように書いたらよいのでしょうか? C:\7-Zip\7z.exe e test.zip -oC:\hozon .txt -r .(txt|pdf)みたいに書ければよいのですが・・・
>>399 2回実行するか
マニュアルよくよんでみるか
どうしても1回って意味不明な縛りがよくわかんね
2回に分けると2度zipにアクセスするのが無駄なので1回でtxtとpdfファイルを取り出したいのです マニュアルには複数拡張子は書いてないので出来ませんよね
そもそも特に拡張子のことなんて書いてないだろ それっぽいのを拡張子だと判断するのは勝手だが。 拡張子という言葉を頭から削除してマニュアルもっと見ろ
>2回に分けると2度zipにアクセスするのが無駄なので そこまで考えるほうが無駄だろ?下手の考え休むに似たりってなw
C:\7-Zip\7z.exe e test.zip -oC:\hozon .txt -rのところの.txtに正規表現で*.(txt|pdf)も指定できれば良いのですよ
と思ったら解決できました
それはそれはよろしいですね! では、よろしく!
どうでもいいが *.(txt|pdf) というのは正規表現じゃないと思うのだが…
ワイルドカードでもない
だが言いたいことは分かる
じゃあ、読んで字の如く、ワイルド表現ちうことで
バッチファイルの中からMSのsdkに付属のbin\setenv.cmdを呼び出して、環境変数を設定しようと call "c:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\SetEnv.cmd" /Release /xp と書いたらsetenv.cmdの中に SET Path=%VCTools%;%VSTools%;%SdkTools%;%FxTools%;!Path! などと書かれていて、最後の!Path!(オリジナルのPATHでなく)がそのまま残ってしまいます。 !が%と見なされるような呪文があるのでしょうか?
> !が%と見なされるような呪文があるのでしょうか? そういう呪文、ありますなぁ…
せっとろうかるでぃせいぶるでぃれいどいくすぱんしょん
EnableDelayedExpansion って書いて欲しいなあ、とよく思う… 大文字だけとか小文字だけだと読みにくいw
そもそもつなげて書くのが間違い。 ちゃんとスペース空けろ!
417 :
デフォルトの名無しさん :2011/05/08(日) 16:07:11.53
C:\test\2010\の中にsample_xxx.zipというファイルがあります このこのファイル名のxxxのx部分には数字と . 半角英字が入ります この規則のファイルはフォルダの中に1つしか存在しません このファイル名を取得して変数に入れる方法はございませんでしょうか? 想定するファイル名 sample_1.0.5.zip sample_1.12.3.zip sample_2.0.zip sample_2.0b1.zip
418 :
デフォルトの名無しさん :2011/05/08(日) 16:14:43.80
set dir = dir sample_*.zip echo %dir% で取れるのかなと思ったのですが無理でした
for %f in (sample_*.zip) do set dir=%f
$dir = dir sample_*.zip echo $dir
batファイルでゲームって作れるの?まあ作ってる人いないだろうけど
>>423 batにスクリプト言語埋め込んで、ならやったことあるが
バッチファイルの標準添付コマンドのみで
埋め込みJSとかも禁止、とかになると流石にやる気しないw
…あ、でも数当てゲームぐらいなら作ったことあるような気もする これをゲームの内に入れても良いなら「ある」ことになるかなw
ディレクトリの存在確認で if exist c:\tmp\nul ... というテクニックがありますが、名前に空白を含むディレクトリの確認をしようと ダブルクォートでくくったら正しく動きませんでした。 調べてみるとc:\tmpというディレクトリが存在するとき 1 if exist c:\tmp 2 if exist c:\tmp\nul 3 if exist "c:\tmp' 4 if exist "c:\tmp\nul" で4だけifが成立しません。今回はcd出来ることで確認したけれど、後学の ためにif existで正しくディレクトリの存在確認をする記法を教えてください。 OSはXpSP3です。
"c:\tmp\"
>>427 でOKでした。NTFSなので
>>428-429 によるとできるはずなのにバグですかね。
でも、ファイルシステムの違いで出来ない場合もあるんですね。まんどうだなあ。
姑息な手段でなくまともな方法でやれ
そういうなら、まともな方法を答えろ。
属性見ろよ
だからその方法だよ。ここがバッチスレだと知ってるんだろうな。 GetFileAttributesとか寝言いうんじゃねーぞ。
おれは知ってるが、おまえは%~aIを知らねーの?
>>436 寝言言ってないでfor/?くらい読めよな
for? どれどれ… forを指摘するならむしろ/dだろ。 for /d ("ディレクトリ") do found=%d 属性なんか取得する必要ない。取得しても属性文字列を姑息な方法で検査しなきゃならないし。w
おっと、抜けてた for /d %d in ("ディレクトリ") do found=%d
setが抜けてるくらいで、詰まらねー突っ込み入れてんじゃねーよ。 ところで、属性文字列の姑息じゃない確認方法ってあるのか? w
>>444 コピペしなかったが、動作確認はしてるぞ。
寝言言ってないで、属性文字列の姑息じゃない検査法答えろよ。
>>445 for /d %d in ("ファイル") do echo ファイルがディレクトリだってー?
うん、そこまでの対応法は考えてある。w set dir=%~1 for /d %%d in ("%dir%*") do if "%dir%" == "%%~d" set found="%%~d" 姑息じゃない、属性文字列の確認方法はどうしたんだよ。
for /f "delims=-" %%i in (`echo "%~a1"`) do if %i == d set found="%~1" こうか? 十分に姑息だろう。w
おまえが姑息なんだろ 普通の頭持ってりゃもっとスマートに書けるわ もっとfor/?読み込めよ
echoいらない ifいらない delimsいらない
スマートっていうのの見本を示してみろよ。自信ないのか? w
ここまで教えてやったのに無礼なやつ そんなやつには教えてやらんよp
別に良いよ。属性を文字列で取り出すという時点で筋悪すぎだから。
そりゃよかった おまえの頭の筋悪すぎだからなw
酸っぱい葡萄みたいw
ディレクトリであるかいなかの2値に対して、多値になる文字列を取得し、 それを解析するから、筋が悪いのである。
もう少し、わかりやすい例を挙げよう。 UNIXでは"ls -ld ディレクトリ"の出力を解析するバカは居ない。test -dで真偽が判定出来るからだ。 ディレクトリ以外の属性情報を含む文字列を取得し、解析する方法は筋が悪いのである。
おまえの頭ではGetFileAttributesも筋が悪そうだな
IsDirectoryがあったら、わざわざGetFileAttributes呼ぶか? 真偽で返してくれる手段が存在するのに、多値の方を選ぶのは筋が悪い。
IsDirectoryがある?ほほう、あるなら示してもらおうじゃないか? if exist folder\か? if exist folder\*か?
一部の条件でたまたま動く方法を使うのはとても筋がいいなぁー
必死になって何でもかんでもbatで解決する意味あんの?
てめー俺のバッチdisってんのか
たまたま動く方法で問題あるなら最初からbatなんか使わないだろ
466 :
デフォルトの名無しさん :2011/05/14(土) 08:23:37.03
>>461 2値の結果を得る方法は既に出した。多値の属性を文字列で取り出して判定するような
筋の悪い方法にしがみつくバカには見えないらしい。w
>>462 「一部の条件でたまたま動く」ではなく、「仕様(ヘルプ)に書かれている通りに動く」
なので全然問題ない。
バッチで解決しようとしてること自体が筋悪だって……
筋悪なバッチで筋悪な多値の方法を使うのは、筋悪の二乗。w
ちゃんとしたプログラム作るまでもなかったり、 プログラム作るまでの間に合わせぐらいの用途だろ
ある程度簡単なスクリプトはバッチでいい。数行で済むし 複雑にグチャグチャなスクリプトはWSHでいい
環境変数設定したりとかバッチじゃなきゃできないのがある。
環境変数セットするだけならバッチでも良いだろうが、その他ごちゃごちゃと処理するんだったらWSHとかEXE作ったりで良いじゃない。 バッチじゃないとダメだなんて特殊状況はそうそう無いし。 まぁ、バッチに縛られたい趣味でもあるなら、仕事に持ち込まれない限りは止めないけど……
どんな言い訳付けても属性文字列で判定するのは筋悪。
>>466 if exist "c:\System Volume Information\*" echo これか?
477 :
デフォルトの名無しさん :2011/05/14(土) 18:27:50.63
その点トッポってすげぇよな、最後までチョコたっぷりだもん。
どういうことだよw
ポッキーさんをdisってるの?
>>466 >「仕様(ヘルプ)に書かれている通りに動く」
読解能力も欠如してんのか?
リダイレクトで適当なファイルに書き出しをするのに、文字コードを指定するのはどうすればいいでしょうか? 例えば基本中の基本、echo aa > a.txtみたいなのでいいのでsjisでなくutf8で書き出したいのですが… 調べてchcp 65001とかやっても、あくまで切り替わるのは表示で、 リダイレクトには効果無いみたいなんですが、皆さんの環境だとどうなってます?
切り替わるが?
>>483 すいません、やりたい最終形はActivePerlを入力としてのファイルへのリダイレクトなんです。
chcp 65001
perl test.pl > output.txt
ってだけの。
ってあれ、バッチで実行したら最後に追記したpauseが効かない…
ひょっとしてperl読み込んだ時点で何か乗っ取られる的な事になってる?
そういうことってあるんでしょうか?
>>484 そりゃ test.pl が utf8 吐かないとだめだろ。
perlがcpを見てるなら出るだろ chcp 65001 & perl test.pl > output.txt & pause ってやってみそ
コマンドプロンプトからecho 100*5みたいに計算することってできないのでしょうか? やってみたのですが答えじゃなくて式がそのまま出力されました
set /a x = 100 * 5
set /a 100*5
490 :
デフォルトの名無しさん :2011/05/15(日) 10:32:20.54
>>485 >>486 アドバイスありがとうございます、どうも一朝一夕には無理っぽいので諦めて逐一コード変換通すことにします。
というか何かマイマシンの仕様やら何やらが複雑に絡み合ってて原因究明に時間掛かるっぽいので…
>>491 やっつけでいいなら
perl test.pl | nkf -w8 > output.txt
とかでいいと思う。
もちろん nkf のインストールが必要だが。
あと、この手の話に「マシンの仕様」が絡むことはほとんどないし、
原因ははっきりしてるように思うけど...。
0:00〜23:59までの時間をランダムに表示したいのですが方法ないですか?
>>493 set/?
%RANDOM% - 0 から 32767 の間の任意の 10 進数に展開します
%RANDOM%で0〜23と0〜59までの値を生成できるんですか?
あほですか?
>>493 > 0:00〜23:59までの時間をランダムに表示したいのですが方法ないですか?
setlocal enabledelayedexpansion
:loop
set /a M = %RANDOM% / 22
if 1440 leq %M% goto loop
set /a HH = %M% / 60
set /a MM = %M% %% 60
echo %HH%:%MM%
endlocal
1:2 を 01:02 みたく出す方法は思いつかなかった。
set n=2 set /a n=1000+n echo %n:~-2%
>>498 ある数値mからn以下の数値を求めるには剰余を使うのが一般的
set /a h=100 + %random% % 24
set /a m=100 + %random% % 60
echo %h:~-2%:%m:~-2%
それだと32767が24や60の倍数でないから偏りが出るだろ set /a h=100 + random * 24 / 32768 set /a m=100 + random * 60 / 32768 echo %h:~-2%:%m:~-2% /aでは%はいらない
32767が→32768が
>>501 > /aでは%はいらない
一度位試してから書け
if defined random set random
あーれー
>>494 自信満々で「属性嫁」とかいう筋の悪い回答出した、てめーの事だよ。
ケンカはやめて(><)
>>506 仕様上の保証が全くない、たまたま動作に依存することのどこがよい筋なんだ?
510 :
デフォルトの名無しさん :2011/05/15(日) 22:53:28.74
>>509 仕様(ヘルプ)すら読めない池沼は引っ込んでろ。
どれどれ?
EXIST ファイル名 指定したファイル名が存在するときに条件が真になるように 指定します。
513 :
デフォルトの名無しさん :2011/05/15(日) 23:05:48.28
>>509 ところで、自信満々の属性文字列なんだが、「ディレクトリの場合はdが先頭になる」
というのはどこかに書いてあるのか? for /?には書いてないぞ。まさか、
> 仕様上の保証が全くない、たまたま動作に依存することのどこがよい筋なんだ?
じゃないよなあ。 www
どれどれ?
516 :
デフォルトの名無しさん :2011/05/16(月) 00:17:51.73
>>515 あれ、聞いてはいけない事聞いちゃった? 検証方法も秘密。ドキュメントも秘密。
やっぱ、属性文字列取り出すのは↓なんだね。www
> 仕様上の保証が全くない、たまたま動作に依存することのどこがよい筋なんだ?
>>516 はいはい
「コマンドの出力をスクリプトに取り込んで処理するなんてスクリプトとして筋悪です」
これでいい?
「自分の筋悪に気づかずにブーメラン投げてしまいました」は?
but the null (NUL) device does exist in every directory. As a result, you can test for the null device to determine whether a directory exists.
521 :
デフォルトの名無しさん :2011/05/16(月) 01:48:04.92
そんな周回遅れのドキュメント引っ張ってきて、何が言いたいのだ?
net start サービス名 exit これでサービスが立ち上がったときに自動的にコマンドプロンプトを閉じてるのですが もしサービス開始するときにエラーがあったらコマンドプロンプトを閉じたくないのですが エラーがないときはexitでそのまま終了させて、エラーがあればそのまま表示しておく方法ってございませんか?
試してないけど net start サービス名 && exit /b || echo error&pause でいけるかもしれない
net系はerrorlevel返さないじゃないかな エラーメッセージで判定するとなると筋悪とか言うあほがいるから気をつけたほうがいいよ
527 :
デフォルトの名無しさん :2011/05/16(月) 13:06:40.05
よっぽど悔しかったんだな。 「属性嫁」って颯爽と登場したところまでは良かったけど、具体的な方法も示せずに、 ヒントとかいって苦し紛れにだしたfor /?で、属性読まずに済む完全な方法を発見さ れた上に、始めに言い出した属性文字列の仕様がどこにもなくて動いたとしてもまぐ れで動いているに過ぎない事を指摘されちゃ、立ち直れないだろうな。 その上、ブーメランもくらっているし、仕様も読めないし、たった2行のバッチスクリ プトの意味も理解できてないし。 でも、己の未熟さが招いた結果だから、諦めて受け入れろ。
一生懸命長文書いたつもりだろうがsageろカス
ぶっちゃけ念入りにこのスレチェックしてないから話しよく知らない側としてはその話はうぜえ
悔しい 悔しいよぉ〜 周回遅れの阿呆にスクリプトの常道を筋悪なんてけなされてくやち〜よぉ〜 これでいい?
>>531 >if errorlevel==1 goto SMTPSVC
ってなんだよ ひでーな 動くけど
set p=C:\Tools\Firefox\firefox.exe この p という変数からフォルダパス (C:\Tools\Firefox) を抜きとるのに、 call でサブルーチンの引数にして %~dp1 とする以外に方法はありますか?
似たようなもんだけど for %%i in (C:\Tools\Firefox\firefox.exe) do set parent=%%~dpi echo %parent%
>>534 ありがとうございます。
こちらの方が随分良いので、そのまま使用させていただきます。
>>527 >その上、ブーメランもくらっているし、仕様も読めないし、たった2行のバッチスクリ
>プトの意味も理解できてないし。
それって
>>447 のことみたいだが、たった2行のバッチスクリプトもまともに書けんのか?情けない。
まともに動くものを書いてから大口たたけよな。
call xxx c:\users
はず ポッ
for/?には書いてないが、 You cannot use the for command to test directly for a directory
なぁんだ そんな姑息な方法を筋がよいと思っていたのか?
いつまで言ってんの?
541 :
デフォルトの名無しさん :2011/05/17(火) 18:44:26.59
>>536 よっぽど悔しかったんだな。
5日間必死で考えてようやくバグ見つけたか。 実はそれも考えてあるんだ。w
set dir=%~1
for /d %%d in ("%dir%*") do if /i "%dir%" == "%%~d" set found="%%~d"
天才さんは call xxx c:\boot の対策も当然考えてるんだろうな?
ガーン そっそんなぁ for/?に書いてないんだけど…
筋悪だけど dir/b /adh c:\boot* の多値出力を処理するのかなぁ?
それよりは、筋悪だけど、%~aI の多値出力を処理してほうがマシじゃないのか? これが使えないっていう話は聞いたことがないもんな
>>546 ディレクトリかどうかの判定に属性見ることのどこが筋悪なんだ?
属性見ないでやろうってーのが姑息だろが?
set dir=%~1 for /f "delims=" %%d in ('dir/b /ad "%dir%*") do if /i "%dir%" == "%%~d" set found="%%~d"
text.txtに以下の5行があります aaaa bbaa ccaa ddaa eeaa 先頭がcから始まる(ここでは3行目)文字列に、頭に#をつけて以下のようにこのようにしたいのですが どのようにできますか? aaaa bbaa #ccaa ddaa eeaa
if "%string:~0,1%"=="c" set string=#%string%
WSHでやれよ
PowerShellやろうず
>>551 ifで引用符を付けたのにsetで付けないのはナゼ?
変数がnullだった時に引用符付けてないと…
なるほど了解です。 でも、どっちにしろnullの部分展開だとエラーが出るね。 The syntax of the command is incorrect. >if "~0,1string
if "%string:~0,1%"=="c" ( set string=#%string% ) if と同じ行にset置いたら動かん…set以外だったら行くみたいだが。 ようわからんわw
ifと同じ行だとset文に%があるとダメっぽい
if not defined string goto :x if "%string:~0,1%"=="c" set string=#%string% :x
setは=の後、改行までの内容を全て「変数に入れたい内容」とみなしてしまうのだが ifとか()とかは解釈の過程でなんか空白入れられたりとか色々やるんよね 非常に相性が悪い
561 :
デフォルトの名無しさん :2011/05/21(土) 23:10:27.60
パソコンを1個のPCで監視しようとしています batファイルに "C:\Program Files\zeroremote\zeroremote.exe" /c:192.168.0.201 "C:\Program Files\zeroremote\zeroremote.exe" /c:192.168.0.202 と記載してバッチを起動してみると 1行目のプログラムは起動するのですが 2行目の方のは1行目で開かれたウィンドウを閉じないと実行されず処理が停止状態になってしまいます どんどん処理を実行して行く方法があったら教えていただけないでしょうか よろしくお願い致します
set a=C:\test\test.txt set /p x=<%a% echo %x% こんなんで test.txt の一行目が取得できますが、2 行目だけを取得する 最も簡単な方法を教えて下さい。set /p を使ってできたような気がする んですけど…。
set a=C:\test\test.txt (set /p x= set /p x=)<%a% echo %x%
例えば1〜100行あるとして 指定した行を取得したいばあいはどうやるのですか?
for /L
568 :
564 :2011/05/22(日) 20:57:34.38
ありがとうございます、できました。しかし仕組みがよくわかってないです。 set /p についてる括弧はどういう機能でしょうか?
echo a>c echo b>c (echo a echo b)>c
>>568 set に括弧が付いてるんではなく
(
set /p x=
set /p x=
)<%a%
571 :
564 :2011/05/23(月) 05:59:49.29
みなさんありがとう。ググっても、ここで教えてもらった以上の説明が見つからなかった。
>>570 を
>>569 のように括弧なしにすることは出来るんでしょうか?
朝のうちにもう一回ググってきます。
明示的にERRORLEVELをクリアする方法ないですか 意味もなく dir すればできるっぽいけどもうちょっとスマートな方法あれば
cmd /c exit 0
net start サービス これでサービスが正常に起動できた場合に特定の処理をする方法ってありますか if (サービスが正常に起動できたか){
net start|findstr ^サービス$ でerrorlevel見ればいいんじゃね
net start | find "your service" とかじゃダメなん
function a(){ } function b(){ } みたいに1ファイルにまとめておきたいのでこういうふうに関数って作れませんか?
call :label
echo a>c echo b>>c と勘違い?
>>574 俺は sc コマンドで適当にループさせてやってる。
sc PC名 query サービス名 | findstr "RUNNING" 1>nul 2>&1
if errorlevel 1 (
適当に待ちとループ
)
あとは10回ループして動いてなかったら失敗扱いにしてメッセージを出して、みたいな。
いきなり質問で失礼します バッチで コマンドを入れる事は可能でしょうか? というのもCSV保存、読み込み用のバッチを作ろうと思っています その際に保存用(save.bat)にオプション等で保存先を指定したいのです。 考えている呼び出しの形こんな感じ→ call save.bat -str=%a -savelocation="c:\\test" -fileName="test.csv" -init=1 求めてる動作→initが1なのでTEXTを初期化する(デフォ:上書き) savelocation,fileNameがあったらそこを保存場所に使う(なければデフォ:./savelogYYMMDD_MM.dat(YYMMDDMMは書き込みの最初に取得する) strに保存する1行分の文字を入れる(必須) ) call save.bat -savelocation="c:\\test"のようにしてcall時に変数に入れて渡さず コマンドでセーブ場所を指定する事は可能ですか?
文章が長い 要点だけ書け
うまく説明できなくてすみません 現在save.batを呼ぶ際に下の方法で保存場所を指定しています rem main.bat set Location="c:\test" call save.bat goto :EOF ところが、save.batをバッチ以外から読み込もうとしてもできなかったので rem main.bat call save.bat -Location="c:\test" goto :EOF このような形に変更したいと思っています 可能でしょうか
>ところが、save.batをバッチ以外から読み込もうとしてもできなかったので できないというのも不思議な話だが、それがだめならmain.batでも呼べば?
それか、call /? でも読めば? call main.bat 111 222 333 %1=111 %2=222 %3=333
ちがうだろ sub.batを変更しないで可能でしょうか?っていう質問だろ だから答えは不可能
>バッチで コマンドを入れる事は可能でしょうか? 可能
>>586 の最後の1行は
自動車のようにガソリンを使わず移動できる。かそれとも
自動車のように長い主翼を持たない飛行装置。の文か迷った。
>>589 呼び出し:main.bat "c:\Program Files\aaco\v1\save\save.dat"
main.bat中身
rem ダブルクオーテーションを抜く処理(違うかも)
set DATA = %1~1,-1%
if NOT EXIST %DATA% goto ERROR
call save.bat %DATA%
pause
exit
:ERROR
goto :EOF
こんな感じですか?
問題を理解してないのですか?
可能なのか不可能なのか・・・
問題は何ですか?
質問者が問題を理解してないことでは?
答えは不可能じゃなくて、答えるのは不可能だっちゃ
600 :
デフォルトの名無しさん :2011/05/24(火) 17:08:01.01
> ところが、save.batをバッチ以外から読み込もうとしてもできなかったので 一層、意味不明な文を… お前の住んでる環境では、この意味をみんな理解できるのか?
chcp 65001 ではバッチファイルは読み込めない。 という文章なら正しいよ
>バッチで コマンドを入れる事は可能でしょうか? バッチファイルの中身はコマンドだけど?
ありがとうございます 自己解決しました
どうしたら伝わるんだろうか・・・ 使用方法1 $save.bat エンター 結果 → 通常処理(上書き)。保存する場所もデフォルト 使用方法2 $save.bat -Location="c:\test" 結果 → 通常処理(上書き)。保存する場所をc:\testに変える 使用方法3 $save.bat -init=1 結果 → 通常処理(新規) 使用方法4 $save.bat -init=1 -Location="c:\test" 結果 → 通常処理(新規) 保存する場所をc:\testに変える
がんばればできるんじゃね 以上
>>605 おう・・・
意味不明な事を書きまくってすみませんでした・・・
ちょっと頭冷やしてきます
単に引数をパースしたいだけなんじゃね もっとシンプルに -location c:\ って形式にして if "%~1"=="-location" ( set location=%~2 shift shift ) とかやればいいんじゃねーの
今のバッチファイルは保存先を環境変数で渡している。 (環境変数の渡し方を知らないから)バッチファイル以外からは読み込めない(実行できない) だから、コマンドラインオプションで渡したい。 という事か。どういう訓練を積むとあんなに難解な質問文を書けるようになるのだろう。 ネイティブ日本語スピーカーじゃないのかな?
名前付き引数はめんどいから環境変数渡しのほうが私はよいが
ま あのシンタクスは苦労するだろな 私なら避けるが
call save.bat -str "%a" -saveLocation "c:\\test" -fileName "test.csv" -init 1
こんな感じなら出来るんじゃない。
>>607 見て思った。
batファイルでコマンドプロンプトが表示されるとき、画面サイズを大きくしたいのですが batファイルで調節することは不可能ですか?手動がめんどうなのです
今来たばかりで問題がなんなのか全然わかってないんだけど 変数をパラメータに入れて渡したいなら save.bat str=%a,savelocation="c:\\test",filename="test.csv",init=1 みたいにやって、 set args=%* set %args:,=&set % これじゃいかんの? 区切りはカンマじゃ問題あるかもしれんから使いそうに無い別文字でも
save.bat "set hoge=fuga&set hage=foo&set aaa=bbb" set args=%* %args:~1,1% こんなのとかw
%args:~1,-1% だった
>>614 おおおおおおおおおおおおおおおおおおおおおおおおおおおできました!
>>604 可能。save.bat で引数をパースする処理を書かなければならない。
それが面倒なら
%1 "保存場所"
%2 "ファイル名"
%3 "新規"
とか決め打ちして
使用方法1
$save.bat "" "" ""エンター
結果 → 通常処理(上書き)。保存する場所もデフォルト
使用方法2
$save.bat "c:\test" "" ""
結果 → 通常処理(上書き)。保存する場所をc:\testに変える
使用方法3
$save.bat "" "" "new"
結果 → 通常処理(新規)
使用方法4
$save.bat "c:\test" "" "new"
結果 → 通常処理(新規) 保存する場所をc:\testに変える
で%1が "" ならデフォルトの保存場所に保存
set location="c:\保存場所"
if not %1 == "" (
set location=%1
)
%2 %3についても指定されているかをそれぞれ判定
echo %~1> test.txt とする時に、%~1 に続いて改行コードが入っちゃうんですけど これを何とかする方法はありませんか?
<nul>test.txt set /p"=%~1
>>621 有難うございました。なるほど、そうやってやるんですね。
バックグラウンドでメモ帳を起動したいのですがどうやるのでしょうか?
最小化じゃだめなん?
メモ帳がアクティブにならなければかまいません
非表示とかフォーカスを移動しないとか? windowstyleを指定すればええやん
非表示で起動するサンプル探してwindowstyle値を変える
batファイルからバルーンを表示する方法ってございませんか?
標準コマンド以外使ってもいいならnircmdとか
aあ、ありました nircmd.exeとnircmdc.exeが両方入っているのですがどっちもbeep 500 2000を実行したら動いたので違いがわかりませぬ
In the console version, all error messages goes to the console window, instead of using a message box.
del /q "" これ実行したら、ファイルが全部消えてしもた… "" は *.* と同じなの?
/q 付けずにやってみたら *.* じゃなくて *
"" はワイルドカードじゃないよね??
dir "" >a dir * >b fc a b
if not exist a copy nul a if not exist b copy nul b if not exist c copy nul c dir /b "" > a dir /b * > b dir /b > c fc a b fc a c pause
ウィンドウ非表示で動かした無限ループのバッチちゃんを 別のバッチちゃんから止めることってできるかな?
できるっしょ
おしえてちょ
・・・知らない
taskkill
アンがト
単純にプロセス殺すとcmdが全滅するんじゃ チェック用のファイルやレジストリで自爆させるようなフラグを立てるしか
なんで全滅するんだろ?
>ファイルやレジストリ はやめて〜せめて環境変数でやれよ
うんそうする
できねーよ
md a copy ""."" a
for %i in ( * ) do copy %i "%~nxiz"
system32に自作コマンドとかって可能?
不可能?
誰かちょっと知恵を貸してください。 テキストファイル内が下記の感じで、 それぞれスペースで区切られているんだけど・・・ 行の末尾の数字のみの合計を求める場合どう書けばよいのでしょう。 aaa bbb ccc 123 ddd eee ddd 456 ggg hhh aaa 789 (この場合123+456+789としたい)
for/? set/?
バッチの副ストリーム対応が中途半端すぎて涙出てくる
あるだけでもよろこべ
>>656 >>655 です、レスありがとうございます。
検索で調べているのですが、どうも「SET x=」で固定数を計算する例や、
時間・日時の差分などを求めるものが多く、希望通りのサンプルが見つからないもので・・・
具体的にはどんな感じで書けばよいでしょうか?
引数から相対パスを引っ張ることは可能でしょうか 任意の位置にあるbatにC:\a\b\c.txtを引数として渡した場合に(D&Dで突っ込んだ場合に) C:\a\y\z.txtを追加してbatのあるフォルダに出力する、みたいな感じに使うのですが 絶対パスではなく%~dp1に対する..\y\z.txtの指定方法をお願いします。
自分なりにやってみたところ set aaa=%~dp1 set aaa=%aaa:b=y% copy "%aaa%z.txt" "%~dp0z.txt" こんな感じになったのですがどうでしょうか あちらこちらで使うのですがb、y、zの名前はどこでも変わらないです
%~dp1..\y\z.txtでいいんじゃないの
あれ、それでいけるんですか 展開とか何とかで C:\a\b\..\y\z.txtに・・・ ってこれ普通に読めるorz どうもありがとうございました
\a.bat \a.xls \b があってa.batを実行したらフォルダbにa.xlsをコピーして\b\a.xlsを実行 終了後b\a.xlsを削除したいのですがどうすればいいでしょうか
a.batを実行したらフォルダbにa.xlsをコピーして\b\a.xlsを実行 終了後b\a.xlsを削除すればいいよ
>>664 すみません、まだ勉強し始めなので正確性に欠けるかもですが、
うちではこれで希望に添う結果になりましたがどうでしょうか?
copy /b a.xls b\
del a.xls
引き続き
>>655 の方法をおわかりの方、申し訳ありませんが、
具体的にはどう書けば良いのかお知恵をお貸し下さい><
gawk とか perl を先にインストールすればいいのに。
>>666 ヒント:
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド [コマンド パラメーター]
ファイル セットは、1 つ以上のファイル名です。各ファイルが開かれ、
読み取られ、処理されてから、ファイル セットの次のファイルに進みます。
処理では、ファイルの読み取り、個々のテキスト行への分割と、0 個以上の
トークンへの解析が行われます。その後、見つかったトークン文字列を変数値に
設定して for ループの本体が呼び出されます。既定では、/F は、各ファイルの
各行から、空白で区切られた最初のトークンを取得して渡します。空白行は
スキップされます。既定の解析動作を変更するには、省略可能な "オプション"
パラメーターを指定します。これは、異なる解析オプションを指定する 1 つ以上の
キーワードを含む、引用符で囲まれた文字列です。キーワードは、次のとおりです:
eol=c - 行末のコメント文字を指定します (1 文字)。
skip=n - ファイルの先頭でスキップする行数を指定します。
delims=xxx - 区切り文字のセットを指定します。
これは、既定の区切り文字であるスペースとタブを
置き換えます。
tokens=x,y,m-n - 各繰り返しに対して、各行から for 本体に渡す
トークンを指定します。これにより、追加の変数名が
割り当てられます。
m-n の形式は範囲で、m 番目から n 番目の
トークンを指定します。
tokens= 文字列の最後の文字がアスタリスクである場合は、
追加の変数が割り当てられ、最後のトークンが解析された
後、行に含まれている残りのテキストを受け取ります。
>>667 バッチファイルだけで出来るならそれで済ませたいと思いまして・・・
>>668 レスありがとうございます。
for /f "tokens=3" %%a in (test.txt) do @echo %%a で、
下記のように(
>>655 で書いた末尾の数字のみ)取り出せたのですが、
そこからどうやれば合計を求めることが出来るのでしょうか?
123
456
789
set/?
do set /a T=!T!+%%a echo 合計:%T% 遅延環境変数使いたくないならcallで
>>666 > copy /b a.xls b\
> del a.xls
それではa.xlsを実行の段が無いだろw
>>671 > do set /a T=!T!+%%a
set /a 使用時に変数を%や!で囲む必要は無い。常に遅延展開される。
do set /a T=T+%%a でよし。
do set /a T+=%%a でもよし。
一部の特殊な変数は%が必要。上の方でも出てたけど%random%とか。
>>670-671 >>673 レスありがとうございます。
希望通り末尾の数字のみ計算できました!
しかしまれに「演算子がありません。」と表示されるので調べると、
バッチファイルでは小数の計算が出来ないのですね・・・
解決策などありましたらお教え下さい、すみません><
>>672 すみません、よく読んだらxls実行した後に、
終了後削除となっていますね・・・。
実行はstartで出来るとして調べたらプロセスの監視も出来るようですね。
自分のやりたい事もままならないのにしゃしゃってすみませんでした;
>>676 レスありがとうございます。
検索して100倍、1000倍で計算の後にその分を割ると・・・
と説明されているのを見て試してみたのですが、
set/a 以降ですでに小数自体が切り捨てられダメでした。
test.txt
aaa bbb ccc 12.3
ddd eee ddd 45.6
ggg hhh aaa 78.9
for /f "tokens=3" %%a in (test.txt) do set /a T=T+1000*%%a
echo 合計:%T%
演算子がありませんでした。〜表示で、
和は整数だけが足された結果の135となってしまいます・・・。
>>677 工夫しようぜ
小数が整数部2桁、小数部1桁固定なら何とかなるでしょ
cmdにしがみつかずvbs使おうぜ
スレタイ読みやがれです
681 :
678 :2011/06/07(火) 08:01:48.35
もうちょっと考えてみたけど小数部が桁数固定であれば、 整数部は何桁でも大丈夫な方法だった 例えば常に、 aaa bbb ccc 12.34 ddd eee ddd 45.00 ggg hhh aaa 78.90 みたいになってればOK(質問者は業務プログラムのバッチファイル部分担当と想定 先行プログラム開発者に小数部の桁数固定を頼んでね) for /f "tokens=3" %%a in (test.txt) doをネストするか中間ファイル作るかして、 12.34 45.00 78.90 に対して、 forコマンドの「delims=.」オプションで整数部と小数部を.でスプリットして、 別々の変数に格納し、小数部の合計値が小数部桁数を超えたら繰り上がりを変数で保持して (今回の例では小数部合計134だから、「1」を変数に格納)、 整数部合計と繰り上がり値を足したら最後に、 set final_sum=%int_sum_with_carry%.%float_num% みたいな感じで文字列連結すればいいんじゃない?
小数部が1桁なら簡単なのだが、2桁以上だとちょっと面倒臭いことになる。 先頭が0ではないかで分けて、0だった場合は先頭部の0を全部消すといった 作業が必要。 なぜかというと、set /a x=012 というように一桁目が0の時 これは8進数と解釈されるから。x=089などとなった場合はエラーになる。
>>679 バッチでは小数演算が出来ないとのことなので、
vbsやwshも考えたのですが余計に分からなくてw;
>>681-683 ありがとうございます。
仰るとおり、一旦数字だけの中間ファイルを作った後、
整数と小数点部分の分離〜それぞれの合計まではできました。
が、小数部分が3桁になった際(例だと134)に1と34を分ける所で躓いてます。
小数部分の変数からオフセット?なるもので ~-2% として後ろ2桁を取り出せても、
百の位の桁はどう検出して整数部分につけるのだろうとか・・・
そっちできけよ
>>684 rem 小数点以下最大4桁
for /f "tokens=4" %%a in (test.txt) do (
for /f "tokens=1,2 delims=." %%i in ("%%a") do (
set /a x=x+%%i
set /a t=1%%j0000
call set /a y=y+%%t:~0,5%%-10000
)
)
set /a z=x*10000+y
call echo %%z:%z:~-4%=%%.%z:~-4%
688 :
678 :2011/06/08(水) 06:58:50.26
>>684 例の合計値は正しくは124でしたね。
>>682 の暗算が間違ってました(恥
あとfloat_numではなくfloat_sumと書いたつもりでした
それはさておき、まず
ser /a carry=%float_sum% / 100 で商を取得し、0だったら繰上げなし。
1以上なら以下コマンドを実行し、整数部合計と小数部繰り上がり(余り)を合計する。
set /a int_sum_with_carry=%int_sum% + %carry%
で最後は必ず
set final_sum=%int_sum_with_carry%.%float_sum%
すればおkかな
このスレで聞くのもなんだが、お前らなんでそんなにcmdに拘るの? PerlなりRubyなり…昔からある便利な道具を使わない(or使えない)理由は何?
標準搭載だから
691 :
デフォルトの名無しさん :2011/06/08(水) 09:44:47.34
perlやらRubyやらのオープンソースじゃ悪意ある人間によるウイルス混入の危険性がある
こんなの制限のある中でどれだけの事が出来るかっていう思考実験だろ? これを実際にやろうって奴はいないだろ。 もっと簡単便利な言語で書けば終わりなんだし。 逆に言えば普通は出来ない(かもしれない)ことを無理やりでもやろうって所が面白いじゃん。
>>689 基本的には曲芸だと思う、俺も普段バッチは大半がJScriptで書いてる
>>688 > ser /a carry=%float_sum% / 100 で商を取得し、0だったら繰上げなし。
> 1以上なら以下コマンドを実行し、整数部合計と小数部繰り上がり(余り)を合計する。
> set /a int_sum_with_carry=%int_sum% + %carry%
そんな面倒なことしなくても
set /a int_sum_with_carry=float_sum / 100 + int_sum
一行で終わりだろうに。
時間指定で特定のアプリを起動させるバッチコマンドを書いているんですが いちいち起動させるアプリごとにatコマンドを書かないで済ます方法はないでしょうか? たとえばこの特定の日時にメモ帳と計算機とペイントを開くバッチなんですが at 14:50 /interactive /every:M,T,W,Th,F c:\windows\notepad at 14:50 /interactive /every:M,T,W,Th,F %SystemRoot%\system32\calc.exe at 14:50 /interactive /every:M,T,W,Th,F %windir%\system32\mspaint.exe これの "at 14:50 /interactive /every:M,T,W,Th,F "の部分の記述を 一度だけ書いて起動するアプリごとに書かないで済ますといった感じです。
変数に入れればいいべ
>>697 atコマンドを書き込んだバッチで別のバッチを読み込ませるってことですか?
>>698 変数にコマンドを入れてそれぞれの行の頭に変数を書き込むみたいな感じですかね?
まったく素人で申し訳ないんですがちょっと変数でコマンドを書いていただけないですかね?
いろいろいじっていたんですが、Windows7だとatコマンドで起動アプリのGUIを表示することってできないんですね。
これは不便です。
set at=at 14:50 /interactive /every:M,T,W,Th,F %at% c:\windows\notepad 「バッチ 変数」でググるくらいのことはしようね
なるほど 解決!
>>700 一応ぐぐってはみてコマンドも書いてみたんですが動かなかったんです。
どうもありがとうございました。
at 14:50 /interactive /every:M,T,W,Th,F c:\windows\notepad これが動くのか?
704 :
デフォルトの名無しさん :2011/06/10(金) 16:08:32.57
Windowsフォルダの方のnotepad.exeを使いたがる男の人って
もともとwindowsフォルダはpath通ってるよな
C:\>where notepad C:\Windows\System32\notepad.exe C:\Windows\notepad.exe C:\>fc /b C:\Windows\System32\notepad.exe C:\Windows\notepad.exe ファイル C:\WINDOWS\SYSTEM32\notepad.exe と C:\WINDOWS\NOTEPAD.EXE を比較してい ます FC: 相違点は検出されませんでした
windowsフォルダにあるのはsystem32フォルダにある奴の ハードリンクなのに差異なんかあるはずねぇよw
ハードリンクなのに(笑)
ハードリンクかどうかは素人目には分からんからな
ハードリンクに赤いショートカットオーバーレイが出るのは あれは何のツールだったっけ?
Link Shell Extension
713 :
デフォルトの名無しさん :2011/06/11(土) 13:47:01.44
java用のバッチファイルjava.batを作って(そのフォルダには、他言語用のバッチファイルなどがある) そのフォルダにパスが通っているんですけど、 javaファイルを実行しようと思ってコマンドプロンプトで java コマンドを打つと このバッチファイルが実行されてしまいます。バッチファイル名を変えずに javaコマンドを実行できるようにならないんでしょうか? そもそも、exeファイルとbatファイルの優先順位がexeファイルより上なんですか? また、パスの設定でbatファイルのディレクトリの方を先に書いたから、そっちから先に検索するからでしょうか?
pathextの記述順
pathは先に書いたもの順。同じpathで異拡張子なら前述の通り
pathextの記述順はEXEの方が優先順位高い(先に書いてある)です。 でも、pathはバッチファイルのあるフォルダが先に書いてあります。 という観点でみると、PATHEXTより、PATHの方が優先順位が高いということなんですね。 どうも、みなさん(お一方?)ありがとうございました。すっきりなぞが解けました。
>>713 javaコマンドを拡張子付きで、
java.exe と指定すればいいんじゃね?
>>713 そういうバッチファイルってsetjavaとかのが良いよ
まあ.exeまで書けば問題ないけど
蛍光灯?
ハードリンクかどうか表示するバッチファイルを求む
ハードリンクかどうかではなくハードリンクがあるかどうかだな。 lsとか使えりゃ一発なんだけど、標準の環境じゃファイルIDで検索しまくるしか思いつかん。
hardlink?.cmd C:\Windows\System32\notepad.exe C:\Windows\notepad.exe
中身を書けよ
ファイルAとBがお互いハードリンクかってのは簡単にわかるよ。 fsutil file queryfileid ファイルA でファイルIDゲットしてファイルBも同様にやって同じIDならハードリンク。 ただ、ひとつのファイルに対して他に同じIDを持つファイル(=ハードリンク)があるかとか、 その名前は何かとかになると標準コマンドでは対応できんかと。
>>27 @REM FIZZBUZZ.BAT 最短目指して
@SET/A N+=2,F=N%%3,S=N*5
@IF %N:~-1%==0 SET S=Buzz
@IF %F%==0 SET S=Fizz%S:*0=%
@ECHO %S:0=%&IF %N% LSS 200 CALL %0
PAUSE
@echo off setlocal enabledelayedexpansion for /l %%i in (1,1,100) do (set /a fb=%%i%%15, bu=%%i%%5, fi=%%i%%3 if !fb!==0 ( echo fizzbuzz) else if !bu!==0 ( echo buzz) else if !fi!==0 ( echo fizz) else echo %%i) pause
for (int i=0; i++ < 100;) { static const char* const a[]={" %d"," Fizz"," Buzz"," FizzBuzz"}; printf(a[!(i%3)+!(i%5)*2], i); } これ参考に書いてみたのですが setlocal enabledelayedexpansion set a[0]=%%num%% set a[1]=Fizz set a[2]=Buzz set a[3]=FizzBuzz for /l %%i in (1,1,100) do ( set /a u=!(%%i%%3)+!(%%i%%5)*2, num=%%i call echo %%a[!u!]%% ) pause +!(%%i%%5)*2 の使い方が誤っています。 と出ます。 コマンドで set i=15 set /a u=!(%i%%3)+!(%i%%%5)*2 バッチで set /a u=!(%i%%%3)+!(%i%%%5)*2 とかだと3と結果が出て動くので、何が悪いかわかりません。 わかる人がいれば教えてください。
730 :
729 :2011/06/17(金) 00:26:59.42
for /l %%i in (1,1,100) do ( set num=%%i set /a u=!(num%%3)+!(num%%5)*2 call echo %%a[!u!]%% ) これも同じように +!(num%5)*2 の使い方が誤っています。 となりました。お手上げ。
set /a u=!(%%I%%3^)+!(%%I%%5^)*2 括弧の対応ぐらいしてくれとは思う
setlocal enabledelayedexpansion set a[0]=%%num%% set a[1]=Fizz set a[2]=Buzz set a[3]=FizzBuzz for /l %%i in (1,1,100) do (set num=%%i set /a "u=^!(num%%3)+^!(num%%5)*2" cmd /c call echo %%a[!u!]%%) pause
733 :
729 :2011/06/17(金) 01:41:43.78
>>731 レスありがとうございます
)をエスケープしてやる必要があったのですね
動くようにはなりましたが u が 0,2,4,6,8 となっているようで思ったようには動きませんでした
>>732 ちゃんと思ったように動作しました!ありがとうございます!
動作の原理的なことがよくわからないのですが
"で全体をエスケープして且つ、!をエスケープてことなんですよね?
!(num%%3)+!が存在していない環境変数とみなされないようにってことなのかな?
call の部分も cmd /c 付けないと %num% となって展開が足りなかったみたいです
ちゃんと書ける人を見ると自分がなんとなくわかった気がしてるだけで
全然理解出来て無いのがよくわかります
バッチ難しいですねー
>>726 C:\>fsutil hardlink list
使用法 : fsutil hardlink list <ファイル名>
例 : fsutil hardlink list c:\foo.txt
C:\ap>fsutil hardlink list C:\Windows\System32\notepad.exe
\Windows\notepad.exe
\Windows\winsxs\x86_microsoft-windows-notepadwin_31bf3856ad364e35_6.1.7600.16385_none_42a023025c60a33a\notepad.exe
\Windows\winsxs\x86_microsoft-windows-notepad_31bf3856ad364e35_6.1.7600.16385_none_6ef0e39ed15350e4\notepad.exe
\Windows\System32\notepad.exe
>>734 list is an invalid parameter.
listがあるのはvista以降だな
間違えた。vistaじゃなくて7と2008サーバ
んなこといったらWin2K以前にはfsutilコマンド自体ないし
vista用で
おら早くnotepadがハードリンクなのか証明しろやカス共(XP対象でお願いします。)
ことわる
リンクされてるわけ無いじゃん
ちなみに
>>726 は嘘です
64bitではwindows\notepad.exeはどっち?
タスクスケジューラに登録したものを無効にしたり有効にしたり無効にしたりできませんか?
できま
一時的にタスクを切りたいときとかわざわざタスクスケジューラの画面出すのがめんどくさかったんですよね できないのか残念です
教えるのがめんどくさかったんですよね 残念です
初心者プギャー
質問です。 会社のネットワークプリンタを新規に導入するにあたって、不要のプリンタ設定の削除、新規ポート追加、 既存のプリンタの設定変更、新規プリンタ追加の設定をバッチファイルで処理しようとしてるんだけど、 不要プリンタの削除、既存プリンタの設定変更、新規ポート追加までは共有サーバに置いてる バッチファイルで正常に動いてるのに、新規に作ったポートでの新規プリンタ追加だけが 自分のpcでは出来て、他のpcでは「アクセス権がない」とけられる現状。何で? rundll32 printui.dll,PrintUIEntry /r "ポート" /if /b "プリンタ名" /f "共有サーバ上のinf" /m "モデル名" /q /u 引数の順序は違うがこんな感じの追加設定。 ドライバのインストールまでは走るけど、最終的な追加で蹴られちゃいます。 google先生に尋ねても同じような事例は出てこないので誰か助けて。 あ、XPです。
runasで調べた上で試してみれば?
752 :
750 :2011/06/24(金) 19:26:34.38
>>751 各ユーザーに自分でバッチファイル実行してもらう予定で、
別にアカウントにはプリンタ変更さわれないほどの制限はかけてなかった。
削除とか変更は走るから謎だったんだけど、今日もう一回やったら普通にでけたわ。
昨日できなかった理由がわからん。
けどレスしてくれてありがとね。
WindowsXPのリモートデスクトップで使うクリップボードのファイルrdpclipが時々動作しなくなる(コピペできなくなる)ので rdpclipを再起動させるバッチを書いたのですが コマンドプロンプトで一行ずつ実行するのには問題ないのに バッチで処理するとコマンドプロンプトに戻ってこなくなります 対策があればお願いします 以下書いたバッチ taskkill /IM rdpclip.exe rdpclip.exe バッチファイル名 rerunclip.bat でSystem32フォルダに入れる
start rdpclip.exe
>>754 ありがとうございます
うまくいきました
バッチファイルに D&D で画像ファイルパスを投げると リサイズして新たに保存してくれるスクリプトです。 @echo off set _size="640x480" rem set /p _size="Resize option (Default:640x480)" for %%f in (%*) do ( set _new="%%~pf%%~nf.new%%~xf" echo "Convert %%f" echo " to --> %_new%" E:\exe\ImageMagick-6.6.9-8\convert.exe -resize %_size% -quality 20 %%f %_new% ) echo Done. pause 上のでは _new に新しいパスが入りません。 どなたか教えてください。
まず、set /? 遅延展開 でググる、 call でこのスレ検索する
マイ コンピュータ\(デジカメとかポータブルメディアプレイヤーとかの機種名)\Device Storage とかのストレージのフォルダを扱うには どういう風にすればいいっすか UNCみたく \\HOSTNAME\ABC\DEF みたいな指定はできないっすか WSHとか PowerShell使えば 扱えるっすか?
こういう風でいいっす できないっす 扱えるっす
760 :
1/2 :2011/07/05(火) 00:22:16.07
教えてください。 以下のバッチを実行したところ、期待通りの結果になりません。 #ip.bat @echo off for /f %%a in (ip.lst) do ( echo ------------------------ ping -n 1 %%a echo %ERRORLEVEL% if %ERRORLEVEL% EQU 1 echo pingに失敗 if %ERRORLEVEL% EQU 0 echo pingに成功 ) #ip.lst 127.0.0.1 192.168.0.5 111.111.111.111 <これは通じないIP
761 :
2/2 :2011/07/05(火) 00:23:37.60
再現手順 スタート→コマンドプロンプト起動→cd <ip.batのあるディレクトリ> →>ip.batと実行すると、なぜか全部%ERRORLEVEL%が0になってしまう。 上で、ip.batを実行したコマンドプロンプト上で、↑キーを押して、 再度、ip.batを実行すると、pingこまんどの出力は変わらないのに、%ERRORLEVEL%が1になってしまう。 実行環境はWindows7 ホームプレミアムです。 よろしくお願いします。
>>761 とりあえず、
echo %ERRORLEVEL%
の行は要らない、というか場所がマズすぎる。
もう一度
if /?
を読み直すことをお勧め
errorlevel は
if ERRORLEVEL 1 なにか
で使えるのだから。
あるいは、
>>757 お好きな方で。
@echo off for /f %%a in (ip.lst) do ( echo ------------------------ ping -n 1 %%a if %ERRORLEVEL%==0 ( echo pingに成功 %ERRORLEVEL% ) else ( echo pingに失敗 %ERRORLEVEL% )
>>764 × for in () do (if %ERRORLEVEL%==0
○ for in () do (if !ERRORLEVEL!==0
for in () do (if ERRORLEVEL 1 (echo) else (echo) )
成功だけを拾いたい時 if errorlevel 0 とやってしまわないよう注意。 if not errorlevel 1 こっちを使う。
ちなみに、pingの成否をerrorlevelで判断するのはよろしくない。 pingが通らなかった時にerrorlevelが0になるパターンがあるから。 destination host unreachable はそのひとつ。 同じ条件でもOSによって反応が違ったりするんで当てにならない。 errorlevelでなく、forで出力を受けて解析したほうがいい。
ちなみにpingの成否をforで出力を受けて解析するときは改行文字に注意したほうがいい。
>>759 ありがとう
このさいPowerShellの勉強でも始めるよ
ググって自分で勉強しようと思うんだけど
下記みたいなこういうパスの正式名称がわからないから
検索キーワード教えて
"マイ コンピュータ\(デジカメとかポータブルメディアプレイヤーとかの機種名)\Device Storage "
770 :
761 :2011/07/07(木) 23:04:55.90
771 :
761 :2011/07/07(木) 23:06:13.02
for /f %%a in (yamada.,txt) do call :pin call :netmount ) :pin ping -n 1 %ipaddr% | find "TTL" set pingerr=%errorlevel% (以下、%pingerr%によって判定。) ブルーチンpinが失敗したら、:netmountは実行しないというのに良い方法はありますでしょうか。 (具体的には記載は見つからなかったのですが、for 内でgotoやgotoのとび先指定はどうも使えないようなので)
後出して申し訳ありませんが for /f %%a in (yamada.,txt) do call :pin call :netmount <:pinがエラーならここに飛ぶ処理> <こんなしょり ) :pin ping -n 1 %ipaddr% | find "TTL" set pingerr=%errorlevel% こんな処理ができれば最高です。 よろしくお願いします。
if %pingerr%==0 call :netmount じゃだめなん? call :pin if errorlevel 1 goto :jump call :netmount :jump 〜 exit /b :pin 〜 exit /b %pingerr%
774 :
773 :2011/07/08(金) 00:30:48.92
やりたい仕様書いて、自分が書いたコードをコードパッドにでもあげたら 誰かが暇つぶしにもっと良いものを書いてくれるかもしれんぞ。
ああすまんforの中でgoto使えないってか。 for /f %%a in (yamada.,txt) do (call :sub %%a) とかでcallで一時的にサブルーチンに逃げれば:subの中でgotoも更にcallも使えるよ
>ああすまんforの中でgoto使えないってか。 使えるが 使えないのはラベルのほうだろ
errorlevelで返すのもいいけど、pinの中で分岐してはいけない 理由が何かあるのか? forの中で分岐する必要がないだろ。
>>771 >ブルーチンpinが失敗したら、:netmountは実行しないというのに良い方法はありますでしょうか。
試してないけど、
call :pin
call :netmount
を1行にまとめて、
call :pin && call :netmount
としたら上手く行きませんか?
time.txtというファイルに日付を格納し、 その中身を読み込みnewtimeという一時変数に格納したいんですがどうやればいいんでしょうか set newtime = (type time.txt) set newtime = & type time.txt 等々色々試してみたんですが上手く行きません。 上手くsetする方法をどうぞお教えください。 実行環境はWindows7 Ultimateです。
set /p newtime= <time.txt
>>780 助かりました、ありがとうございます
勉強不足もいいところ、しっかりと学習してきます
>>780 横からだが...
こんなことできるんだ。
俺も勉強になったよ。
( set /p x= set /p y= ) < a.txt もよろしく
質問させてください batファイルでこれらを複数起動させたいんですが うまくいきません・・ CMDウインドウが開いて残るだけです start "G:\FREESOFT\ProxN45j\Proxomitron.exe" start "G:\FREESOFT\sleipnir166\Sleipnir.exe" start "G:\FREESOFT\DoeView06120\Jane2ch.exe" start -wait "G:\FREESOFT\TF1610\TF.exe" ウエイトオプションをつけて一気じゃなくて前のソフトの HDDカリカリが終わってから起動したいんです。 なにとぞお力をおかしください 願います
start /? START ["タイトル"] [/Dパス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/WAIT] [/B] [コマンド/プログラム] [パラメータ] start "タイトルはなんでもいい無くてもいいが二重引用符は残すこと" /wait "G:\FREESOFT\TF1610\TF.exe" カレントごと移動する必要があるならこっち start "" /d "G:\FREESOFT\TF1610" /wait "TF.exe" start "" /d "C:\TEMP" /wait "G:\FREESOFT\TF1610\TF.exe"
>>784 > HDDカリカリが終わってから起動したいんです。
無理。
スリープ入れるとか、HDD使用率を監視するとか、それっぽい事は出来なくもないが。
startを連続で入れるんじゃ無理。
ウエイトオプションをつけて、一気じゃなくて
ウエイトオプションをつけて一気、じゃなくて
どっちで切るかで意味合いが変わってくるなw
質問するなら紛らわしい書き方するな
> HDDカリカリが終わってから起動
どちらにせよこれを厳密にやろうとすると面倒。てかバッチで無理じゃね?
まあどっちにせよ>>785-
>>786 で聞きたいことの解答は足りてるぽいな
今度は「スリープ入れるってどうすれば…」とか聞いてきそう
>>787 > ウエイトオプションをつけて、一気じゃなくて
> ウエイトオプションをつけて一気、じゃなくて
start の /wait の事だから結局一緒だと思うが。
sleepの-cってこういう用途に使えん?
>>785 ありがとうございます
しかし、startupdelayerを導入することにしました。
これから設定してみます。 応えてくださったのにすみません
みやすたーとあっぷもよいでしょうが高機能っぽいのです
また質問させてください
ファイラはTF.exeを使っているのですが
あるフォルダを選択して右クリック送るから
そのフォルダの名前を取得してその中に同名からフォルダを
任意の階層で作るbatがほしいのです。
あとZドライブなどのルートの中のフォルダにある
txtファイルをすべて切り取って任意の場所に
スマートに移動するbatもほしいのです。
よろしくお願いします
for dir set if md copy del 組み合わせてがんばれ
TF使ってないから
%cd% のようなカレントディレクトリのフルパスでなく、ディレクトリ名だけが欲しい時には どのようにすれば良いでしょうか。 c:\123\456\789\abc.txt の時に abc.txt のある 789 だけ得る、のような場合です。
%cd:\=&set cdname=%
abc.txtにならん?
>>797 set cd=c:\123\456\789\abc.txt
とかしてなければabc.txtにはならないよ。 %cd%はカレントディレクトリだから。
>>795 パスから親ディレクトリ名が欲しいなら call とか for で %~dp とかの
修飾子と
>>796 みたいな set の置換を組み合わせると出来るかな
callやバッチの引数からなら %~0\..\ とか。
修飾子については call /?
for /f "delims=\ tokens=4" %I in ("c:\123\456\789\abc.txt") do echo %I
そりゃ4番目ってわかってりゃいいけどw
前もって\の数を数えてtokens=4を動的にすれば済む話だな
for %I in ("c:\123\456\789\abc.txt") do for %J in ("%~pI") do echo %~nxJ
>>801 796は昔からある方法だが…
知らないの?
それとも理解できないのかな?
805 :
795 :2011/07/13(水) 20:54:40.46
レスありがとう
>>796-804 、ザックリの返答でごめんなさい。
>>796 大変参考になりました。
>>798 %~0\..\ を使った完全版を考えて見ましたがちょっと分かりませんでした。
>>799 ,802
4つ目とは限らないので \ を数えないといけないのですが数える方法が
わかりませんでした。
>>803 『ECHO は <ON> です。』になってしまいました、意図は分かるのですが
%~dpJ や %~tJ が良くてなぜ %~nxJ が『ECHO は <ON> です。』になるのかが分かりません……。
806 :
795 :2011/07/13(水) 20:56:20.50
連投失礼、とりあえず次が意図した結果になったので上手く行きそうです。 set nanika=C:\123\4 5 6\7(((8)9\あいう\abc.txt for /f "usebackq delims=" %%i in (`echo "%nanika%"`) do ( set dirpath=%%~dpi ) set dirpath=%dirpath:~0,-1% %dirpath:\=&set dirname=% echo %dirname% ありがとうございました。
for %I in ("c:\123\456\789\abc.txt") do for %J in ("%~pI.") do echo %~nxJ
set a=c:\123\456\789\abc.txt %a:\=&set b=% call set a=%%a:\%b%=%% %a:\=&set b=% echo %b%
809 :
795 :2011/07/13(水) 22:13:46.75
さらなるフォローありがとうございます。
>>807 なるほど、理解できました。
言われてみればしごく当たり前というか自分で気がつけという話でしたね、お手数かけました。
>>808 call で尻尾を削るとか発想が全く無かったです。
私にとって「 call で変数」は敷居が高いです……。
あと、気がついたので自己レス
>>806 みたいにするなら set _dummy=%dirpath:\=&set dirname=% のようにしておいた方が安全というか
後で面倒が無さそうですね。
for %a in (.) do echo %~nxa
for %I in ("c:\123\456\789\abc.txt\..") do echo %~nxI
set "_dummy=%dirpath:\="&set "dirname=%"
set a=c:\123\abc.txt\789\abc.txt %a:\=&set b=% call set a=%%a:\%b%=%% %a:\=&set b=% echo %b%
'c:\123\abc.txt\789\abc.txt'.parent.basename
set a=c:\123\456\789\789 %a:\=&set b=% call set a=%%a:\%b%=%% %a:\=&set b=% echo %b%
set a=c:\123\456\789\abc.txt& rem. %a:\=&set b=%& call set a=%%a:\%b%=%%& rem. %a:\=&set b=%& echo %b%&
set a=c:\123\456\789\789& rem. %a:\=&set b=%& call set a=%%a:\%b%=%%& rem. %a:\=&set b=%& echo %b%& 456
echo hello | set /p s= が行けるかと思ったら駄目だった… for使わずこれくらい簡単に出力をキャプチャする方法はないのかな。
echo hello | ( set /p s= & set p)
echo hello | ( set /p sss= & set sss)
dir /b /on *.jpgを実行すると 001.jpg 002.jpg 003.jpg 004.jpg...といった結果になりますが コレを逆さの004から呼び出す事は可能ですか 004.jpg 003.jpg 002.jpg 001.jpg
/o-n
>>822 ヘルプの-降順ってそういう意味だったんですね
ありがとうございます
勉強になる良スレsage
pushd /? call /? set /?
ファイルが指定された場合に自分自身を呼んだ後に終了してないから 以降のコマンドがそのまま実行されてるな。 ファイルパスがおかしくなるからエラーで実行はされないけど。
ってかリンク先のページになにしてるかも書いてあるじゃん
バッカもんだな
とおりもんみたく
pushd "%~dp1" ならわかるんですが その次の2つ行は一体何をしてるのか・・・
echo して pause でもすりゃ 文字通り、見ればわかる
>>831 %0はそのバッチ自身。あとはわかるな?
以下のバッチを実行してみればわかるよ set /a n+=1 pause %0
>>832-834 スレみたりechoしてみたらわかりました
再帰処理のようなことをしてたのか!
で↓で再帰を抜け出してる・・・とふむふむ
dir /a:d "%~1">NUL 2>&1
if %errorlevel% EQU 0 goto top
>>825 このバッチファイル自身を、渡されたファイルを格納しているディレクトリ名に変えて改めて実行する
その上の行で
渡されたのがディレクトリか、それ以外のファイルかをチェックしてるので
最終的に欲しいのはディレクトリ名なのだろう
しかし、そのコードって
>>825 の後にgoto :eofは要らないのだろうか
いらん
x:\ なんてやると無限ループしない?
ディレクトリを渡す時に最後に\を付けるとNGなんだよな。 dirは\があってもなくても同じ結果だけど %~nx1は結果が違う。
なるほど
841 :
デフォルトの名無しさん :2011/07/28(木) 02:14:53.60
教えてください。あるフォルダ(C:\test)の中に、毎日、日付名(yyyymmdd)で サブフォルダが作成されます。一年以上前のサブフォルダ以下を削除したいのですが、 調べながら自分で作ってみて一部よくわからないところがあります。 CD "C:\test" SET YYYY=%DATE:~0,4% SET MM=%DATE:~5,2% SET DD=%DATE:~8,2% SET /A Z=(%YYYY%-1)*10000+%MM%*100+%DD% FOR /D %%A IN (*) DO ( IF %%A LSS %Z% ( RD /S /Q %%A ) )
842 :
841 :2011/07/28(木) 02:16:59.09
つづきです。 上記の「FOR /D %%A IN (*) DO 」の部分があまりよくわかっていません。 (*):カレントディレクトリ(C:\test)以下の、/D:フォルダに対して %%A:FORで繰り返される分の各ディレクトリ名(例 C:\test\20110728) に対して、 DO以下を実行しなさい。という解釈であっているでしょうか?
FOR /?
>>842 分からないなら、FORの中身をECHOなどに変えてみることだ。
>>841 > SET /A Z=(%YYYY%-1)*10000+%MM%*100+%DD%
/a オプション使った場合は一部の特殊なもの(%random%とか)を除いて
変数を%で囲む必要ないぞ。
このためforの中でcallとか遅延展開とか使わずに計算できたりと便利。
日時の計算をバッチでやんな forfiles使え
いや、もっとメジャーで他にも応用が利くPerlを使え
ここは日本語もロクに通じない役に立たないクズばかりだな 聞いてねーことペラペラレスしてんじゃねーよバカ
あらーおおバカさん現る
おおクズさんじゃねーの
%DATE%を日替わり前後で参照すると1日か1月か最大1年ずれるよ
そんなこと聞いてないからほっとけば 好きにさせれば
どうせバカには通じないから
Cドライブ以外から実行したら誤動作するんじゃね
そんなこと聞いてないからほっとけば 好きにさせれば
それよりも8〜9月はエラー出るし Win2kだと誤動作するし
ここは日本語もロクに通じない役に立たないクズばかりだな 聞いてねーことペラペラレスしてんじゃねーよバカ
8〜9日もダメだな
set outText=****************改行****************改行**************** echo %outText%>>test.txt test.txt中身予定 **************** **************** **************** こんな感じに作りたいと思っているんだけどなかなかうまくできない 助けて!
環境変数に改行文字 site:scripting.cocolog-nifty.com
>>860 @echo off
rem 改行を入れる
set LF=^
rem
set caption=説明文%LF%説明文2
SET /P x=%caption%<NUL>out.text
goto :EOF
こうすると結果
out.text
説明文1
となってしまうorz
だから遅延展開使えと書いてあるのでは?
SETLOCAL ENABLEDELAYEDEXPANSION SET x=aaa!LF!bbb ECHO !x!>>out.txt こういう方法ですね。改行を入れることができました。ありがとうございます。 gdgdとすみませんがテキストで開くと↑のようなマークになってしまうんですが回避する方法はないでしょうか・・・orz
同様に SET x=aaa!CR!!LF!bbb みたいにCRを入れる 改行はCR+LFだからね
>>864 CR入れたら無事直りました!
時々TEXTで開くと↑になってるのってUNIX系でかかれた文章だったんですね
どうもありがとうございました!
866 :
841 :2011/07/29(金) 03:58:35.53
ありがとうございます! >851 0時前後に実行するとまずいということですね。 >854 バッチをCドライブに置くか、 cd /Dでドライブ移動するようにします。 >856,858 なぜエラーが起きるのでしょうか? 8月になったら試してみます。
SET MM=%2011/07/31:~5,2% SET DD=%2011/08/01:~8,2% だとMMDDは0701になる set /a 08
868 :
デフォルトの名無しさん :2011/07/29(金) 09:14:58.15
>>863-865 crやlfってtimeやerrorlevelみたいな標準の環境変数なの?
それとも遅延環境変数有効時に、!でくくった場合のみ使える環境変数?
そうだよ
870 :
868 :2011/07/29(金) 18:48:43.31
普通の変数
set/?
873 :
727 :2011/07/30(土) 18:07:14.45
@REM FIZZBUZZ.BAT もっと短く100Bytes @SET/A N+=1,F=N*N%%3,B=N%%5,S=N*F @IF %B%==0 SET S=%F:1=%Buzz @ECHO %S:0=Fizz%&IF %N% LEQ 99 CALL %0
@@@@@@@@@@@@ECHO @@@@@@@@@@@@
ここで質問していいことかわからないのですが、質問です。 copy "%~1" "E:\ts" ↑のようなbatで2.5GBくらいのTSファイルをコピーすると ファイルが破損してしまいます(ハッシュで確認) 軽めのtxtをコピーさせたところ破損していなかったので、ファイルの容量が問題になっていると思います どうすれば破損させずに大きいファイルをコピーできるのでしょうか。 コピー先もコピー元もそれぞれNTFSフォーマットされたUSB2.0の外付けHDDです。
/B バイナリ ファイルとして扱います。 /V 新しいファイルが正しく書き込まれたか検査します。
>>876 できました。めちゃくちゃ初歩的なことで質問して申し訳ありませんでした
copyで隠しファイルがコピーできないんですが、こういうときはattribで変えてやるんでしょうか?
879 :
デフォルトの名無しさん :2011/07/31(日) 17:06:41.61
xcopy /?
880 :
841 :2011/08/02(火) 00:06:34.43
841です。 バッチ実行してみると、確かにエラー起きました。。。 「無効な数値です。・・・」 調べてみると、08 や09 は、8進数と認識して、 エラーが起きるようですね。。 以下のように書き換えて対応してみます。 SET YYYY=%DATE:~0,4% SET MM=%DATE:~5,2% SET DD=%DATE:~8,2% SET /A MM=1%MM%-100 SET /A DD=1%DD%-100 SET /A Z=(%YYYY%-2)*10000+%MM%*100+%DD% ・・・というか上記は慣れてる人じゃないと気付かないですよね。。 ここに聞いてよかったです!ありがとうございました!!
set d=%date% set /a z=%d:~-10,4%%d:~-5,2%%d:~-2%-20000
set /a z=%date:/=%-20000
基本的な質問かつバッチでもないのでスレ違いかもしれませんが 教えていただけますか。 拡張子を除いたファイル名だけの一覧を取得したい のですが、 dir /b /a-d "パス" では、 aaa.jpg bbb.txt などと拡張子が入ってしまいます。 aaa bbb となるようにするにはどうすれば良いのしょうか。 スレ違いでしたら誘導お願いいたします。 よろしくお願いいたします。
for /f "delims=" %i in ('dir /b/a-d "パス"') do @(echo %~ni)
>>884 早速のレスありがとうございます。
できました!
こうやるんですね…。
勉強致します。
ありがとうございました。
感動した!
バッチファイル上でプログラムを指定して開く事は可能ですか ダブルクリックで開かれたくないので.batを.datに変えてcallしようと考えているのですが
>>887 > バッチファイル上でプログラムを指定して開く事は可能ですか
はい
> ダブルクリックで開かれたくないので.batを.datに変えてcallしようと考えているのですが
意味がわからん
>>887 > バッチファイル上でプログラムを指定して開く事は可能ですか
意味がわからん
> .batを.datに変えてcallしようと考えているのですが
できない
> ダブルクリックで開かれたくないので
デフォルト動詞をeditかダミーに変える
batfile\shell
@="edit"
cmdfile\shell
@="none"
サブルーチンとして呼び出し専用のバッチを単独実行されたくないとかじゃね? callする直前にリネームして終了時に再リネームするとか。
cmd < hoge.dat とかは?
for /f %%i in (hoge.dat) do %%i
そっちの方が簡単だな、今までメンドイ事をしていた俺 メインに call yobidasuyo.cmd yobarete hoge こんな感じで書いて サブの頭に set jikkou=%1 if not "%jikkou%"=="yobarete" ( echo 単独で実行しないで pause goto :EOF ) こンな感じで受けてたわ
forで読むのもcmdに入力するのもgoto不可能
だからできないと言っただろ?
callについてしか言ってないだろw
cmd.exeをコピーしてdat.exeにリネームして 中の.batを.datに書き換えて dat.exe /c hoge.dat ならできるぞ
.datを.batにリネームするほうが簡単だな
.datをコピーして.batにリネームしてコールして終わったら削除というのは処理的にはだめなんだろうか
cmdで現在のmsecって取得できる? 全体の処理にどのくらいかかってるのかが知りたいので
echo %date:/=%%time:~0,-3%
>>897 DOSコマンドでバイナリファイルの置換なんてできるの?
空気読めてない様だ
906 :
902 :2011/08/05(金) 11:38:29.84
cmd.exeのクローンの中身を書き換えるんでしょ であれば、バイナリファイルの編集手段が必要ではありませんか?
そういう事を言ってるんじゃないんだがね。 分からないならいいよw
>>901 dateとtimeの間に日替わりしたら…
for文で取得した変数[%%i]と文字列のあいまい比較ってどのようにすれば良いですか? ↓このような事をしたいです。 for 〜 ( if %%i==aaa* goto EXIT )
>>911 比較文字列に正規表現っぽいものを使いたいのなら findstrでerrorlevelみて判定。
その例みたいに単純に先頭3文字で比較判定したくて簡単にやるにはこんなのとかかな。
for %%i in () do (set a=%%i
〜
)
if %a:~0,3%==aaa (
)
ifもfindstrも判定する文字列にダメ文字があったりするが。
遅延展開
>>912 ありがとうございます
if文前に事前にsetで適当な変数に入れておけば簡単な比較は出来そうですね
>>912 指摘されてるが、遅延展開しねーとerrorlevelの数値が変わらんぞ
echo aaab | findstr /b "aaa" && echo 1 || echo 2
ifでerrorlevelの判定するのに%errorlevel%でやってる奴いるの?
≠0や==0で判定したいときは使うんじゃね
馬鹿がもう一人
cmd /c exit 1 if errorlevel==0 echo %errorlevel%
cmd /c exit 1 if %errorlevel%==0 echo %errorlevel%
>>919 ≠0をやるのは多少めんどくさいが大抵の場合1未満と1以上で事足りる
if errorlevel 1 (echo 1以上) else (echo 1未満)
バカがもう一匹湧いてるな
≠0や==0で判定したいときは使うんじゃね
if==1==1 echo =
おまいら!遅延展開!かcall :subか使わんとでけんのか?
DOSの言語仕様リファレンスってどこにあるのでしょうか?
windows\help\ntcmds.chm
930 :
928 :2011/08/09(火) 23:45:57.45
>>929 windows7ではそのファイルはなかった…でもありがとう!
Microsoft Download Centerとかでntcmds.chm配布してくれないかなー
931 :
928 :2011/08/10(水) 00:01:36.72
そろそろMSはcomspec=powershell.exeすべき
無用だ
そんなもんがコマンドリファレンスに載るわけがない たわけが insideもんだろ
ソフトを再起動させるバッチを作りたいのですが 終了はtaskkill で終了させたのですが ソフトの起動が以下の文を実行すると、両方ともコマンドプロンプトが立ち上がったままになっていまいます。 A c:\soft\freesoft.exe exit B start c:\soft\freesoft.exe exit exeファイルの実行後、コマンドプロンプトが終了するような方法ってないでしょうか。
>>935 言語仕様のことが何で「コマンドリファレンス」になってる
その区別もつかんのか
>>935 は、
>>933 の「WinCmdRef.chm は各コマンドのリファレンスみたいで」に
対するレスだろ。
test.bat --------------------------- @echo off set fname="test" start test.bat pause --------------------------- test1.bat --------------------------- @echo off echo "%fname%" set fname=testl echo "%fname%" pause --------------------------- なぜかウインドウが無限に出てくる。
> start test.bat
教訓:紛らわしい安直な名前を使うな
>>942 ファイル名を間違えていのか・・・
修正したら無限にウインドウが出てこなく成った
for /d %%A in (*) do (
マルチコア非対応のプログラム
)
マルチコア非対応のプログラムを文で実行すると
コアを1つしか使わない為、CPU使用率が25%でしか動作しない
バッチで常に4つのプログラムが並列に動作しているようにする事は可能?
あほにはむり
for /d %%A in (*) do ( start マルチコア非対応のプログラム )
948 :
デフォルトの名無しさん :2011/08/26(金) 09:46:49.99
スレ復活上げ
タスクスケジューラの特定の名前のタスクの前回の実行時刻を取得する方法無いですかね? 録画の為に目的時間の5分前に起動するようにタスクを設定しているのですが たまにその5分の間に手動でスリープさせてしまって録画をミスることがあります。 その手動操作の時に5分以内に実行されたタスクが無いかどうか 確認して実行済みが無い場合だけスリープに入るようにしたいのです。 自動で入るスリープに関してはタスク実行時に電源スキームを 書き換えてスリープに入らないようにしているので問題は無いのですが 問題はうっかりやってしまう手動(バッチコマンド起動)によるスリープです。 OSはWin7です。
set x=%~1 という処理で %1がaaa&bbbだった場合 set x=aaa bbb というふうに&で分かれてしまいます xに%1の値をセットするにはどう書けばいいんですか。 set x="%~1" だとxに""が入ってしまいます。
set "x=%~1"
>set x=%~1 >という処理で >%1がaaa&bbbだった場合 >set x=aaa >bbb >というふうに&で分かれてしまいます どのバージョン?
そんなバージョンないわ
for変数だとならんがcall変数だとなるよ
んじゃ for %%1 in (%1) do set x=%%~1 でいいよ
call set x=%%~1
1日1個出来るファイル(yyyymmdd.log)を、60日たったものから削除するバッチを作ることになりました。 タスクで毎日起動させて削除したいのですが、ヒントはいただけないでしょうか?
dir/? for/? del で十分だろ
まず日本語文法を勉強して下さい。
>>960-961 レスありがとうございます。
何分バッチ作成初体験なので戸惑っております。
とりあえず
dir *.log /o-d
でファイルを表示させるところまではわかったのですが、
その後のfor文とdel文の書き方がよくわかりません……。
ソーランソーラン
すなおにPowerShellつかうのがよさそうだけど… dir /b /o-d *.log > temp.$$$ for /f "skip=30" %%i in (temp.$$$) do del %%i del temp.$$$ バッチファイルはこんな感じか。 このサンプルだとログのおいてるフォルダにバッチファイルが あることになってるけど、そこは適宜置き換えて。
おれがいつも使ってるヤツ↓ for /f "skip=30" %%i in ('dir /o-d /b *.log') do del %%i
unixのshellのバッククォートみたいな事できるんだな、初めて知った。 helpにちゃんと載ってたけどw
unixのshellのバッククォートみたいな事 for /f "usebackq skip=30" %%i in (`dir /o-d /b *.log`) do del %%i
みなさんレスありがとうございました。
>>968 とほぼ同じ感じで提出したところ、
「やっぱ日付を取得して30日前以前のを削除するようにして」
と言われたので今度は日付の取得にチャレンジしたいと思います。
動作的には変わらないはずなのに何なんだ_| ̄|○
1日にログが2個以上できてたら、だめじゃん。(←何なんだ)
60日前以前は、ほんとの日付けか、それともファイル名の日付か悩みどころ&gt;仕様&lt; なので、とりあえず、ファイル名は必ずファイルの日付と合ってると仮定しよう。 しかしそれでも、YYYYMMDD.txtは file1_YYYYMMDD.txt とか YYYYMMDDhhmmss.txt に変わってくる。
ガチでやるなら ・今日の日付とファイルのタイムスタンプを文字列で取得 ・文字列を切り貼りしset /aを駆使して0000(2000?)年1月1日からの経過日数を算出(当然閏年も考慮) ・引き算して30以上なら削除 なんだろうけどあまりにもだるすぎるな。バッチで日付操作は鬼門。 PowerShellとは言わないまでもせめて判定部分にVBS使えないのか。 >today = Now >d = DateSerial(Year(today), Month(today), Day(today)-30) forfiles使用可なら一発なんだけどそれも無理なんだろうな > forfiles /P "E:\logs" /M *.log /C "cmd /c if @isdir==FALSE del /s @path" /D -30
俺もVBSを使うほうが無難だと思う。
959はバッチファイルじゃなきゃいけないんだろうか? 日付計算プログラムを作ってそれを使うとか。 例のブランコの絵が思い浮かぶな…。
VBSでmain(){return 200;}とか出来るのか? >>日付計算プログラムを作ってそれを使うとか -- vbs1.vbs -- Set objfs = CreateObject("Scripting.FileSystemObject") Set objfolder = objfs.GetFolder("work") str1 = objfolder.Path & vbCR datetmp = DateAdd("h", -2, Date & " 16:49:00") str1 = str1 & datetmp & vbCR MsgBox(str1) For Each objfile In objfolder.Files datetmp1 = DateDiff("s", datetmp, objfile.DateCreated) If datetmp1 <= 53 Then str1 = objfile.DateCreated & " " & datetmp1 & " " & objfile.Name & vbCR res = MsgBox(str1, 1) If res = 2 Then ' = Cancel ? Exit For End If 'objfs.DeleteFile objfile End If Next 'MsgBox(str1)
batにA.txtドロップ @ren A.txt B.txt B C Dren C.txt A.txt E このようにしたいのですが Dでどう打てばC.txtをA.txtにリネームできるでしょうか? ちなみにAの名前には半角スペースや()-色々入る可能性があります。 bat初心者で恐縮ですが、どうかアドバイスのほどよろしくお願いします。
すいません、修正です。今@は↓にしています。 ren *.txt B.txt
>>980 作成したいファイル名がAではなくて
ドロップしたファイル名を総称してAのつもりで書きました。
Aの名前はドロップしたファイルによって様々です。
これを1ファイル毎にbatで書きなおすのは大変です。
なので質問をさせて頂きました。よろしくお願いします。
set fname="%~nx1" ren %fname% B.txt ren C.txt %fname%
@ren %1 B.txt B C Dren C.txt "%~nx1" E
凄い!
>>983 これも試した事あったんですがDをまた%1だけ書いて失敗してました。
ありがとうございます、勉強になります。
もしよかったらもう1つ伺いたいのですが
このbatと編集したいtxtファイル全てが同一フォルダにあったとして
batを押したら全てのtxtが、@〜Eを1ファイルづつ処理するように
組むにはどう書けばよいでしょうか?
Aが無いのには誰も突っ込まないのか
for %%a in (*.txt) do ( set fname="%%a" @〜E )
setlocal enabledelayedexpansion
>>987 Aは書き忘れました。実際には他のプログラム、exeが入ります。
ごめんなさいです。
>>988 ありがとうございます!ちょっとまだ成功はしてないですが
@〜Eを1ファイルづつやってくれてるみたいでこの構文でいけそうです!
forについても%%変数名やDOの展開が分からなかったのでまた勉強になりました。
この度は本当にありがとうございました。
使わんでもいいもの使うからだろ for %%I in (*.txt) do ( @ren %%I B.txt B C Dren C.txt "%%~nxI" E )
あと数回トラブルだろな
>>982 と
>>988 >>983 と
>>988 そして
>>991 全部やってみたのですが、全てB.txtが存在せず
コマンドの構文が違ってると出てしまいました。
それはつまり@のA→B.txtから出来ていないという事でしょうか・・・
for %%I in (*.txt) do (
ren %%I B.txt
プログラムのパス(B.txtからC.txtを新たに生成するもの)
del B.txt
ren C.txt "%%~nxI"
)
pause
これなら
>>991 さんがいう使わんでもいいものを使ってない?
かもしれないので出来ると思ったんですが難しい・・・
何度もしつこくて恐縮なんですが
どうかヒントだけでも教えてもらえないでしょうか?
何度もすいません
ファイル名に空白があるとか @ren "%%~I" B.txt
うおおおおおおおおおおおおおおおおおおおできたあああああああああああああああああああああああああああ
>>994 はい、あります!ありがとうございます!
けど何で
>>993 の1行目と2行目は複数処理になって急に出来なかったんだ…
ちょっと削りながら試してみます。
皆様どうもありがとうございました!!
996 :
995 :2011/09/12(月) 23:29:51.47
ドロップのときはドロップハンドラが空白があると""を付けてくれるが、 forのときは、空白があっても""を付けてくれない 仮令for in ("*.txt")とやっても駄目
う
んこ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。