【.cmd】 バッチファイルスクリプト %11 【.bat】at TECH
【.cmd】 バッチファイルスクリプト %11 【.bat】 - 暇つぶし2ch102:89
15/05/06 18:36:51.79 kduajoAs.net
93の方法で上手くいったのですが、欲が出てきてしまいました。
サブフォルダにあるファイルについてもできないか試していましたが、うまくいきませんでした。
試したのは
setlocal EnableDelayedExpansion
set FILES=
for /R "E:¥aaa" %%x in (*.bbb) do set FILES=!FILES! "%%~fx"
hoge %FILES%
です。%%~xを%%~fxや%%~$PATH:xに変えてみましたが、だめでした。
何かいい方法は無いでしょうか?

103:89
15/05/06 19:36:01.98 kduajoAs.net
hoge.exeが使ってはいけない文字を使っていたようでした
ファイル名、ファルダ名を変えたらうまくいきました

104:sage
15/05/07 02:20:57.96 kCRc77b6.net
なんちゃってインストーラーを作成したく下のように書いたのですが、管理者として実行するとcmdが一瞬開いた後閉じてしまいます。
調べてみたのですがどうしたらいいか分りませんでした。どうやったら上手くいくのかどなたかご教示して頂けないでしょうか?
その1.dllとその2.dllは作成したバッチと同じディレクトリにあります。

@echo off
cd %~dp0
copy /-y その1.dll C:\Windows\SysWOW64\
copy /-y その2.dll C:\Windows\SysWOW64\
cd \Windows\SysWOW64
regsvr32 その1.dll
regsvr32 その2.dll
exit

105:デフォルトの名無しさん
15/05/07 02:30:30.14 VKPrOxig.net
@echo off

@echo on
exit

pause
にしてチェックしてみるとか

106:デフォルトの名無しさん
15/05/07 08:06:10.91 VSUD10fG.net
pause入れて一行ごとに確かめるしかないでしょうなあ

107:デフォルトの名無しさん
15/05/07 11:09:54.36 KWH/KWxF.net
C:ドライブ以外に置いてあると引っかかりそうなのは
cd %~dp0

cd /d %~dp0
cd \Windows\SysWOW64

cd /d C:\Windows\SysWOW64

108:デフォルトの名無しさん
15/05/07 16:36:18.43 96jPVZUT.net
エラーとは関係ないけどバッチからregsvr32実行するなら/sオプション


109:付けないと 「成功しました」ってメッセージボックス出てそれ閉じるまでバッチの動作止まっちゃうね



110:sage
15/05/07 22:31:45.98 kCRc77b6.net
>>101,>>102 試してみたのですが変わらず一瞬で閉じてしまいました。
>>103 C:ドライブ上ですら上手くいかないので最初は付けていたのですが外しました。
>>104 /s は付けないほうが成功しましたと出るので、成功できてることが確認できていいかなと思いまして付けてませんでした。
自己解決しました。ファイル名だと動かなくなくことは知っていたのですが、どうやらフォルダ名も半角の括弧があると、バッチを右クリックで管理者として実行してもバッチとして認識されないようでした。
基本的なところが間違っていたようです。
色々とお騒がせしてすいませんでした。

ダブルクリックだと半角括弧あっても動くのに・・・

111:デフォルトの名無しさん
15/05/07 22:59:18.82 VSUD10fG.net
じゃあそれcmd.exe壊れてるんじゃね
一行ごとにpause入れて止まらんとか聞いたことないぞ

112:sage
15/05/07 23:15:37.73 kCRc77b6.net
そうなのでしょうか?
PCが2台あるのでregsvr32で試したのですが両方が同じ結果でした。
フォルダ名に半角括弧の( を付けて、管理者権限が必要なコマンドが入ったものを試していただけないでしょうか?
)だけだとなぜかうまくいきました。

113:デフォルトの名無しさん
15/05/07 23:24:22.25 yEqXNtFT.net
"("を含むパス上にあるbatファイルを、「管理者として実行」で正常実行できない
URLリンク(social.msdn.microsoft.com)

114:sage
15/05/07 23:44:02.20 kCRc77b6.net
>>108 ありがとうございます。OS入れ直しかと思ってた。

115:デフォルトの名無しさん
15/05/08 00:08:07.40 0odcB8A0.net
一般的にシステムを作るときには、
パス・ファイル名には、半角英数字と、
_ アンダーバーだけを使う
日本語、空白、/ \ などは、
外人が作ったアプリや他のOSで、バグを起こす
外人は日本語のことまで考えて、
アプリを作っていないため

116:sage
15/05/08 00:43:49.96 1YMiCyWS.net
>>110肝に銘じます

117:デフォルトの名無しさん
15/05/08 01:22:21.82 DmYJm/wo.net
>>110
> 日本語、空白、/ \ などは、
> 外人が作ったアプリや他のOSで、バグを起こす
逆になるべく日本語フォルダ、ファイル名にしておけば
海外製ウィルスが動作しなくなるかな

118:デフォルトの名無しさん
15/05/08 09:58:38.71 5fQ7r8Aw.net
>>112
イカタコとかは無理じゃね

119:デフォルトの名無しさん
15/05/08 16:37:33.99 U2au088Y.net
そもそもウイルスが壊してくるのはWindows内だったりするからいみないんだよなあ
全部日本語の窓互換OS開発すればありかもしれない

120:デフォルトの名無しさん
15/05/08 22:38:18.81 KwMVu8yd.net
>>110
Program Files(x86)とかいう名前をつけたのは外人だろ?

121:デフォルトの名無しさん
15/05/12 23:56:25.43 McgsoQJk.net
ドライブの空き容量を簡単に調べる方法はありますか。
dirを使えば最後に出ますが。

122:デフォルトの名無しさん
15/05/13 00:19:46.38 IRvX1zB3.net
fsutil volume diskfree c:

123:デフォルトの名無しさん
15/05/13 00:44:59.35 ++gYyXti.net
>>>117
ありがとうございます。
FSUTIL ユーティリティには管理者特権が必要です。
でしたが。

124:デフォルトの名無しさん
15/05/13 01:05:56.71 7VTqgTSP.net
wmic logicaldisk c: get freespace

125:デフォルトの名無しさん
15/05/15 21:00:38.39 FSXq3hA5.net
行の最後が\記号の場合、その\記号を削除する方法を
探しています。
E:\の場合はE:にしたいのです。
理由は、aria2c -dオプションでドライブ指定[E:\]の場合正常に動作せず、
[E:]で動作する。ためです。
よろしくお願いします。

126:デフォルトの名無しさん
15/05/15 21:37:19.52 G1rKhc+A.net
>>120
Googleでバッチファイル、テキストファイル、置換のキーワードでヒットするサイトを参考にしたら?

127:デフォルトの名無しさん
15/05/15 21:58:52.22 XJBM+btE.net
「行の最後」って何なのか分からないけど、仮に環境変数に入れた文字列だとすると
set x=E:\
if "%x:~-1%" equ "\" set x=%x:~0,-1%

128:デフォルトの名無しさん
15/05/15 22:00:53.20 j/48pAYL.net
call /?

129:デフォルトの名無しさん
15/05/15 22:30:21.33 FSXq3hA5.net
>>121
>>122
>>123
ありがとうございました。

130:デフォルトの名無しさん
15/05/16 00:42:02.22 O4uFm57f.net
>>119
ありがとうございます。表示できました。
wmic というコマンドは知りませんでした。
wmic /? でみると巨大なコマンドなのに。

131:デフォルトの名無しさん
15/05/18 19:51:05.44 a89GM3eE.net
for文の/Fオプションである
"delims="と"tokens=*"の違いがわかりません
どちらも区切りなしで全てが対象の気がするんです
どのように使い分けてるんでしょうか?

132:デフォルトの名無しさん
15/05/18 20:11:44.07 a89GM3eE.net
例えば文字列の長さ取得するvbsをbat内で取得する時、こんな感じだと思いますが
for /f "usebackq tokens=*" %%i in (`cscript //nologo "len.vbs" "hoge"`) do set les=%%~i
結果を受取る最後の部分、les=%%~iとles=%%iの違いが解りません
~の有無で何が変わるんしょう?
"usebackq tokens=*"と"usebackq delims="の使い分けと
les=%%~iとles=%%iの違いが解んないです

133:デフォルトの名無しさん
15/05/18 20:35:07.70 /17k7IVe.net
出力が
"c:\program files\aaa\bbb.exe"
みたいな空白を含み両端が""で囲まれている時に
%%iだと"c:\program files\aaa\bbb.exe"になり
%%~iだとc:\program files\aaa\bbb.exeになるという違いがあるから
受け取るのが数値を表した文字列の場合はどっちも一緒

134:デフォルトの名無しさん
15/05/18 22:47:45.42 clhkHSwG.net
for /f "tokens=*" %i in (" hoge") do echo %i

135:デフォルトの名無しさん
15/05/18 23:43:20.25 a89GM3eE.net
>>128
ちょっと確認とれないけど、言ってる意味はわかりました
ありがとうございます
>>129
スペースの有無で結果が変わりますね
違いがわかりました。ありがとうございます

136:デフォルトの名無しさん
15/05/20 17:18:51.87 /oDHFiER.net
条件に当てはまる複数のフォルダの移動を行いたいのですが上手く行きません。
ご助力をお願いいたします。
目的:任意フォルダ配下のサブフォルダから、行頭にの”[AAA]”があるフォルダのみを
別の任意フォルダに移動させたい。行頭文字には[ ]含みます。
移動元の親フォルダはd:\moto と仮定します。移動先フォルダはd:\saki とすると
処理したい該当するフォルダはd:\moto\[AAA]* となります。
set d_moto=d:\moto       /* 移動元親フォルダ*/
set d_saki=d:\saki       /* 移動先フォルダ*/
set path_moto=%d_moto%\[aaa]*  /* 移動の対象フォルダ*/
for /d %%f in (%path_moto%) do move %%f %d_saki%
該当サブフォルダまでsetしたのはこの他の箇所で使うので定義しています。
またfor /d %%f in (%d_saki%\[aaa]*) do move %%f %d_saki% でも構文エラーが出ます。
ワイルドカードの記述がよく判っておりません。

137:デフォルトの名無しさん
15/05/20 17:26:51.76 /oDHFiER.net
× set path_moto=%d_moto%\[aaa]*  /* 移動の対象フォルダ*/
○ set path_moto=%d_moto%\[AAA]*  /* 移動の対象フォルダ*/
失礼しました。上記レスには他にも誤字がありますがご勘弁願います。

138:デフォルトの名無しさん
15/05/20 17:41:33.73 Wa0xSOyJ.net
>>132
実行したとき、コマンドプロンプトにどういうメッセージが出てたのか分からないので想像になるが
多分半角空白が含まれるフォルダ名のところでエラーが出てるんじゃない?
%%f -> "%%~f"
%d_moto%と%d_saki%には半角空白が含まれる可能性がないとするなら上の変更でいいと思う
あと、パス名ファイル名に大文字小文字の区別はないので>>132の上も下も全く同じ


139:



140:デフォルトの名無しさん
15/05/20 19:23:26.75 /oDHFiER.net
>>133 レスありがとうございます。
for /d "%%~f" in (%path_moto%) do move "%%~f" %d_saki%
for /d "%%f" in (%path_moto%) do move "%%f" %d_saki%
どちらもダメでした。コマンドプロンプト・ウインドウ上でのエラー表示になりますが、
「"%~f" の使い方が誤っています。」と表示されます(又は"%f" )。
バッチでもエラーメッセージは表示されますが、バッチウインドウ自身が強制終了して
閉じてしまいバッチ上でのメッセージは確認出てきておりません(同じ内容だと思いますが)。
%環境変数%を使わないでコマンドプロンプト上でテストしてみると、行が変わって内部の
move文で半角スペースが有るため以下のパターンでは「コマンドの構文が誤っています。」と
表示されます。
for /d %~f in ("d:\moto\[AAA]*") do move %~f "d:\saki" ※%~f → %f でも
for /d %~f in ("d:\moto\[AAA]*") do move %~f d:\saki    同じ結果でした
for /d %~f in (d:\moto\[AAA]*) do move %~f d:\saki
後出しで恐縮ですがOSはWindows7 x64、アドミン&管理者モードで実行しています。

141:デフォルトの名無しさん
15/05/20 19:39:25.40 Wa0xSOyJ.net
>>134
ちゃんと説明しなかったけど、まあこう書けばヘルプ見て分かると思ったんだけど
for /d %%f in (%path_moto%) do move "%%~f" %d_saki%
for /?
pause /?

142:デフォルトの名無しさん
15/05/20 20:21:43.80 /oDHFiER.net
お手数をおかけしました。ヘルプ確認もしなかった事をお詫びいたします。
set d_moto=d:\moto            /* 移動元親フォルダ*/
set d_saki=d:\saki              /* 移動先フォルダ*/
set path_moto=%d_moto%\[aaa]*  /* 移動の対象フォルダ*/
for /d %%f in (%path_moto%*) do move "%%f" "%d_saki%"
で正常動作しました。setした際に行尾に\を入れていなかったためか、
%%~f ではコンソール画面が強制終了してしまいましたので、%%fにしております
ご回答とお付き合い頂き、ありがとうございました。

143:デフォルトの名無しさん
15/05/20 21:09:45.02 RmJGSs4fi
バッチにC言語みたいな注釈いれるなよ
まさかそのまま実行したのか?

144:デフォルトの名無しさん
15/05/21 08:17:34.17 xGT/OYAlF
>>136
> %%~f ではコンソール画面が強制終了してしまいましたので、%%fにしております

>>135 をよく見ろ。2個とも %%~f にしたら駄目だ

145:デフォルトの名無しさん
15/05/22 18:53:43.10 dDrrBwBt.net
ファイル名にファイルの更新日時を付けてやろうと
set I="F:¥hoge¥test.txt"
set tem1=%~tI
set tem2=%tem1:"/"=%
set tem3=%tem2:" "="-"%
set tem4=%tem3:":"=%
rename %I% test%tem4%.txt
としてみたのですがうまくいきませんでした。
何かいいアイデアをお願いします。

146:デフォルトの名無しさん
15/05/22 19:08:31.56 H1v/SBhd.net
for %%i in (%I%) do set temI=%%~tI

147:デフォルトの名無しさん
15/05/22 19:09:49.99 H1v/SBhd.net
修正(変数Iなんか使うから間違えた)
for %%i in (%I%) do set temI=%%~ti

148:デフォルトの名無しさん
15/05/22 19:57:31.64 rsRBQIIs.net
set I="F:\hoge\test.txt"
call :x %%I%%
goto :eof
:x
set "tem1=%~t1"
set "tem2=%tem1:/=%"
set "tem3=%tem2: =-%"
set "tem4=%tem3::=%"
rename "%~f1" "%~n1%tem4%%~x1"

149:デフォルトの名無しさん
15/05/22 20:29:14.08 dDrrBwBt.net
>>141, >>142
すげー
あんなに悩んでたのに一瞬で解決するなんて
ありがとう

150:デフォルトの名無しさん
15/05/23 01:08:59.65 idOG0Vl/.net
>>143
ご参考
大量にある、下位階層まで変更したい場合、
Flexible Renamer というフリーソフトもある

151:デフォルトの名無しさん
15/05/23 09:30:59.77 sl1qWZ50.net
>>144


152:デフォルトの名無しさん
15/05/23 09:45:09.89 EIZIQejy.net
>>144
> 大量にある、下位階層まで変更したい場合
>>141 の応用 (for /r) でいいだろ

153:デフォルトの名無しさん
15/05/30 17:32:47.82 KPmzF3IM.net
指定日時まで一定間隔で繰り返すバッチはこれで大丈夫ですか?
:RETAKE
set D=%DATE%
set T=%TIME: =0%
if not %D% == %DATE% goto RETAKE
set YYYYMMDDHHMMSS=%D:~-10,4%%D:~-5,2%%D:~-2%%T:~0,2%%T:~3,2%%T:~6,2%
:LOOP
   start "hoge" /wait "hoge.bat"
   if "%YYYYMMDDHHMMSS%"=="20150531000000"(
   goto NEXT
   ) else (
   ping localhost -n 600 > nul
   goto LOOP
   )
:NEXT

154:デフォルトの名無しさん
15/05/30 17:43:26.77 KWAqrQi+.net
そういうのは俺ならタスク(スケジューラ)を使うけど
jt.exeとかschtasksとか

155:デフォルトの名無しさん
15/05/30 19:41:05.67 h+FcqRuX.net
>>147
LOOP部分だけど、それだと指定日時に一致しない場合は延々ループし続ける
AよりBが小さいのようにGEQやLEQなどの比較演算子のほうがよさそう
if %YYYYMMDDHHMMSS% LSS 20150531000000 (
数値比較の場合はダブルクォートは外したほうがいい

156:デフォルトの名無しさん
15/05/30 20:49:16.17 elL7Ij3fn
>>149
高々32ビット整数しか演算出来ないのに
そんなの、まともに比較出来ると思うのか?

157:デフォルトの名無しさん
15/05/30 20:55:20.63 NQWNmwnG.net
高々32ビット整数しか演算出来ないのに
そんなの、まともに比較出来ると思うのか?

158:デフォルトの名無しさん
15/05/30 21:09:00.59 NQWNmwnG.net
試してみろ
if 20150530999999 LSS 20150531000000 echo aho
if "20150530999999" LSS "20150531000000" echo baka

159:デフォルトの名無しさん
15/05/31 01:38:25.44 jBtv10qY.net
>>147
日時判定のif文を二段階にしたら
最初年月日で、次に時分秒で

160:デフォルトの名無しさん
15/05/31 03:52:31.64 6BGakI3g.net
ダブルクォートを外さなければ問題ないんじゃね
数字だけだと数値比較、それ以外は文字列比較
32ビット整数を超える数値なら文字列比較で

161:デフォルトの名無しさん
15/05/31 04:52:13.09 ntMrQIQA.net
:LOOP
  if "%date%"=="2015/05/31" goto NEXT
  start "hoge" /wait "hoge.bat"
  ping localhost -n 600 > nul
  goto LOOP
:NEXT
でよくね
厳密にやりたかったら日時型すらないバッチなんぞ捨ててしまえ

162:デフォルトの名無しさん
15/06/02 11:53:10.99 kNAcHIfI.net
特定のフォルダ配下の空のフォルダだけを抽出して処理したいのですが上手く行きません。
特定のフォルダ配下の子フォルダの中身にはどんなファイル、孫にあたるサブフォルダ(※1)、とも存在しない物だけが
本処理対象(退避場所へ移動させる)となります。
※1 サブフォルダは存在してても中身が空の物は”例外処理(フォルダの削除)”の対象とします。
一言でフォルダの中身が空と行っても子フォルダとサブ以下では処理が異なります。子は本処理、孫以下は例外。
d:\temp
 ├aaa(ファイルはあり)-aaa1(ファイルは空)-aaa2(ファイルは空)
 ├bbb(ファイルは空)-bbb1(ファイルはあり)
 ├ccc(ファイルは空)-ccc1(ファイルは空)
 ├ddd(ファイルはあり)
 ├eee(ファイルは空)
 ├fff(ファイルは空)-fff1(ファイルは空)-fff2(ファイルはあり)
 ├ggg(ファイルはあり)-ggg1(ファイルはあり)-ggg2(ファイルは空)
本処理対象 :eee
例外処理対象:aaa1,aaa2,ccc,ccc1,ggg2 
処理対象外 :aaa,bbb1(bbb毎),ddd,fff2(fff fff1毎),ggg(ggg1毎)
(つづく)

163:デフォルトの名無しさん
15/06/02 11:56:57.04 kNAcHIfI.net
set dir_path=d:\temp
set cnt=1
loop-st:
if cnt==5 goto loop-end
for /d /r %dir_path% %%D in (\*) do ( //サブフォルダを含む指定配下のフォルダの全リストを取得
if not exist "%%D\*nul" ( //サブフォルダが無い場合対象とする
  for %%S in (%%D\*.*) do (    //さらに中にファイルが存在し無ければ本処理対象 ※2
     本処理
    )
 ) else (
   for %%S in (%%D\*.*) do (    //さらに中にファイルが存在し無ければ本処理対象 ※2
     例外処理
  )
)
set /a cnt=%cnt%+1
:loop-end
って感じで記述したのですが※2で「無ければ」の書き方判らなくて情け無い事に断念。if not exitですと
*.*指定をするとバッチが落ちる(コマンドプロンプト窓が強制的に終了しエラーも確認しにくい)ため上手く行きません。
またfor文の中で強引に goto とラベルを記載するやり方はエラー(※2)となりました。
※2 ()の使い方…と表示してたのは確認出来ました。
なおフォルダの階層は最大4です。aaa2は階層3となります。また上記では例外中の例外なcccに対してもまだ未対応です。
cccは子フォルダですが、空のサブフォルダしかないパターンで本来あってはいけないフォルダとなりますので
例外処理行き(ccc,ccc1共に削除)です
batでは困難でしょうか?正解コーデングのご呈示をお願い申し上げます。

164:デフォルトの名無しさん
15/06/02 19:30:38.92 KyjHTQN8.net
>>157
eeeの本処理(退避場所に移動させる)って言うけど
eeeはファイルのフォルダも無い空のフォルダだよね?
退避させる意味あるの?

165:デフォルトの名無しさん
15/06/02 21:40:21.15 KyjHTQN8.net
@echo off
pushd d:\temp
set bak=c:\bak
set level=-1
call :sub "z:\test" proc1
call :sub "z:\test" proc2
popd
goto :eof
:sub
setlocal
if "%2" neq "" set proc=%2
pushd %1
set /a level+=1
if %level% lss 5 (
for /d %%i in (*.*) do (call :sub %%i)
) else (goto :eof)
set cnt=0
for /d %%i in (*.*) do set /a cnt+=1
for %%i in (*.*) do set /a cnt+=1
popd
call :%proc% %1 %level% %cnt%
endlocal
goto :eof
:proc1
if %2 equ 1 if %3 equ 0 md %bak%\%1 2>nul&rd %1
goto :eof
:proc2
if %3 equ 0 rd /s/q %1
goto :eof

166:デフォルトの名無しさん
15/06/02 21:48:29.76 KyjHTQN8.net
訂正
call :sub "z:\test" proc1 → call :sub . proc1
call :sub "z:\test" proc2 → call :sub . proc2

167:デフォルトの名無しさん
15/06/02 23:07:01.41 mV5sXZYH.net
全角空白 + 半角空白
または
半角空白 + 全角空白

2ch推奨NGワードなので避けませう

168:デフォルトの名無しさん
15/06/03 00:33:22.13 PtFxkubO.net
>>157 サブフォルダ名に半角空白を許す変更(行数の制限のため複数コマンドを1行に詰めてる所あり)
@echo off
set bak=z:\bak
set level=-1
call :sub "d:\temp"
goto :eof
:sub
setlocal&pushd %1
set /a level+=1
if %level% gtr 4 goto :eof
set subdir=0
for /d %%i in (*.*) do call :sub "%%i"
set cnt=0
for /d %%i in (*.*) do set /a cnt+=1
for %%i in (*.*) do set /a cnt+=1
popd
if %cnt% equ 0 (
if %subdir% equ 0 (
if %level% equ 1 (call :proc1 %1) else (call :proc2 %1)
) else (call :proc2 %1)
)
endlocal&set subdir=1
goto :eof
:proc1
md %bak%\%1 2>nul&rd %1
goto :eof
:proc2
rd /s/q %1
goto :eof

169:デフォルトの名無しさん
15/06/03 07:12:21.00 WCFfLif6.net
cd /d "d:\temp"
set "d1=%cd%\"
for /f %%i in ('"dir /ad /s /b 2> nul"') do set "d2=%%~fi" & set "d3=%%~dpi" & call :x & popd
goto :eof
:x
pushd "%d2%"
for /f %%j in ('"dir /a-d /s /b 2> nul"') do goto :eof
for /f %%j in ('"dir /ad /s /b 2> nul"') do goto y
if "%d1%" == "%d3%" goto z
:y
例外処理
goto :eof
:z
本処理

170:デフォルトの名無しさん
15/06/04 21:39:02.33 E36uiKc8.net
>>163
3行目
for /f "delims=" %%i in ('"dir /ad /s /b 2> nul"') do set "d2=%%~fi" & set "d3=%%~dpi" & call :x & popd
8行目
for /f %%j in ('"dir /ad /b 2> nul"') do goto y

171:デフォルトの名無しさん
15/06/06 19:29:25.50 iCqfzRte.net
自分で環境変数のpathに追加したコマンドはbatファイルでは使えませんか?
firefoxのアドオンをつくろうと思い、アドオンのインストールを自動化するために
以下のbatファイルを作成しました。
@echo off
:loop
jpm xpi
wget --post-file=@helloworld-0.0.1.xpi http:/localhost:8888/
sleep 5000
goto loop
しかし、次のようなメッセージがループします。
"'jpm'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。"
"'wget'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。"
"'sleep'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。"
jpm,wget,sleepはコマンドプロンプトからだと3つともちゃんと動きます。なのでbatでは自分で追加したコマンドは
ダメなのかと思ったので質問しました。
環境はwindows 7 Home Premium 64bit sp1です。

172:デフォルトの名無しさん
15/06/06 20:59:24.45 hSodQv/B.net
> 自分で環境変数のpathに追加したコマンドはbatファイルでは使えませんか?
使える。キミが何か間違っているが、必要な情報を提示していないので、それ以上の事は不明。

173:デフォルトの名無しさん
15/06/06 21:36:49.50 iCqfzRte.net
>>166
僕が怪しいかなと思う部分を上げてみます。
1,batファイルはコマンドプロンプトでコマンドが期待通り動いた作業ディレクトリに置いています。
2,環境変数のPathに追加したというのは、システムのプロパティ→詳細設定→環境変数で設定


174:していました。 ログインしているユーザーの環境変数のPathにjpm,sleeepのパスを、システム環境変数のPathにwgetのパスを設定していました。 3,パスの書き方は、コマンドの実行ファイルがあるディレクトリのフルパスをコピーして";"で区切っています 3,ログインしているユーザーは管理者 バッチファイルの先頭で「SET PATH=%PATH%;追加パス」を追加したら一応動いたのですが、 必要ではないんじゃないかとなんとなく思って気になってしまいます。



175:デフォルトの名無しさん
15/06/07 00:35:36.48 TwcY/oci.net
いい加減XPもなくなっただろうし
timeoutが市民権を得てもいいと思うんだけどなー

176:デフォルトの名無しさん
15/06/07 01:59:54.71 uKDfTV9k.net
batファイルの最初に
echo %path%
を入れてデバッグしよう
sleep → timeout

177:デフォルトの名無しさん
15/06/07 03:08:07.23 u7+f65Ad.net
>2,環境変数のPathに追加したというのは、システムのプロパティ→詳細設定→環境変数で設定していました。
これ設定しても既に動いてるプロセスには即反映されないから
プロセスを再起動したり、一旦ログアウトしないといけないこともある
そこら辺で混乱があったのかもな
SET PATH=%PATH%;追加パス

SET PATH=追加パス;%PATH%
の方が良かったりすることもある
ファイル名がぶつかったとき呼び出したいものが呼び出せないこともあるから
バッチ実行時の最終的なパスがどうなってるのか確認したかったら
@echo off
path&pause
:loop
とかやっとくといい

178:デフォルトの名無しさん
15/06/07 15:23:50.35 MMVoxWft.net
>168
>169
>170
アドバイスありがとうございます。
>170さんの言うとおり、パソコンを再起動したらちゃんとpathが反映されました。
みなさんのアドバイスを参考にして、あと、短いけどなるべく使いまわせるように役割ごとにばらそうと考え
最終的にこういう風にしました。
====auto_addon_install.bat=====
@echo off
call confirming_path.bat
:loop
call jpm_xpi.bat
wget --post-file=@helloworld-0.0.1.xpi URLリンク(localhost:8888)
timeout 5
::instead of "sleep 5000"
goto loop
====confirming_path.bat=====
@echo off
:: confirming path 1 as not \n
path
:: confirming path 2 as \n
echo %path% | sed s/;/\n/g
pause
exit
====jpm_xpi.bat====
@echo off
jpm xpi
exit
==================
これからアドオンをつくってみようと思います。ありがとうございました。

179:デフォルトの名無しさん
15/06/07 16:49:41.54 LTwn0E2k.net
呼び出す子バッチ側は exit /B で終了させないと親バッチへ戻ってこないよ
処理結果を確認する意味で終了コードを利用してもいいかもね
call jpm_xpi.bat
if ERRORLEVEL 1 (echo Exit Status %ERRORLEVEL%) & pause & goto :EOF
wget 以下略
====jpm_xpi.bat====
@echo off
jpm xpi
if %ERRORLEVEL%==1 exit /B 1
if %ERRORLEVEL%==0 exit /B 0

180:デフォルトの名無しさん
15/06/07 20:59:15.64 MMVoxWft.net
>>172
そうだったのですか。
確かにpath確認用のconfirming_path.batをした後に、親バッチへ戻ってきていませんでした。
しかし、jpmの仕様なのか、confirming_path.batをコメントアウトしただけで,jpmの方は親バッチへ戻ってきしまいました。
僕がjpmを別のbatに移そうと思ったのは、メインのバッチファイルでjpmを実行するとjpmを実行した時点で処理が終了してしまうからです。
もしかしてこれが、jpmのバッチファイルがexit /Bを使わずに親バッチへ戻ってくることとなにか関係があるのでしょうか。
終了コードの書き方も参考にさせて頂きます。

181:デフォルトの名無しさん
15/06/11 06:24:09.49 zvXhuG+H.net
dir /s /b | grep AAA | xxx
ここでxxxは過去に出力したログを検索してヒットしたら出力しない、
何度この行を実行しても常にユニークな出力しかされないということをやりたいんですが
うまい方法ないですか

182:デフォルトの名無しさん
15/06/11 08:30:10.02 o9tryPI0.net
>>172
ありがとうございます。引数渡しもあるのですね。
勉強になりました

183:デフォルトの名無しさん
15/06/15 18:12:46.03 GJ2N2cUz.net
set /A を使うと計算できますが、
ゼロから始まる数字は10進でなく8進法扱いされおかしな結果になります。
ゼロが何個も続く可能性のある数字文字列から最初のゼロを取る
簡単のやり方を教えて下さい。

184:デフォルトの名無しさん
15/06/15 19:34:37.53 PeZ0fZ8f.net
>>176
簡単な方法は知らんが、愚直な方法としては %d% に数値が入ってるという前提で
:zero_suppress
if "%d:~0,1%" equ "0" if "%d:~1%" neq "" set d=%d:~1%&goto :zero_suppress
又は
for /f "delims=0" %%i in ("%d%") do set d=%%i
if "%d:~0,1%" equ "0" set d=0

185:デフォルトの名無しさん
15/06/15 20:03:52.06 IzyZ+arn.net
>>176
set "a=0123"
set /a "b=1%a%*2-2%a%"
echo "%a% --> %b%"

186:デフォルトの名無しさん
15/06/15 22:25:16.68 C49nk280.net
for /f "tokens=* delims=0" %i in ("%a%") do set /a a=%i-0

187:デフォルトの名無しさん
15/06/16 01:55:22.19 xfn3wJg6.net
>>177-179
ありがとうございます。
勉強になりました。
>>178さんはすぐに意味がわかりませんでしたが、やってみて納得、
set "a=0123" のように "" で囲めるのは初めて知りました。
>>179さんはエラーが出ますが、

188:デフォルトの名無しさん
15/06/16 05:24:35.09 kBkkj2GI.net
バッチなら %i を %%i にする
>>179 の -0 と /a は不要

189:デフォルトの名無しさん
15/06/16 17:38:49.75 fIwvDifY.net
>>177の下のはダメなので取り消し
>>181
とっちゃダメ

190:デフォルトの名無しさん
15/06/16 20:07:51.10 kBkkj2GI.net
>>182
不要だよ

191:デフォルトの名無しさん
15/06/16 20:35:30.33 kBkkj2GI.net
ああ、a=0 の場合か
でも a が空だと不味いぞ

192:デフォルトの名無しさん
15/06/16 21:06:14.29 kBkkj2GI.net
これなら a が空でもOKかな
for /f "tokens=* delims=0" %%i in ("%a%-0") do set /a a=%%i
バッチじゃなくて直接入力だと "%a%" に展開されるのでNG

193:デフォルトの名無しさん
15/06/26 06:01:05.05 sKB1AmZZ.net
PS講座にしろよw
Tech TIPS:バッチファイルの基本的な使い方 - @IT
URLリンク(www.atmarkit.co.jp)

194:デフォルトの名無しさん
15/06/27 23:07:54.24 5TA1TjZr.net
あるディレクトリ(サブディレクトリ含む)以下の特定の拡張子(.jpgや.pngなど)を
一括でコピーしたいのですが、xcopyやrobocopyでどのように記述すればいいのでしょうか?
ヘルプを見ると、除外するオプション(/EXCLUDE)は記載されていましたが
この方法だと指定するのが多くなりすぎて不便で困っている状態です
ご教示よろしくお願いします

195:デフォルトの名無しさん
15/06/28 12:19:29.88 Mckk18LI.net
>>187
robocopy /s コピー元 コピー先 *.jpg *.png

196:デフォルトの名無しさん
15/06/28 16:57:40.34 hilWFqBu.net
for %%i in (jpg gif png) do echo copy *.%%i dest\

197:182
15/06/29 22:19:20.20 xFjGO25h.net
遅れましたがアドバイスありがとうございました

198:デフォルトの名無しさん
15/06/30 09:40:16.25 T2wiUbpe.net
メモ帳を起動してフォーカスが外れたら勝手に終了させるってどうやったらいいですか

199:デフォルトの名無しさん
15/06/30 10:23:04.09 T2wiUbpe.net
"ウインドウからフォーカスが外れたら"です
補助ツールの起動用として汎用的に使いたいと思ってます

200:デフォルトの名無しさん
15/06/30 12:20:24.58 28t7zSj6.net
VisualBat - 窓の杜ライブラリ
URLリンク(www.forest.impress.co.jp)

201:デフォルトの名無しさん
15/07/01 01:32:24.09 MjkDd52T.net
>>191
そういう処理はバッチファイル向きじゃないのでAutoHotkeyとかのツール使った方がいいと思う

202:デフォルトの名無しさん
15/07/02 17:26:26.46 UInPCaD/.net
batで、%1に[秘]が含まれ�


203:トいたらaaa.exeを実行する ってどうやって書けばいいですか?



204:デフォルトの名無しさん
15/07/02 18:15:40.14 W1iwlrdH.net
find のerrorlevel

205:デフォルトの名無しさん
15/07/03 02:00:44.30 DFRnLTHh.net
echo;%1 | find "[秘]" > nul && aaa.exe
じゃね?

206:デフォルトの名無しさん
15/07/03 19:45:25.30 UldOsxiv.net
set x=%1
if not %x:秘=%' == %1' aaa.exe

207:デフォルトの名無しさん
15/07/04 07:18:12.44 vLkJmuOy.net
必要に応じてクイック起動からコマンドプロンプトを起動しているのですが、
起動のたびに指定のバッチファイルを自動で実行させる方法ないですか。

208:デフォルトの名無しさん
15/07/04 12:58:13.63 qSlQKSp6.net
>>199
実行したいバッチファイルの最終行に「cmd.exe /k」コマンドを一行追加し、そのバッチファイルを実行すれば良い。
例えば以下の内容のバッチファイルは、基本的にSendToフォルダ(右クリック→「送る」)に入れておくものだが、
好きなフォルダで直接ダブルクリックしても良い。(ちなみに2行目のCOLORコマンドは文字を見やすくするためのもの)
@ECHO OFF
COLOR 0F
TITLE "%~f0"
ECHO 【コマンドプロンプト起動】
%~d1
CD "%~f1"
IF ERRORLEVEL 1 CD "%~p1"
ECHO ---------+---------+---------+---------+---------+---------+---------+
ECHO 右クリックしたファイルが存在するフォルダ(または右クリックしたフォルダ)をカレントディレクトリとして、コマンドプロンプト画面を起動しました。
ECHO この画面を閉じるには、通常のコマンドプロンプト画面の場合と同様に、画面の右上隅にある[X]をクリックするか、EXITコマンドを入力して下さい。
ECHO ---------+---------+---------+---------+---------+---------+---------+
VER
CMD.EXE /K PROMPT $G $T (%USERNAME%@%COMPUTERNAME%) "$P"$_$G
EXIT

209:デフォルトの名無しさん
15/07/04 13:08:57.29 s7zvO/Zm.net
>>199
コマンドプロンプトのショトカットを右クリックし、プロパティを開いて
リンク先が~cmd.exe"になってるところを、"~cmd.exe" /K "バッチフルパス.bat"
って書き換えればいいんじゃね?

210:デフォルトの名無しさん
15/07/05 22:30:41.38 CaTht0J/.net
windows8.1で Bluetoothを PCの設定の変更 PCとデバイス Bluetooth OFFにする ONにする
と言う バッチ処理教えて  時々 Bluetooth機器が阿保になるので

211:デフォルトの名無しさん
15/07/09 00:33:36.89 x+M3PwTo.net
hoge1.bat、hoge2.batを同時に動かしてこの2つが終了した後にコマンド1を動かそうと思っています。
それで.
start hoge1.bat
start hoge2.bat
コマンド1

start /w hoge1.bat
start /w hoge2.bat
コマンド1
を試してみましたがダメでした。
何かいいアイデアはありませんか?
よろしくお願いします。

212:デフォルトの名無しさん
15/07/09 01:33:00.66 EFIo5QkZ.net
hoge1|hoge2

213:デフォルトの名無しさん
15/07/11 23:54:44.10 zNJDNBRR.net
パイプがどうしてそうなるのですか?

214:デフォルトの名無しさん
15/07/12 00:31:32.75 JwgGsFih.net
パイプは「同時に起動して」標準出力と標準入力を繋げる機能なのは分かるよね。
そしてつなげた標準入出力は別に使う必要は無いわけで。

215:デフォルトの名無しさん
15/07/12 00:34:11.82 JwgGsFih.net
書き忘れたけど礼を言うなら>204にね。

216:デフォルトの名無しさん
15/07/12 12:41:45.69 yyKtP/0V.net
バッチでできるかわからないのですが
windows8.1でBluetoothキーボード、マウスを使用しています
しばらく使用しないとキーボードが自動的に休止になってしまい
以降 Bluetoothを一旦OFFして再度ONしないと接続ができません。
これをマウスで操作すると5,6回の操作が必要です
バッチでBluetoothをOFF ONするようなコマンドは作れるんでしょうか?

217:デフォルトの名無しさん
15/07/12 14:06:18.11 leLDDrPp.net
>>208
対象のハードウェアIDを調べてdevcon.exe使えばバッチから可能か


218:も 簡単に書くと、事前にデバイスマネージャーでBluetooth機種のハードウェアIDを調べる devcon.exe disable "対象のBluetooth機種のハードウェアID" devcon.exe enable "対象のBluetooth機種のハードウェアID" みたいな流れね ハードウェアIDがわからないならあきらめろん



219:デフォルトの名無しさん
15/07/12 14:09:25.86 cZduJ3g5.net
>>208
詳しくないが、DevConが必要らしい

220:デフォルトの名無しさん
15/07/12 14:39:15.93 ZoJlZfIr.net
DevConって管理者権限必要なんだけどキーボードもマウスもBTならOFFにした後
ONにするときにUACのダイアログを操作するデバイスなくない?

221:デフォルトの名無しさん
15/07/12 15:40:00.13 ZoJlZfIr.net
あ、バッチファイル自体を管理者で実行すればいいのか。
206は無視してください…

222:デフォルトの名無しさん
15/07/12 16:00:47.21 PO2rWK+p.net
>>206
ありがとうございます
そういことか
ごっちゃな出力でパニクってました
パイプを順次に起動してと思い込んでいました

223:デフォルトの名無しさん
15/07/13 02:19:24.08 oxguYBiy.net
Win10インスコ時のProgramFiles(x86含む)を除いてProgramFilesの移動、ジャンクションするbatどうすれば
URLリンク(www.natzworks.com)
だとWinインスコ時のも移動させちゃうからアプリストアなど動かない

224:デフォルトの名無しさん
15/07/13 13:24:27.28 ck7CB2gy.net
>>209
動かん 先ずは止めてみようと思い
C:\User\i386\devcon.exe disable "HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&0002056e_PID&102d&Col01"
pause
exit
と打ったが 止まらん 
ハードウェアIDが間違ってるの?詳細の一番上の一行だけど

225:デフォルトの名無しさん
15/07/13 13:53:24.86 RWTt7ci0.net
>>215
記号類で引っかかってるのかも
^& のように ^ 記号でエスケープしたらどう

226:デフォルトの名無しさん
15/07/13 21:54:00.22 ck7CB2gy.net
>>216
この表現わからない。

227:デフォルトの名無しさん
15/07/13 22:54:36.16 RWTt7ci0.net
ハードウェアIDの後半のいくつかのアンド記号のこと
}_VID&0002056e_PID&102d&Col01

}_VID^&0002056e_PID^&102d^&Col01
のように ^ 記号でアンド記号をエスケープする案を示した
バッチファイルからみてアンド記号はコマンド扱いなの
※ 文字化け対策のため & 記号を全角文字表記したので、実際には半角に直して
それと無関係なもの止めるとまずいからハードウェアIDの確認方法も書いておく
大まかな方法だけどコマンドプロンプトから実行して、該当するか確認して
devcon hwids *| find /I "HID"

228:デフォルトの名無しさん
15/07/13 23:24:19.93 9jM/hgDM.net
HIDって分かっているなら
devcon findall HID\*

devcon find HID\*
とか
devcon hwids HID\*
の方が見当つけ易いんじゃなかろうか

229:デフォルトの名無しさん
15/07/14 00:05:27.15 xh4YNKiw.net
存在確認だけだから方法はなんでも
バッチ処理前提だから
devcon hwids *|find /I "HID"|find /I "0002056e"|find /I "102d"
if ERRORLEVEL 1 goto ERROR
if ERRORLEVEL 0 goto BEGIN
みたいに段階的にフィルタして絞り込む形もとりえるかなと
安全でやりやすい方法ならなんでもいいの

230:デフォルトの名無しさん
15/07/14 04:06:21.79 ayHDk+Pv.net
64 ビット版 Windows では完全には機能しません。 とあるが…
ここに64ビット版があるらしい
試してみてくれ
URLリンク(delphintipz.blogspot.com)


231:disabled.html



232:デフォルトの名無しさん
15/07/14 08:33:00.74 TwNFk+SS.net
cmdでAというフォルダ名を打ち込んだら
(コマンド名) "C:\Program Files\A" " D:\Program Files\A "←Aを代入
を実行してくれるbatって書けますか

233:デフォルトの名無しさん
15/07/14 09:05:32.61 gam5IC3n.net
書けます

234:デフォルトの名無しさん
15/07/14 12:17:36.57 TwNFk+SS.net
>>223
サンプルか参考batアドバイス宜しく

235:デフォルトの名無しさん
15/07/14 13:11:19.14 gam5IC3n.net
>>224
これでいいんじゃない?
set /p a=
command "c:\Program File\%a%" "c:\Program File\%a%"

236:デフォルトの名無しさん
15/07/21 07:37:07.25 7WzjAJ7x.net
こんな処理ってどう書けばいいですか
process_stdin.bat
:loop
 if 標準入力がEOFなら goto :eof
 標準入力から1行ゲットして%line%に保存
 echo [%line%]
goto loop
>dir | process_stdin
[aaa.txt]
[bbb.txt]
[ccc.txt]

237:デフォルトの名無しさん
15/07/21 15:14:00.60 J1lfUMsK.net
>>226
URLリンク(doudemoexe.com)

238:デフォルトの名無しさん
15/07/22 01:02:41.16 StAbR0Ko.net
bat内でsetを書くときは、最初に setlocal、最後にendlocal で囲んでいたが、
通常の使い方だとendlocal は必要なかった
.batが終わると endlocalなしでもbat内変数は消える
(setlocalは必要)
以上、今日の発見でした。

239:デフォルトの名無しさん
15/07/22 02:32:17.00 QnUh7Wvk.net
CALLされることを想定したらendlocalやっといたほうがいいんじゃないの?

240:デフォルトの名無しさん
15/07/24 19:24:15.05 dL+uOqe7.net
明示的に使う場面は多くはないな
shiftやメニューの頭に戻ってのループ処理、親への環境変数の継承くらいか
クリアするのが主目的で、別な値を再設定して別の目的で使用とかは混乱の元だからしない

241:デフォルトの名無しさん
15/07/24 20:24:24.41 +KpXt6+t.net
サブルーチンの再起呼び出しには絶対必要だけどね

242:デフォルトの名無しさん
15/07/24 22:44:30.28 YYoMYHtn.net
DOS窓の内容をファイルにするのに、よい方法はありますか?
今のやりかたは
DOS窓で右クリ→編集→すべて選択→エディタでctrl-V
もっと簡単にできる方法があれば教えて下さい。

243:デフォルトの名無しさん
15/07/26 18:02:41.27 YJ+DIjqN.net
サブディレクトリを含む、ファイル名の一覧を出力したい
フォルダは除きたい
▼入力
dir /a-d /s /b
上記から、ファイルのパス部分を削除したい
for /f "delims=" %%a in ('dir /a-d /s /b') do @set x=%%a
変数に代入
ここから
ファイル名のみ取り出す方法がわかりません
なにか、いい案ないでしょうか

244:デフォルトの名無しさん
15/07/26 18:07:54.57 YJ+DIjqN.net
>>232
|clip
>test.txt

245:デフォルトの名無しさん
15/07/26 18:38:20.15 9oxiKXd0.net
>>233
ファイル名のみってのが、カレントディレクトリまでのパス部分を削除したい、
じゃなくて本当にファイル名の一覧だけでいいなら
for /r %%i in (.) do @dir /a-d /b "%%~i" 2>nul 1>>list.txt
みたいな

246:デフォルトの名無しさん
15/07/26 18:52:45.58 mOMjtGtu.net
出力時にファイル名だけにすりゃいいんでない?
for /f "delims=" %%a in ('dir /a-d/s/b') do echo %%~nxa

247:デフォルトの名無しさん
15/07/26 19:59:32.63 YJ+DIjqN.net
>>235,>>236
どちらの方法でも出来ました。
本当に助かりました。ありがとうございます!!

248:デフォルトの名無しさん
15/07/27 23:53:38.32 T6/asWdF.net
>>234
ありがとうございます。
前もって保存すると決まっている時は、clipなどを使えるのですが
いろいろやっていて、後で保存する必要が出た場合に簡単な方法があればと思いました。
長くかかる、再現しないなどでもう一度やれない場合です。

249:デフォルトの名無しさん
15/07/28 02:43:47.39 +/z/OnI4.net
>>238
直接コマンドプロンプト使うんじゃなくてConEmuみたいなの使って


250:ログ取りオプション有効にして作業するとか



251:デフォルトの名無しさん
15/07/28 03:19:58.31 tjBt9FXm.net
>>238
DOS process LOG writer
URLリンク(www.vector.co.jp)
doslog.exeをパスの通っているところに置くか以下のbatと同じところに置いてbat実行
@echo off
set bat=%temp%\tmp.bat
set d=%date:/=%
set t=%time::=%
set t=%t: =0%
set dt=%d%_%t:~0,-3%
set log_file=/out %~dp0\doslog_%dt%.txt
echo @echo off>%bat%
echo :loop>>%bat%
echo set /p cmdline=%%cd%%^^^>>>%bat%
echo echo %%cmdline%%>>%bat%
echo %%cmdline%%>>%bat%
echo echo.>>%bat%
echo goto :loop>>%bat%
doslog cmd /k %bat%
del /q %bat%

252:デフォルトの名無しさん
15/07/28 03:33:41.10 tjBt9FXm.net
ちょっと訂正
@echo off
set bat=%temp%\tmp.bat
set d=%date:/=%
set t=%time::=%
set t=%t: =0%
set dt=%d%_%t:~0,-3%
set log_file=/out %~dp0\doslog_%dt%.txt
echo @echo off>%bat%
echo :loop>>%bat%
echo set cmdline=>>%bat%
echo set /p cmdline=%%cd%%^^^>>>%bat%
echo if not defined cmdline goto :loop>>%bat%
echo echo.%%cmdline%%>>%bat%
echo %%cmdline%%>>%bat%
echo echo.>>%bat%
echo goto :loop>>%bat%
doslog cmd /k %bat%
del /q %bat%

253:デフォルトの名無しさん
15/07/29 01:55:10.01 we/S8MTT.net
初歩的な質問になってしまって申し訳ありません。
処理したいファイルをD&Dでバッチファイルに放り込んで処理。
なんてのはよくあると思いますが、この「バッチファイルに特定のファイルを放り込む」

254:デフォルトの名無しさん
15/07/29 01:55:42.32 we/S8MTT.net
途中送信してしまいました。
この、「特定のファイルをバッチファイルに放り込む」
なんて動作はどのように実現スレばいいのでしょうか?

255:デフォルトの名無しさん
15/07/29 02:41:38.74 Mm94swUw.net
手でやれよw

256:デフォルトの名無しさん
15/07/29 03:39:06.21 ObQZT/sF.net
foo.batにbar.txtをD&Dするのは引数1にbar.txtを記述するのと同じ
foo.bat bar.txt

257:デフォルトの名無しさん
15/07/29 04:08:32.78 BtTeVh+H.net
それとも引数%1~%9の事を言ってるのか?

258:デフォルトの名無しさん
15/07/29 04:15:58.66 we/S8MTT.net
ありがとうございます、助かりました。

259:デフォルトの名無しさん
15/07/30 01:06:22.86 OBXU0hZ1.net
すいません、文字列抽出について質問させてください。
ファイルの中から特定の文字列を抜き出して、それらを結合するバッチを考えています。
凡例として以下のような内容のファイルから、特定文字列「hoge(.*,.*)」を全件抜き出し
それらを結合して最終的に「hoge(10,50)++hoge(90,110)++hoge(200,250)」といった文字列を
生成したいです。なお、#より右側はすべてコメント扱いです。
==========sample.txt
# サンプル情報、hoge()抽出
a = hoge(10,50).foo1(int).bar1()
b = hoge(90,110).hogehoge()
c = hoge(200,250).foo2(int).bar2()
a+b+c
==========
各種前提条件として、以下のようなものがあります
1. 対象文字列「hoge(.*,.*)」が出現する行数およびカラム位置は不定
2. 「hoge(.*,.*)」の()の中身は不定長
3. 「hoge(.*,.*)」が一行の中に出現するのは最大一回まで
4. 「hoge(.*,.*)」のさらに後に出てくる「()」の数は不定
5. 検索ファイルの中に「!」が出てくるか不明なため、極力遅延環境変数は使わない
findstrだと対象行丸々抽出になってしまい、「hoge(.*,.*)」の部分のみ抽出が
できないためforとset、callサブルーチンを組み合わせた文字列操作になるかと思います。
ただ「"hoge("がヒットしてから次に")"がヒットするまでの文字列を抜き出して変数に
格納する」という操作が、私なりに考えてみたもののわかりませんでした。
知恵をお貸しいただけないでしょうか。よろしくお願いします。

260:デフォルトの名無しさん
15/07/30 02:40:47.91 vXeGU9RJ.net
>>248
1char毎に分解してやれば出来ないことはないだろうけどbatでやるには不向き
正規表現で検索置換できるWSHを使った方がいい
@if (0)==(0) echo off
rem cscript //nologo /e:jscript "%~f0" <sample.txt
for /f "delims=" %%i in ('cscript //nologo /e:jscript "%~f0"^<sample.txt') do set x=%%i
echo %x%
goto :eof
@end
var stdin=WScript.StdIn;
var s,x,r=[];
while(!stdin.AtEndOfStream) {
s = stdin.ReadLine().replace(/#.*$/,"");
x = s.match(/(?:^|[^_a-zA-Z])(hoge\(.*?\))/);
if(x) r.push(x[1]);
};
WScript.Echo(r.join("++"));

261:デフォルトの名無しさん
15/07/31 01:23:28.16 k8QkrhUe.net
>>239
ありがとうございます。
ConEmu、DOS process LOG writer 調べてみます。

262:243
15/08/02 10:42:10.95 KSbBJgW9.net
>>249
遅くなってしまい申し訳ありません、レスありがとうございます。
ただ、個人的にはバッチのみを使って実現したいので、もう少し
足掻いてみようと思います。

263:デフォルトの名無しさん
15/08/02 17:51:00.45 vXJ+TZnT.net
Windowsで使えるsedやgrepなどを導入するしかないな
スクリプトも使わず正規表現な置換処理するのは無理があり過ぎる

264:デフォルトの名無しさん
15/08/02 19:33:22.43 KXoO9TBV.net
文字を分解して取り扱うにはbatはダメ文字というハードルが高くて挫折するから
まあ無駄な足掻きはやめたほうがいい
それと言語のコメントの判定はかなり厄介
#だって、 a="#"の場合はコメントじゃまずいだろうし
例えばエスケープを\とする場合、\#もコメントじゃなくなるだろうし
/* */で囲まれた中はコメントだとか、別の複数のコメントの記述があったり
複数行に跨ってコメントを許したりしてたら
もうそれこそ正規表現じゃ無理で簡単な言語解析のレベルになってしまう

265:デフォルトの名無しさん
15/08/09 10:30:39.27 SNWYDjIy.net
コマンドプロンプトでのバッチの質問です。
フォルダを作成して、その中にbatファイルだけを入れて実行しています。
エラーレベルが!ERRORLEVEL!と表示されたり 9009と表示されます。
aaaaa.exeは実際にはありません。
setlocal enabledelayedexpansion
for /f %%i in ('dir /b /od *.*') do (
aaaaaa.exe
echo "エラーレベル" !ERRORLEVEL!
)
将来的には、フォルダ内のファイル数毎に、直前のコマンドの成否でバッチを書きたいです。
aaaaaa.exeがないので、0以外のエラーコードが返ってくると認識しています。
どこの書き方(理解)が間違っているか教えてください。

266:デフォルトの名無しさん
15/08/09 18:28:50.34 Wo1alMTP.net
forは実行前の解釈時点で展開されるので
for文に入る前のerrorlevel値が表示される
aaaaaa.exeの復帰値が反映されるのはfor文を抜けた後になる
コマンドプロンプトから実行してるのなら
初回実行時と2回目以降繰り返して実行した時の表示は上記の理由により変わってくる

267:デフォルトの名無しさん
15/08/09 18:45:19.83 Q+5Xwfkz.net
サブルーチンにして判定をcall echo でやるほうがわかりやすいかな
終了コードの変化を比較するためnotepadを使用
バッチファイル自身がdirの結果に含まれるから最低1つはnotepadが開くと思う
@echo on
@rem 終了コードをリセット
cmd /C exit 0
for /f %%i in ('dir /b /od *.*') do call :SUB "%%i"
pause
exit
:SUB
@rem 存在しないアプリ
aaaaaa.exe
call echo %%ERRORLEVEL%%
@rem 存在するアプリ
start "" notepad.exe
call echo %%ERRORLEVEL%%
exit /B

268:デフォルトの名無しさん
15/08/09 18:45:50.76 Wo1alMTP.net
>>254
あれ、遅延環境変数展開の場合なのか
それなら正常にaaaaaa.exeの復帰値が正常に表示されるはずなんだけど?
そうなる理由はわかりません、ごめん
ちなみに9009は「ファイルがありません」エラー

269:デフォルトの名無しさん
15/08/09 18:54:25.00 Q+5Xwfkz.net
>>254
251のは空のnotepadが開くよ
対象を開くなら以下な感じで引数指定ね
start "" notepad.exe "%~1"

270:デフォルトの名無しさん
15/08/10 11:54:29.65 ma04BZuz.net
>>255>>257>>258
レスありがとうございます。
>>256 
スクリプト書いていただきありがとうございます。
:SUB側にcall echo %~1と書いて、ファイル名が取得できるのが確認できました。
知らないパラメータが多いですが、調べながら試しています。
助かりました。

271:デフォルトの名無しさん
15/08/10 23:31:07.37 hLG0BCKw.net
>>259
例示した call echo %%環境変数%% は環境変数展開のバリエーションの一つであって、
call echo call引数の展開 のようなcallの使い方は適切ではないです
>>254の質問時に echo "エラーレベル" !ERRORLEVEL! がうまく展開されないとのことだったので
forのカッコから外に出した上で別の展開方法を例示しただけで通常であれば !環境変数! でいい
call引数の値をechoするだけなら echo %~1 で用が足りる
call echo や call set などの使用法はアンドキュメントだし無理に使う必要もないけど
興味があるならぐぐって調べてほしい

272:デフォルトの名無しさん
15/08/10 23:38:50.99 hLG0BCKw.net
通常であれば !環境変数! でいい 、と書いた意味はわかると思うけど、
存在しない実行ファイルを指定しているのは通常ではないですよ、という意味ね
for /f %%i in ('dir /b /od *.*') do (
notepad.exe %%i
echo "エラーレベル" !ERRORLEVEL!
)
のように存在する実行ファイルを指定すれば問題なくERRORLEVEL取れるから

273:デフォルトの名無しさん
15/08/11 00:00:00.58 wwdlJScr.net
存在しない実行ファイルを指定するのが悪い、と言っている訳ではないので誤解なきように
コマンド検索パス上にあると思ったらなかったり、cd変わってて失敗するケースもあるだろうし
テストで意図的にやってるのは理解してますので

274:デフォルトの名無しさん
15/08/11 04:00:44.77 oWV7al3f.net
どういう場合に9009じゃなくて!ERRORLEVEL!と表示されるのか説明しないの?

275:デフォルトの名無しさん
15/08/11 08:08:17.57 kidrm6pf.net
はい

276:デフォルトの名無しさん
15/08/11 12:57:41.63 wwdlJScr.net
>>263
結果に違いがあった点については、質問者がデバッグ中に質問内容以外のこともしたのだと予想してる
その点が気になるなら質問者から聞いてほしい
9009 はcmd.exeが返したerrorlevelであって、存在しない実行ファイルからの
errorlevelは返るはずもないから、文字列がそのまま返ってくる
echoコマンドの正しい処理だから別に不思議はないが、なにをやって違いが出たのかは質問者しか知りえない
おそらくはこんな感じで微調整しながらやってて、考えがまとまらないまま質問したと予想する
aaaaaa.exe
echo "エラーレベル" %ERRORLEVEL%
aaaaaa.exe
echo "エラーレベル" !ERRORLEVEL!
まったく同一のコマンドであれば相違点は出ないはずだが、異なるのであれば違うことをやっていたのは自明
カッコの中で処理してるからややこしくなってるのではなく、異なる処理をしたにもかかわらずひとつの質問に丸めてることが原因と予想する
簡単に言うと、環境変数の遅延展開を知る前と知った後とで違いをごっちゃにしているだけ、情報がすべて出てないだけ

277:デフォルトの名無しさん
15/08/11 23:25:41.78 84vLNAhy.net
詳しくないけど、返り値で何とかしようとして
p = subprocess.Popen(cmdline, shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

my $pid = open3 $writer, $reader, 0, "$cmd"
の存在を知ったとき、あの時間はなんだだったのかと愕然とした。

278:デフォルトの名無しさん
15/09/06 00:59:23.17 YCgB583p.net
URLリンク(d.hatena.ne.jp)
ここに記載されてるbatの振り分けキーワードを、
そのフォルダにあるファイルのファイル名末尾4桁(+拡張子)で自動取得し、その名前でフォルダを作成
そこに移動させるにはどうしたら良いでしょう?
xxxx0013.xxx(4桁列までの文字は数十種類、拡張子は数種、ファイル数は数千)
のファイルを4桁文字列前の文字列のフォルダに振り分けたいのです
よろしくお願いします

279:デフォルトの名無しさん
15/09/06 01:08:43.88 YCgB583p.net
訂正です
(4桁数列までの文字は数十種類(文字数様々)、拡張子は数種、ファイル数は数千)
よろしくおねがいします

280:デフォルトの名無しさん
15/09/06 01:35:39.75 LDb64vsE.net
エラー出たらここに飛ばすようにしてるんですが
他に何か表示しておくといい情報ってありますか?
できればエラー発生行なんかがあるといいんですが見当たらないようです
:error
echo !!!!!!!!!!!!!!!!!!!!
echo エラー発生。ENTERで終了。
echo バッチファイル:[%~f0]
echo 引数:[%*]
echo ERRRORLEVEL:[%ERRORLEVEL%]
echo !!!!!!!!!!!!!!!!!!!!
pause>NUL
goto :eof

281:デフォルトの名無しさん
15/09/06 05:37:24.41 a7Z2ulaD.net
>>267
for /f "delims=" %%a in ('dir /a-d /b') do (
set "fnm=%%~na" & set "ext=%%~xa"
call :mv
set fnm= & set ext=
)
goto :eof
:mv
call set "dnm=%%fnm:~0,-4%%"
md "%dnm%"
move "%fnm%%ext%" "%dnm%"
set dnm=
goto :eof

282:デフォルトの名無しさん
15/09/06 06:36:51.11 YCgB583p.net
>>270
ありがとうございます!
最初の方の説明を今更間違ってることに気づいたのですが、最後の説明の方で組んでいただいたようで、ちゃんと希望道理の作動をしました
すごく助かりました
ありがとうございました

283:デフォルトの名無しさん
15/09/06 18:32:12.83 Ir/JiN9v.net
>>269
> できればエラー発生行なんかがあるといいんですが見当たらないようです
エラー検出したところで、実行してるコマンドとか渡した引数の情報を適当な変数に入れて、エラールーチンで表示すれば?
まあ、バッチであまりここら辺に凝るのはおすすめしないけど

284:デフォルトの名無しさん
15/09/10 00:20:16.72 0fmkCSIW.net
コマンドプロンプトのコマンドって、穴が酷くね?
コマンド指定でまさかダブルクォートが「一組」しか使えんとは。
for /f %%i in ('"%hoge_exe%" ^| find "piyo"') do echo %%i
これすらパースできないときた。
(%hoge_exe% は半角空白込のフルパスだから「"」を抜けない)
こんなの Linux系なら楽勝なのに…

285:デフォルトの名無しさん
15/09/10 00:26:56.68 0fmkCSIW.net
あと、Vista だと xcopy のヘルプで非推奨になってたのが 7 でそれが取れたんだ?
ミラーリング以外なら robocopy じゃなくて xcopy で良いってことか?
意味が分からん。

286:デフォルトの名無しさん
15/09/10 00:54:28.51 v5ofxYj/.net
>>273
うん
仕様がぼろぼろで旧式の骨董品
でも代わりがないから使うしかない
優秀な人は多いはずだが、みんな陽の当たるソフト担当になり、、

287:デフォルトの名無しさん
15/09/10 01:16:35.41 D73GyhwT.net
骨董を使うのが嫌ならWSHやPowerShell使えば良いだろ。
コレはワビサビを愉しみながら使うモノだ。

288:デフォルトの名無しさん
15/09/10 01:26:44.22 rVL3fJUt.net
>>273
確かに先頭と末尾に"があるとペアと認識するようだな
'call "%hoge_exe%" ^| find "piyo"'
'""%hoge_exe%" ^| find "piyo""'
のように書くと回避できた

289:デフォルトの名無しさん
15/09/10 03:08:07.86 SFXMkCA1.net
空白が実行ファイル名に含まれてるんじゃないならバッチ内で一時的にパス追加しちゃうのが楽そう

290:268
15/09/10 21:38:41.76 0fmkCSIW.net
>>277
ごめん。駄目だった。
setlocal
set imjpuexc_path=%CommonProgramFiles(x86)%\microsoft shared\IME14\IMEJP\imjpuexc.exe
for /f "delims=" %%i in ('""%imjpuexc_path%" getkanainput ^| find "a""') do (
echo %%i
)
endlocal
を実行すると…
\Common の使い方が誤っています。
C:\Users\Ore\Desktop>for /f "delims=" %i in ('""C:\Program Files (x86)\Common Files\microsoft shared\IME14\IMEJP\imjpuexc.exe" getkanainput ^| find "a""') do (
もう訳が分からない…閉じかっこがイカンのだろうか…
>>278
pushd . して実行ファイルのとこに cd /d して終わったら popd で回避した…

291:デフォルトの名無しさん
15/09/10 22:23:16.85 rVL3fJUt.net
>>279
推測のとおり閉じ括弧だね
setとforの間に
set imjpuexc_path=%imjpuexc_path:)=^^)%
を入れるか、または
set imjpuexc_path=C:\Program Files ^^(x86^^)\Common Files\microsoft shared\IME14\IMEJP\imjpuexc.exe
とすれば通るだろうが、カレントパス変更の回避策の方が良いね

292: ◆dPizytaM5k
15/09/10 22:47:59.30 W0FLNmLq.net
call :run "%CommonProgramFiles(x86)%\microsoft shared\IME14\IMEJP\imjpuexc.exe"
goto :eof
:run
for /f "usebackq delims=" %%i in (`%~fs1 getkanainput ^| find "a"`) do (echo %%i)
exit /b

293:268
15/09/10 23:32:42.46 0fmkCSIW.net
>>280
ありがとう。
Linux系だと「引用符の中は別世界」という了解があるのだが、バッチはそうではないみたいね…。
find の前のパイプにキャレットが要るのも、「特殊文字は空気が読めない」ってことでFAということか…。
バッチスクリプトにシェル変数の概念が無い、とこないだ知った初心者ですわ。
>>281
おお、そんな手があったとは。凄い。
参考にさせていただきます。

294:デフォルトの名無しさん
15/09/11 02:02:59.54 8iQOGves.net
バッチの引数を逆から処理する方法みっけ
for %%I IN (%9 %8 %7 %6 %5 %4 %3 %2 %1) do (
)

295:デフォルトの名無しさん
15/09/12 17:25:17.07 PURjqYJ9.net
start /wait /b command
start /b /wait command
オプションの順序で挙動が異なるぜみたいなこと外人が言ってますがどっちを使えばいいですか?
/waitが先だと間違いなんですかね?

296:デフォルトの名無しさん
15/09/12 22:56:10.69 cTPbZ0nl.net
ソースだせよ

297:デフォルトの名無しさん
15/09/12 23:33:28.01 PURjqYJ9.net
>>285さん、わかりづらくてすみません
URLリンク(ss64.org)
URLリンク(superuser.com)
URLリンク(stackoverflow.com)
とかを読んで思ったんです
「start /wait /b」で「すべての言語」にしてググると他にも海外フォーラムが引っかかりましたがどれが元ネタかはわかりません
これは「バグ」だとか「順序が違うと機能しない」みたいなことが書いてあるので、実際のところどうなんだろうと思いお尋ねしました。

298:デフォルトの名無しさん
15/09/19 18:16:48.17 rJvITlaV.net
すみませんbatファイル実行後に作成されるゴミについて質問させて下さい
D:\デスクトップ\testフォルダ内にあるサブフォルダ全てからbackupフォルダを検索して削除したくて
C:\Users\ore>cd ../../
D:
cd D:\デスクトップ\test
for /R %%d in (backup) do rd /s /q "%%d"
として実行するとtestフォルダ内にcdというゴミファイルが出来てしまいます
ゴミファイルを作成しない様にするにはどうすれば良いでしょうか?

299:デフォルトの名無しさん
15/09/19 18:52:57.68 kEgCjcR8.net
pushd D:\デスクトップ\test
for /r %%d in (*desktop*) do rd /s /q "%%d"
if exist cd (del cd&&echo 0||echo 1) else (echo -1)
popd

300:デフォルトの名無しさん
15/09/19 20:11:26.20 rJvITlaV.net
>>288
ゴミが出なくなりました
ありがとうございます

301:デフォルトの名無しさん
15/09/19 21:24:39.32 qCXEI70o.net
わけがわからん
>>287でファイルcdが作られるとは思えんのだが?

302:デフォルトの名無しさん
15/09/19 21:31:23.75 CQxRgVL+.net
>290
1行目を良く見給へ

303:デフォルトの名無しさん
15/09/19 21:36:13.70 qCXEI70o.net
>>291
あれそのままbatの中身だったんか?
おれはプロンプト表示かと思ってた

304:デフォルトの名無しさん
15/09/19 23:26:27.82 kEgCjcR8.net
>>292
ぶっちゃけ作られるのはおかしい。
ただcdが作られるならcdではなくpushd


305:で移動した方が良いし また質問されるのもスレ汚ししたくないからcd削除で二重に提案した それと*desktop*は間違えで*backup*が正しいんだけどうまくいってるんだろうか?



306:デフォルトの名無しさん
15/09/20 00:43:15.75 OUcPf0J5.net
>>273
確かに、よくもまあうまく動かせたもんだ
C:\Users\ore>cd ../../
どこからのコピーかは知らんが、↑をそのままbatに書くような人間がねえ

307:デフォルトの名無しさん
15/09/20 00:46:26.96 PEdhYvSo.net
>>293
一応それぞれの意味は調べてやったつもりではありましたのでちゃんと変更しました
あの中身は元々Cドライブで実行していたものなのですがちょっと個人理由でDドライブで実行したくなったのです
その際は元が
@echo off
cd C:\Users\ore\Desktop\test
for /R %%d in (backup) do rd /s /q "%%d"
で問題なかったので試行用にエコー消してDドライブに移動するのを追加しただけ、のつもりでした
お蔭さまで無事解決しましたしこれ以上はスレ汚しにもなるかと思われますのでご報告までに
改めてありがとうございました

308:デフォルトの名無しさん
15/09/26 20:40:09.22 sjK3MFI2.net
質問させてください。かなり初心者なので申し訳ないのですが。
バッチファイルから、PDF印刷するツールをつくりましたが、不具合があります。
解決方法を教えて頂けないでしょうか。

現象:
PDFファイルをコマンドラインから印刷する際、印刷中のファイルを非表示とする引数 /h を使用しているにも関わらず、
印刷中のファイルが画面上に数秒表示されてしまう。

発生条件:
ツールと関係なくユーザがAdbobe ReaderからPDFファイルを開き、ウインドウを最大化した上でAdobe Readerを終了。
そののち、ツールを使用してコマンドから印刷すると、引数 /h があるにも関わらず印刷中のファイルが画面上に数秒表示されてしまう。
なお、ウインドウの最大化を解除して上でAdobe Readerを一旦終了させ、そのあとにツールを使って印刷すると印刷対象ファイルは画面上に現れなくなる。
しかし毎回、ツールを使うユーザにこの操作をやってもらうのは負担なので、コマンドの書き方を変えることでバグが出ないようにしたい。

コマンド:
START ACRORD32.EXE /p /h /l %%f
・forを使用した繰り返し構文の中に上記のコマンドを入れており、%%fの変数は事前に変数に格納したファイルパスとファイル名となります
・各引数については、/p は印刷の実行、/h はウインドウの最小化、/lは印刷ダイアログの非表示

309:デフォルトの名無しさん
15/09/26 22:30:11.72 HzL2ulcE.net
バッチの不都合じゃなくてソフトウェアの問題だろ
問題が分かってるのにこのスレに書き込むとは
初心者って怖いな
見たくないなら/min使え

310:デフォルトの名無しさん
15/09/26 23:03:22.25 vRcULbaf.net
>>296
こっちの環境はAcrobat Readerが最新じゃないので多少違うかもしれないが、
/pが指定されるとどうも読み込み完了までは表示されちゃうようだ
また一旦文書を読み込むと前回最大化だったのが標準に戻る
だったら事前に読み込んで最大化を解除してしまえってことで
start acrord32 /h xxx.pdf
start acrord32 /p /h xxx.pdf
::と2度呼び出せば表示されない
::その後、印刷終了を3秒待って
ping -n 3 localhost
::強制終了
taskkill /f /fi "windowtitle eq xxx.pdf*"
なお、印刷終了はbatで判定可能(msinfo32とか)だろうから調べてくれ
あと、/lオプションを付けると、こちらでは印刷終了後もacrord32.exeのプロセスは残ったままになる
(タスクバーにも何処にも表示されてないけど、タスクマネージャで見るとプロセスは生きてる)
taskkill /f /fi "imagename eq acrord32.exe"
で殺せるけど

311:デフォルトの名無しさん
15/09/26 23:03:27.42 sjK3MFI2.net



312:>>297 そうですね、バッチというよりはAdobeの問題なのでしょうが、コマンドの書き方で問題を解決したく、質問しました。 /minを試してみます。 どうもありがとうございました。



313:デフォルトの名無しさん
15/09/27 00:50:27.93 fyu1n2iR.net
>>298
2回呼び出してやれば最大化が解除できたのですか?
さっそく試してみます。
どうもありがとうございます。

314:デフォルトの名無しさん
15/09/27 02:06:33.21 NGGi3SIL.net
発想を自由にスレッド作成、投稿、ソーシャルブックマークなど
使い方はお好みで。
ニューススレッドを追加! RSS配信の記事を一覧で表示!
URLリンク(fluid.twolineprj.com)
ご意見をぜひ投稿してください。

315:デフォルトの名無しさん
15/09/27 19:51:17.88 0MtmseWf.net
>>297
/minを試してみたのですが、Adobe Reader に対しては有効になりませんでした。
なおためしに、notepadやexcelに対して/minを使ってみた場合には、普通に最小化して起動してくれました。
なぜAdobeに対してはだめなのでしょうか…

>>298
2回呼び出しをやってみたのですが、最大化の解除はできませんでした。
Readerのバージョンが違うからだと思いますが…

316:デフォルトの名無しさん
15/09/27 20:52:07.03 cWKfNT9F.net
>>302
そのソフトを買ったメーカーにそれぞれ聞け

317:デフォルトの名無しさん
15/09/27 20:52:50.94 cWKfNT9F.net
>>303
ごめんなさい、そのソフトのメーカーに聞け、の誤りです

318:デフォルトの名無しさん
15/09/27 23:56:06.69 S+VayHQk.net
>>302
あれダメだった?
初回読み込み時に表示されるの?それとも2回目の印刷時に表示されるの?
印刷時だったらもしかしたら初回読み込み時起動処理中だったからかもしれない
acrord32.exeは起動すると2つのプロセスが存在する
多分1つは受付みたいな役割りをしていて各pdfを開くプロセスの管理をしていると思われる
状態とウィンドウタイトルの変化は
ProcessID=xxxx runninng OleMainThreadWndName

ProcessID=xxxx runninng OleMainThreadWndName
ProcessID=yyyy running N/A

ProcessID=xxxx runninng N/A
ProcessID=yyyy running xxx.pdf(SECURED) - Adobe Reader
なので最初の1プロセスのみの処理中に次の起動がくるとダメなのかもしれないので
ウェイトを入れてみるとかやってみて
なお、tasklistで状態を表示するようにすると何故か文書が表示されちゃったので
起動完了をbatで監視するのはうまくいかないかも知れない
それと実際の読み込み(印刷もそうだが)は上のProcessID=yyyyのプロセスの方なので
終了しても最大化は解除はされない(この部分は誤解を与えたかもしれない)

319:300
15/09/28 00:02:40.56 pVReont5.net
ひとつ言い忘れてた
こっちの検証環境はXPなので32bit環境です

320:デフォルトの名無しさん
15/09/28 21:17:36.12 XtRLoMNV.net
rmdirについて質問があります。
長文失礼いたします
rmdirコマンドで削除したフォルダの成功、失敗の判定として以下の処理を実行しています。
if exist フォルダ名 (
echo 失敗
) else (
echo 成功
)
rmdirコマンド実行時に指定したフォルダを開いていない状態だと問題なく成功とでますが、開いている状態だと指定したフォルダは削除されるのにも関わらず、失敗と出力されます。
上記、判定処理の前にTIMEOUTコマンドで1秒ウェイトを入れると問題なく成功と出力されます。
私の推測では、rmdirコマンドは、開いているフォルダを閉じてから削除コマンドが実行されているための遅延と考えているのですが、この原因についてご存知の方ご教授頂ければ幸いです。
よろしくお願い致します。

321:デフォルトの名無しさん
15/09/28 21:52:33.44 pVReont5.net
>>307
他がファイル/フォルダをオープンしていると、削除が拒否されずに保留されることがある
これは他プログラムがどのようにオープンしているのかによって違ってくる
FILE_SHARE_DELETE(削除共有)フラグ付きでオープンしているものを削除しようとすると
エラーにはならずに保留される(クローズ後に削除される)

322:デフォルトの名無しさん
15/09/28 22:33:43.19 ynPwQZO2.net
>>307
つかerrorlevel使えば?

323:デフォルトの名無しさん
15/09/28 22:37:43.41 ywrXX2XI.net
>>308
ご回答ありがとうございます。
削除処理の遅延により判定処理に、削除が間に合わず削除失敗と出力されてしまう可能性があるようですね。
この場合、削除処理が終了するまで次の判定処理に進まないような処理が必要になると思うのですが、いい方法などありましたらご教授お願い致します。

324:デフォルトの名無しさん
15/09/28 22:42:03.73 ywrXX2XI.net
>>309
ご回答ありがとうございます。
削除コマンドrmdirでは、失敗でもERRORLEVELにエラーは設定されないようなので、削除指定したフォルダの有無で判定をしています。

325:デフォルトの名無しさん
15/09/29 00:01:30.08 bgSeuQIx.net
>>310-311
なら、逆の発想で dir で行けば?

326:デフォルトの名無しさん
15/09/29 00:39:57.93 8SFmbeyJ.net
@rem findの終了コードが0ならエラー
rmdir "フォルダ名" 2>&amp;1|find /V "" &amp;&amp; echo 失敗
「ERRORLEVELを返さないコマンドのエラー判定」あたり参考

327:デフォルトの名無しさん
15/09/29 00:43:01.28 8SFmbeyJ.net
文字化けすまそ、半角アンド2つで
find /V "" && echo 失敗

328:デフォルトの名無しさん
15/09/29 00:49:47.95 8SFmbeyJ.net
すまそ、ほかにも化けてた
rmdir "フォルダ名" 2>&1|find /V "" && echo 失敗

329:デフォルトの名無しさん
15/09/29 01:06:12.17 bgSeuQIx.net
>>313-315
いくつか理由はあるが、とてもそれが有用なノウハウだとは思えない。

330:デフォルトの名無しさん
15/09/30 21:24:53.14 lqNGdTXz.net
>>312-316
ご助言ありがとうございます。
原因特定できず、とりあえずウェイトを設定して経過観測することにしました。
また続けてご質問があります。
rmdirコマンドで削除するフォルダの中にあるフォルダやファイルが開いているとエラーになりますが、これをエラーとせず削除指定したフォルダを消すためにはどうしたら良いでしょうか?
個人的には、rmdirコマンド実行前に、exploerをtaskkillで終了させ再起動させる処理が案としてありますが、並行して何か処理が走る可能性を考慮してなるべく実行中のタスクを落とさずrmdirコマンドを正常終了させたいです。
よろしくお願いします。

331:デフォルトの名無しさん
15/09/30 21:32:01.35 RUmQvCwV.net
>>317
裏では何が走ってるのか判らないので諦めたほうがいい
例えば、インデックスサービス、ウィルススキャン、IMEなど

332:デフォルトの名無しさん
15/09/30 22:01:54.29 SiaxX88C.net
>>317
並行処理には色々あるから、どういうシチュエーションを想定しているかが分からない以上答えようが無い。
一般論としては >>318 の言う通り。

333:デフォルトの名無しさん
15/09/30 22:19:02.70 lqNGdTXz.net
>>318.314
ご回答ありがとうございます。
裏で走る処理の想定は、完全に把握することはできない状態で、313さんが仰る通りです。
今回は、諦めて削除対象が掴まれていたらエラーにする処理にします。

334:デフォルトの名無しさん
15/09/30 22:31:46.85 lqNGdTXz.net
続けてのご質問失礼します。
Windowsサーバー2008 でバッチファイルを直叩きすると必ず管理者権限で実行されると耳にしたので、調べているものの参考文献が見つかりません。
実際にWindowsサーバー2008の環境でバッチを叩く権限が私にはなく、動作確認ができない状態のためご存知の方いらっしゃいましたら、参考URLやご助言頂ければ幸いです。
よろしくお願い致します。

335:デフォルトの名無しさん
15/09/30 22:45:30.90 lqNGdTXz.net
>>321
自己解決できました。
管理者権限は、UAC設定によりバッチ実行時に管理者以外のユーザーが実行した場合は、昇格ダイアログや管理者ユーザーのパスワード入力ダイアログが表示された後に管理者権限で実行されるようです。

336:デフォルトの名無しさん
15/10/01 15:59:29.84 feh5z6YX.net
特定ディレクトリ内にあるファイルの中から、
作成日が新しい順で10件だけ表示する、という方法はありますか?

337:デフォルトの名無しさん
15/10/01 22:27:35.44 GOCfcoes.net
@echo off
setlocal
set target_path=


338: set num=0 for /f "usebackq tokens=*" %%a in (`dir /a:-d /o-d /b "%target_path%"`) do ( call :main "%%~a"||(goto :eol) ) :eol endlocal goto :eof :main if "%num%"=="10" (exit /b 1) echo %~1 set /a num+=1 exit /b 0



339:デフォルトの名無しさん
15/10/01 22:50:13.28 SNj2dVz3.net
>>324
作成日と言ってるから、
dir /a-d /o-d /tc /b
でしょう
あとファイル名に&や^なんかが使われてると・・・

340:320
15/10/02 00:42:34.05 CZzG8B2R.net
文句だけじゃなんだからダメ文字を回避する方法
@echo off
if "%~1" equ "" (set folder=.) else (set folder="%~1")
if "%~2" equ "" (set n=10) else set /a n=%2
if %n% leq 0 set n=99999
for /f %%i in ('dir /a-d /o-d /tc /b %folder%^|find /v /c ""') do set /a n=%%i-%n%
if %n% lss 0 set n=0
dir /a-d /o-d /tc /b %folder%|sort /+99999|more +%n%|sort /+99999
なお、
dir /a-d /o-d /tc /b %folder%
のかわりに
dir /a-d /o-d /tc %folder%|findstr "^[0-9]"
とすればdirの出力形式で表示される
出力をフルパスで出す方法はちょっとわからない(for文で%~fIとか使うことは可能だがダメ文字が・・・)

341:318
15/10/02 01:12:11.43 2daHSNuh.net
>>324-326
ありがとうございます。
詳細なソート方法は分かったんですが表示するファイル数を限定出来なかったのでとても助かります。

342:デフォルトの名無しさん
15/10/02 01:46:43.29 xI4RFHCV.net
フリーソフトの tail や head を手に入れてもできる
dir /a-d /o-d /b | head -10
dir /ad /od /b |tail -10
など

343:デフォルトの名無しさん
15/10/02 04:08:29.67 ywG60DzM.net
@echo off
setlocal
set target_path=.
set line=0
set maxline=10
for /f "usebackq tokens=*" %%a in (`dir /a:-d /o:-d /t:c /b "%target_path%"`) do (
call :main "%%~a"||(goto :eol)
)
:eol
endlocal
goto :eof
:main
if "%line%"=="%maxline%" (exit /b 1)
echo "%~1"
set /a line+=1
exit /b 0

344:デフォルトの名無しさん
15/10/02 13:30:43.97 Q66dAmly.net
バッチファイル自身が管理者権限で実行されているかどうかを判断するための
ポイントを教えて下さい。
今は次のいい加減なチェック方法しています、set で環境変数に
FPS_BROWSER_APP_PROFILE_STRING   (←Windows10)
FPS_BROWSER_USER_PROFILE_STRING   (←Windows10)
SESSIONNAME
の3つor1つが無いのが管理者権限で実行されているバッチ
これだと、何かのはずみで自前で設定しちゃう(ってる)と明らかにダメな判定基準なので
何かもっと頼れる判断方法を知りたいのです。
Windows10 と Windows7 です。

345:デフォルトの名無しさん
15/10/02 16:31:13.60 CZzG8B2R.net
>>329
引数で渡さずに環境変数で渡すようにしないと
a^b.txt

346:デフォルトの名無しさん
15/10/02 17:03:45.75 2DuVHDsa.net
>>330
whoami /GROUPS|find "High" >NUL||(echo バッチファイル自身が管理者権限で実行されていません) && goto RUNAS
とか (アンド記号は半角で)
判定はMandatory Labelから

347:デフォルトの名無しさん
15/10/02 17:34:44.56 c57yEoAI.net
>>329 行番号で代用すれば、わざわざcallする必要ないと思う
@echo off
set folder=.
set /a len=10
for /f "usebackq tokens=1* delims=:" %%a in (`dir /a:-d /o:-d /t:c /b "%folder%" ^| findstr /n "^"`) do (
if %%a GTR %len% (goto :eof) else echo %%~f$folder:b
)

348:デフォルトの名無しさん
15/10/02 17:39:55.07 0pgpzEB+.net
>>332
ありがとうございました、スッキリうまくいきました。
勉強になります。

349:デフォルトの名無しさん
15/10/02 18:54:09.58 2DuVHDsa.net
>>334
URLリンク(scripting.cocolog-nifty.com)
この辺を参考にしただけ
管理者権限か否かの判定のみなら>>332で用は足りると思うけど、念のため追記

350:デフォルトの名無しさん
15/10/02 20:04:45.82 0pgpzEB+.net
>>335
重ねてありがとうございます。
その記事の次の
waitfor hoge /t 秒
もポイント高かったです。



351:timeout 使うとエラーになって用をなさないことが時々あったので ping を使ってたんですが waitfor という方法があったとは。 『コマンドラインから、UACダイアログを出さずに「管理者として実行」する。』 などでの SchTasks も何かもう目からウロコ。



352:デフォルトの名無しさん
15/10/05 19:28:34.57 SpCxBh4Z.net
PUSHD 作業フォルダ
~いろんな作業~
POPD
というバッチで、たまにカレントが作業フォルダのまま終了してしまうことがあります。
もちろん、作業自体に強制終了、GOTO :EOF等はしていません。
終了後POPDを手入力しても戻らないのでシェル自身が忘れてしまっているようです
最初に%CD%を保管しておいて、POPD後戻っていなかったら強制的にCDで戻るように
するようにしようかと思っているのですが、
もう少しスマートな方法とかあります?

353:デフォルトの名無しさん
15/10/05 21:41:49.86 bTT+ZGiB.net
>>337
ホントに?

354:デフォルトの名無しさん
15/10/06 02:00:18.79 mXRqVUnf.net
>>337
echo on
して本当に popd してるのか確認したのか?

355:デフォルトの名無しさん
15/10/06 02:23:23.79 QJFP7AtV.net
>>337
なんか変なことしてるところがあると思うよ
それを見つけた方がいいけど
別の環境保存方法ということでは
setlocal~endlocalで挟む
それが別のbatであるなら、callで呼ばずにstart /b /waitで呼ぶ
とかかな

356:デフォルトの名無しさん
15/10/06 03:03:04.87 QJFP7AtV.net
別のbatでもstartを使わずにcallでも大丈夫な方法もあった
call|call hoge.bat

357:デフォルトの名無しさん
15/10/07 19:03:48.86 nsjlsK3x.net
イベントでスクリプトを実行するアプリでログオンさせたいんですが、
powershellのスクリプトでログオンて出来ますかね?
ググったのですが参考になる情報を見つけられませんでした。
ヒントを教えて頂けないでしょうか。

358:デフォルトの名無しさん
15/10/07 19:43:48.86 RUI9/d0r.net
スレタイ読めカス

359:デフォルトの名無しさん
15/10/24 10:57:16.17 p7rCtkQ8.net
教えてください。
バッチからIME辞書登録を行いたいのですが、方法はありますでしょうか。
フリーソフト等を使わず、windowsの標準機能のみで行う方法がありましたらご教示ください。

360:デフォルトの名無しさん
15/10/24 11:13:55.98 fZHdxrwJ.net
テキストファイルから一括等登録はできるけどバッチが絡む余地はなさそう
この操作手順を自動化するにはAutoHotKey的なツールを使うしかない
無理やりやるならVBSでSendなんちゃら使いまくるくらいか
複数の単語を一括で登録するには
URLリンク(support.microsoft.com)

361:デフォルトの名無しさん
15/10/24 22:36:15.42 p7rCtkQ8.net
>>345 回答ありがとうございます。
そのsendなんちゃらってなんでしょうか。
ヒント頂けないでしょうか。
お手数ですいません…

362:デフォルトの名無しさん
15/10/24 23:39:00.99 mJxFzgC6.net
>>346
SendKeysのことだと思うけど…
たぶんあなたには無理だと思うから、
諦めるか条件を緩める手段をとったほうが良いかと

363:デフォルトの名無しさん
15/10/25 21:17:07.24 CKwhkT15.net
imjpuexc?

364:デフォルトの名無しさん
15/10/26 00:24:08.25 zhu5kfAS.net
imjpuexcは辞書をファイルを使用するかどうかを登録するだけで単語登録できないような

365:デフォルトの名無しさん
15/10/26 01:43:05.06 kwhrPFGj.net
フリーソフト使えば出来るんだし、そもそも何故batじゃなけりゃいけないのか
使用目的を明らかにしてくれれば別の解決方法もアドバイスできるかもしれないのに

366:デフォルトの名無しさん
15/10/26 10:35:38.89 g04VwT0z.net
事件の香りがするクンクン

367:デフォルトの名無しさん
15/10/26 10:44:57.57 +1zm0ysr.net
別途ソフトを使わずに且つ可能な限り省力化したいという意図と読み取れ�


368:驍ェ 例えば(会社等で)使用する全ての端末に同じ単語を辞書登録させたいとかそんな感じだろうか そういったことであれば自分で辞書ファイルを作ってしまえばいいんじゃないかね その辞書を使用する登録はimjpuexcでできるから、これならバッチファイルも一緒に作って セットで各端末に配布して実行するだけまで省力化できそうだが



369:デフォルトの名無しさん
15/11/24 00:49:21.44 K+m1Fn13.net
質問です
ドラッグアンドドロップしたディレクトリ配下を見ていき
ディレクトリ内がファイルだけの場合はそのディレクトリをその場所に圧縮し、圧縮後に削除
という処理を作りたいのですが
ディレクトリ内がファイルだけか?という判定がうまくいかず
DIRで/a:dとしてもカレントがカウントされてERRORLEVELが常に0になってしまい
助けていただけませんか

370:デフォルトの名無しさん
15/11/24 01:57:14.13 E5eNrkbC.net
/a-d

371:デフォルトの名無しさん
15/11/24 03:42:46.10 ZLe33KjQ.net
>>353
set err=0
for /f %%a in ('dir /ad /b') do set err=1
set err
set err=

372:デフォルトの名無しさん
15/11/24 04:04:14.14 DOEe32Zv.net
>>353
何がしたいのかいまいちよく分からないんだが、
指定されたdirがファイルだけのときは、その親dirに圧縮ファイルを作成後サブdir削除ってこと?
(それともサブdir、さらにその下のサブdirと次々と潜っていくってこと?)
分からないので、直接質問されたことにだけ
1)dirかどうか
  if exist "%~1\" echo **
1)ファイルがあるかどうか
  dir /a-d "%~1" >nul 2>&1 || echo **nofile**
2)サブdirがあるかどうか
  set flag=no
  for /d %%i in ("%~1\*") do set flag=yes
  又は
  for /f %%i in (''dir /b /ad "%~1" 2^>nul') do set flag=yes

373:デフォルトの名無しさん
15/11/24 19:52:42.07 K+m1Fn13.net
>>355-356
ありがとうございます。言葉が足らず申し訳ありません
サブDirの下に潜っていき、その潜った先がファイルだけの構成なら
そいつを圧縮するということを行いたいのです
フォルダ構造を保ちながら、ファイルがまとまっているフォルダだけ圧縮していく
ということを実現しようとしています。

374:デフォルトの名無しさん
15/11/24 23:26:24.37 uLTusmQs.net
dir +d と dir -d で二回errorlevelを判定したらどうなのだろう

375:デフォルトの名無しさん
15/11/26 21:08:59.38 Xx7BS4XN.net
>>353
Info-ZIP の zip.exe を使用した例
cd /d

376:デフォルトの名無しさん
15/11/26 21:11:45.12 Xx7BS4XN.net
>>353
Info-ZIP の zip.exe を使用した例
cd /d "%~f1"
for /r %%i in (.) do set "n=%%~nxi" & pushd "%%i" & call :x & popd
goto :eof
:x
for /d %%j in (*) do goto :eof
zip "..\%n%.zip" *
if errorlevel 1 goto :eof
cd ..
rd /s /q "%n%"

377:デフォルトの名無しさん
15/12/02 18:49:05.46 uZhzBB52.net
質問です。
virtualbox(PC/ATエミュ)にms-dos6.22(english)をインストールしました。
起動後にECHO %PATH%で環境変数PATHを表示させようとしましたが、
%PATH% とタイプした文字が置換されずに帰ってきてしまいます。
自分で環境変数を設定しても同様です。
---------------------------------
C:\ SET VAL=OK
C:\SET
(中略)
VAL=OK <--セットされている
C:\ECHO %VAL%
%VAL% <--置換されない
---------------------------------
これって仕様でしょうか。環境変数を参照するにはどうしたらいいでしょうか?

378:デフォルトの名無しさん
15/12/02 20:00:00.33 G6CksgA0.net
echo "%ABC%"
ダブルクォーテーションで囲めば、どうなる?

379:デフォルトの名無しさん
15/12/02 21:32:16.52 uZhzBB52.net
>>362
同じです。
C:\ECHO "%VAL%"
"%VAL%"

380:356
15/12/02 23:38:35.70 uZhzBB52.net
理由わかりました。
COMMAND.COMの仕様です。
バッチファイルに記述して実行すると置換されます。
WIN9xあたりまではそういう仕様かもしれません。

381:デフォルトの名無しさん
15/12/02 23:45:06.29 l4g7T0Fa.net
command.com懐かしいな
cmd.exeになってからコマンドライン直書きでも展開されるようになったような

382:デフォルトの名無しさん
15/12/03 06:14:24.04 rFz6rQx1.net
ダッセーPROMPTw

383:デフォルトの名無しさん
15/12/03 23:14:20.69 351ZeN4c.net
>>365
記憶がごっちゃになってもうどっちがどっちだったかわからん

384:デフォルトの名無しさん
15/12/04 02:45:09.97 K5fLtIai.net
>>365
そうだったっけ?
全然そんな記憶無いんで、普通に直打ちで変数展開されてたと思う

385:デフォルトの名無しさん
15/12/04 04:22:29.66 p/GS1A93.net
win95のcommand.comで直接echo %PATH% してみたけどちゃんと展開された

386:デフォルトの名無しさん
15/12/07 06:23:17.16 DQwTbvQ5.net
質問です。終了判定の順番についてなのですが
プログラミング的というかバッチ的なセオリーというのがもしあれば教えて下さい
失敗した場合
 ・ループ goto :LOOP
 ・リトライ上限回数による終了 exit /b 1
成功した場合
 ・途中終了によりリスタート exit /b 2
 ・正常終了 exit /b 0
とあってそれぞれどのような順でも出来ます
頻度の高い順や短い処理の順にした方が余計な判定をしなくて済みますが
大差ない場合等はその順序に何かセオリーがあったりしますか?

387:デフォルトの名無しさん
15/12/09 01:33:29.59 DMnL3no7.net
フォルダを指定するとそれ以下の階層の指定したファイルを他のソフトに橋渡ししたいのですがどのように学べば作れますかね?

388:デフォルトの名無しさん
15/12/09 03:34:34.37 xJXhqdvp.net
> それ以下の階層の指定したファイル
どういう指定?拡張子?for /r で出来ると思う

389:デフォルトの名無しさん
15/12/10 03:14:00.36 VBAMhbiJ.net
2つの日付(年月日時分秒)を引数としてその差を秒で返すバッチをお願いします
"20000101000000" "20040404_044444"とか"2000/01/01_00:00.00"とか引数の形式はお任せ
引数のエラーチェックは無しでOK。閏日は必要。閏秒は無視

390:デフォルトの名無しさん
15/12/14 22:34:22.40 A58wbYtQ.net
@echo off
rem call :a1 yyyymmddhhmmss yyyymmddhhmmss result
call :a1 19700101000000 20380119031407 s
echo %s%
pause
goto :eof
:a1
setlocal
set /a b=10000,c=100
call :a2 1 %1 & call :a2 2 %2
call :a3 y1 m1 d1 d1 & call :a3 y2 m2 d2 d2
set /a s1+=h1*3600+n1*60,s2+=h2*3600+n2*60,s3=(d2-d1)*86400-s1+s2
endlocal & set /a %3=%s3%
goto :eof
:a2
set a=%2
set /a y%1=1%a:~0,4%-b,m%1= 1%a:~4,2%-c,d%1= 1%a:~6,2%-c
set /a h%1=1%a:~8,2%-c,n%1=1%a:~10,2%-c,s%1=1%a:~12,2%-c
goto :eof
:a3
set /a y=%1,m=%2,d=%3,m+=(y-1)*12,d+=(m-1)*31
set /a a=m+9,d+=a/48-a/1200+a/4800,b=12
set /a %4=d-a/b*3-(m+7)/b-(m+5)/b-(m+2)/b-m/b

391:デフォルトの名無しさん
15/12/15 00:46:59.16 o42ChFzI.net
ついでに秒差から年月日時分秒を逆算するバッチ
@echo off
rem call :a4 yyyymmddhhmmss +sec year month day hour minute second
call :a4 19700101000000 2147483647 y m d h n s
echo %y% %m% %d% %h% %n% %s%
pause
goto :eof
:a4
setlocal
set /a b=10000,c=100,s2=%2
call :a2 1 %1
call :a3 y1 m1 d1 d1
set /a s1+=h1*3600+n1*60,d3=d1+(s1+s2)/86400,s3=(s1+s2)%%86400
set /a h3=s3/3600,n3=s3/60%%60,s3%%=60
call :a5 d3 y3 m3 d3
endlocal & set /a %3=%y3%,%4=%m3%,%5=%d3%,%6=%h3%,%7=%n3%,%8=%s3%
goto :eof
:a5
set /a d=%1,a=305,b=365,c=146097,e=(d+a)/c,f=(d+1+a)/c-e,d-=e
set /a d+=(d-f+a)/36524,c=1461, e=(d+a)/c,f=(d+1+a)/c-e,d-=e
set /a d+=(d-f+a)/b*3+(d+244)/b+(d+183)/b+(d+91)/b+(d+30)/b-1
set /a %2=1+d/372,%3=1+d/31%%12,%4=1+d%%31
goto :eof
rem ここに >>374 の :a2 と :a3 をコピペ

392:デフォルトの名無しさん
15/12/15 04:37:32.89 DyLWSAr/.net
>>374-375
こんなに短く書けるものなのですね
ifやらforやら使って閏日判定して足したり最初から全部秒に直して計算してたりとアホな事してました
とても参考になりました。ありがとうございました
:a3 2行目 a=m+9 が良く分かりません。その後は閏日を追加する計算で3行目が月31日計算の補正だと思うのですが
暇があって気が向いた時で良いですので :a3,2行目と3行目の解説をお願いしたいです

393:デフォルトの名無しさん
15/12/15 05:13:05.16 DyLWSAr/.net
a=m+9 は3月起点にする為ですよね
48ヶ月(4年)毎に+1日,1200ヶ月(100年)毎に-1日(4年毎の打ち消し),4800ヶ月(400年)毎に+1日
なるほどです

394:デフォルトの名無しさん
15/12/16 20:07:03.65 fy5f41q6.net
@echo off
rem this.bat yyyymmddhhmmss yyyymmddhhmmss VerName
setlocal
call :SUB 1 %~1
call :SUB 2 %~2
set /a s=(d2-d1)*86400+(h2*3600+n2*60+s2)-(h1*3600+n1*60+s1)
endlocal & echo %s% & if not "%~3"=="" set %~3=%s%
exit /b
:SUB
set a=%2
call set /a y%1=1%a:~0,4%-10000,m%1=1%a:~4,2%-100,d%1=1%a:~6,2%-100,h%1=1%a:~8,2%-100,n%1=1%a:~10,2%-100,s%1=1%a:~12,2%-100
call set /a m%1+=(y%1-1)*12
call set /a d%1+=(m%1-1)*31+(m%1+9)/48-(m%1+9)/1200+(m%1+9)/4800-((m%1+9)/12)*3-(m%1+7)/12-(m%1+5)/12-(m%1+2)/12-m%1/12
exit /b
rem消してcallを&してcall set /aを,で1行に纏めたら10行になるな
似たようなの書いた事あるけど俺もifとfor駆使して50行くらいあったわ
ロジック大事だな。369みたいにスマートに書ける頭良い奴羨まし
>>377
>a=m+9 は3月起点にする為
それが分かるなら分かりそうなものだが3行目もそれと同じ
3月なら-3日、15ヶ月なら-6、同じように5月、7、10、12と西向く侍越えてたら日を引いてる

395:デフォルトの名無しさん
15/12/17 09:52:29.59 pa9hyiSF.net
>>374
フェアフィールドの公式でもっと簡略化できる
:a3
set /a a=(12-%2)/10,y=%1-a,m=%2+a*12
set /a %4=365*(y-1)+y/4-y/100+y/400+306*(m+1)/10-63+%3
逆算では>>375の:a5の代替となる公式は知らないなあ

396:デフォルトの名無しさん
15/12/17 14:48:37.51 ZSvcUJP0.net
せっかくなんで、誰でも思いつく変換テーブルを使った奴も
:a3
set n= 00 31 61 92122153184214245275306337
set /a y=%1,m=%2,d=%3,y+=(%2+9)/12-1,m=(%2+9)%%12*3
call set /a %4=y*365+(y/4)-(y/100)+(y/400)+%%n:~%m%,3%%+d-1-306
goto :eof

397:デフォルトの名無しさん
15/12/17 22:03:19.42 6xd5GL4Z.net
>>379
>>380
名人芸みたい
set /a で , を使えるのは知らなかった

398:デフォルトの名無しさん
15/12/18 20:41:02.17 5v+P6SwD.net
>フェアフィールドの公式
理解するのに少し時間がかかったけどひとつ賢くなりました。ありがとう

399:デフォルトの名無しさん
15/12/19 23:36:20.61 hIm+VLiM.net
>>379
>>374は差分を取ってるだけだから定数部分は要らない
簡略化したいなら(y-1)はyでいいし、-63も不要だな
でもそうすると>>375で使えなくなるけど

400:デフォルトの名無しさん
15/12/20 01:39:29.37 ZqBWpEZf.net
@echo off & setlocal
call :SUB 1 %~1 & call :SUB 2 %~2
set /a s=(d2-d1)*86400+(h2-h1)*3600+(n2-n1)*60+s2-s1
endlocal & echo %s% & if not "%~3"=="" set %~3=%s%
exit /b
:SUB
set a=%2
set /a m=1%a:~4,2%-100, y=1%a:~0,4%-10000-(12-m)/10, m=m+(12-m)/10*12
call set /a d%1=1%a:~6,2%-100, h%1=1%a:~8,2%-100, n%1=1%a:~10,2%-100, s%1=1%a:~12,2%-100
call set /a d%1+=365*y+y/4-y/100+y/400+306*(m+1)/10

401:デフォルトの名無しさん
15/12/21 08:37:29.96 h62kjpL5.net
370の:a5が全く分からん。eは0年3月から400年周期が何回あるか?で合ってる?
通日から年月日求める式の解説してるサイトとかあったら教えて欲しい

402:デフォルトの名無しさん
15/12/21 09:39:16.04 M1iYKpBu.net
@echo off & setlocal enabledelayedexpansion
call :SUB 1 %~1 & call :SUB 2 %~2
set /a s=(d2-d1)*86400+(h2-h1)*3600+(n2-n1)*60+s2-s1
endlocal & echo %s% & (if not "%~3"=="" set %~3=%s%) & exit /b
:SUB
set a=%2 & set /a b=!a:~0,8!, c=1!a:~8!-1000000, h%1=c/10000
set /a m=b/100%%100, e=(12-m)/10, m+=e*12, y=b/10000-e, n%1=c/100%%100
set /a s%1=c%%100, d%1=b%%100+365*y+y/4-y/100+y/400+306*(m+1)/10
goto :eof


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch