13/07/19 NY:AN:NY.AN
うんちっち
3:デフォルトの名無しさん
13/07/19 NY:AN:NY.AN
@echo ^>^>1乙
4:デフォルトの名無しさん
13/07/20 NY:AN:NY.AN
wshもここでええのんか?
5:デフォルトの名無しさん
13/07/20 NY:AN:NY.AN
お前ら、wsh使ってますか? Part8
6:デフォルトの名無しさん
13/07/21 NY:AN:NY.AN
C:\Users\user\desktop
の時にdesktopだけを表示したいのですがよい方法はありませんか
7:デフォルトの名無しさん
13/07/22 NY:AN:NY.AN
「set /p hizuke=日付を入力して下さい:」
とやると
「日付を入力して下さい:」
と出ますが、この時に
「日付を入力して下さい:2013/07/22」
のように今日の日付をデフォルト値として表示出来ないでしょうか?
思いつきで
「set /p hizuke=日付を入力して下さい:<echo %date%」
とかやってみましたがもちろんダメでした…
8:デフォルトの名無しさん
13/07/23 NY:AN:NY.AN
set /p hizuke="日付を入力して下さい:%date%"
9:デフォルトの名無しさん
13/07/23 NY:AN:NY.AN
空入力でデフォルト値
set hizuke=%date%
set /p hizuke=日付を入力して下さい:%hizuke%
10:7
13/07/23 NY:AN:NY.AN
ありがとうございます。
ただ言い忘れていましたが、表示したデフォルト値をキーボードで変更できるようにしたいのです。
例えば2013/07/22と表示されたら最後の2を消して5にしたりといった具合にです。
11:デフォルトの名無しさん
13/07/23 NY:AN:NY.AN
schtasksで長いタスク名を確認する方法はありますでしょうか?
例えば
schtasks /create /tn "メモ帳を起動してやるぞ!こんちくしょう!" /tr c:\windows\system32\notepad.exe /sc daily /st 23:00:00
と入力して「メモ帳を起動してやるぞ!こんちくしょう!」というタスク名のタスクを作成します。
すると、
schtasks /query
と入力して先ほど作ったタスクを表示させるとタスク名が途切れて表示されてしまいます。
これでは途切れていない正しいタスク名がわからず、タスクを削除する時などにタスク名を指定できません。
タスクスケジューラでもPowerShellでもいいので途切れていない正しいタスク名を確認する方法を
知っている方がいましたら教えて下さい。
12:デフォルトの名無しさん
13/07/24 NY:AN:NY.AN
ありません
13:デフォルトの名無しさん
13/07/24 NY:AN:NY.AN
>>11
へー最近はそんなことになってるんだねえ
XPだとタスク名は欠けることなく全部出る
何かオプションスイッチがあるんでないのかなあ
まあ回避手段としては、タスクの実体は(XPの場合だと)tasksフォルダ内のファイル(xxx.job)なんで直接ファイル名を漁るとかかな
for /f "tokens=* delims=" %%i in ('dir /b "%systemroot%\tasks\*.job"') do echo %%~ni
14:13
13/07/24 NY:AN:NY.AN
ヘルプ見たら
schtasks /query /fo list
または
schtasks /query /fo csv
で表示できるんでないかな
15:11
13/07/24 NY:AN:NY.AN
>>13-14
/foオプションで出せるんですね。知りませんでした…
"%systemroot%\tasks"フォルダに保存されるというのも初めて知りました。
これはこれで使い道が色々ありそうなので覚えておきます。
助かりました。どうもありがとうございます。
(実は家のPCはXP-Homeでschtasks無いので試すのは明日会社でですが…(笑))
16:デフォルトの名無しさん
13/07/24 NY:AN:NY.AN
3つの.exe ファイルが有るんですが、1つを実行するBATファイルを作りたいです
どうすればいいですか?
17:デフォルトの名無しさん
13/07/25 NY:AN:NY.AN
if
18:15
13/07/25 NY:AN:NY.AN
今日会社のPC(Win7)で/foオプション使ってうまくいきました。
しかしWin7だとタスクのファイルは"%systemroot%\system32\tasks"フォルダに作成されるようです。
OSの種類によってパスが変わるなんてめんどうな仕様ですよね…(泣)
19:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
仕様なんだからしようがない
20:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN BE:1441685344-2BP(0)
僕のpcにあるテキストファイルを全てusbにコピーしたいです。
すぐにコピーしてペーストすれば使えるbatのコマンドを教えてください!
21:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
@echo off
echo pcにあるテキストファイルを全てusbにコピーしました!!!
exit /b 0
22:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
ありがとう!
23:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
>>20
まず、ファイル名を列挙する
dir /s /b > deltext.bat
つぎに、ファイル名の前に、DELコマンドを付記して、バッチファイルに保存
バッチファイルを実行
バッチファイルの例
REM deltext.bat
DEL C:\work\05_06_07_08.txt
DEL C:\work\068.txt
DEL C:\work\099.txt
DEL C:\work\1.BAK
DEL C:\work\1.bat
DEL C:\work\1.ini
DEL C:\work\1.rb
24:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
>>20
テキストファイルかどうか、テキストエディタで開いてみないとわからない
25:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
>>23
DELコマンドじゃなくて、COPYコマンドだ。COPYコマンドなら、どこに送るかかかなければならない
26:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
もうねます
27:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
誤ってDELコマンドでファイルを削除した場合、
undeleteという英語版のソフトウェアで復旧できるかもしれない
どれがいいのかしらない
28:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
MOVEコマンドで、ひどいめにあったことがある。MOVEコマンドは、要注意
29:デフォルトの名無しさん
13/07/26 NY:AN:NY.AN
ワイルドカードの指定が短いファイル名の方にも効いてしまう問題って
Win7あたりで解消したんだっけ?
30:デフォルトの名無しさん
13/07/27 NY:AN:NY.AN BE:4054739459-2BP(0)
ではpc内のデータをすべて削除する場合はどうしたら?
31:デフォルトの名無しさん
13/07/27 NY:AN:NY.AN
iso2bin.exe isoをbin 形式に変換するファイルを見つけたんですが
使い方は、
コマンドプロンプト → cd c:\場所 → iso2bin track03.bin track01.iso
コマンドプロンプを呼び出さず簡略化したいんですけどどうすればいいですか?
D&D しても無理みたいです・・・orz
32:デフォルトの名無しさん
13/07/27 NY:AN:NY.AN
バッチファイル経由でD&D する
33:デフォルトの名無しさん
13/07/28 NY:AN:NY.AN
>>29
仕様は解消したりしないよ
自分が短いファイル名を作るからだろ。自業自得ってもんだ。
作らなきゃいいんだよ。
34:17
13/07/28 NY:AN:NY.AN
ちょっと記述が間違ってたので一応訂正しときます。
Win7ではSchtasksで作成したタスクはファイルとして作成されないようです。
"%systemroot%\tasks"フォルダも
"%systemroot%\system32\tasks"フォルダも見ましたが自分が作成したタスクは見当たりません。
"dir /s/b C:\*.job"ってコマンド叩いても出てきません。
コマンドで"Schtasks /query"を叩くともちろん出てきます
そういう仕様に変わったのかな?まあ"Schtasks /query"で確認できるので困りませんが。
35:デフォルトの名無しさん
13/07/28 NY:AN:NY.AN
↑は>>17ではなく>>18でした。すみません。
36:デフォルトの名無しさん
13/07/28 NY:AN:NY.AN
forコマンドで文字列置換はできないのでしょうか?
下記の<望む結果>を得たいのですが
下のコマンドでも駄目でした。
for /f %i in ('type test.txt') do echo %i:*:=%
<test.txtの内容>
ID:100
名称:あああ
価格:5000
ID:200
名称:いいい
価格:8000
<望む結果>
100
あああ
5000
200
いいい
8000
37:デフォルトの名無しさん
13/07/28 NY:AN:NY.AN
for /f "delims=: tokens=2" %i in ('type test.txt') do echo %i
38:36
13/07/29 NY:AN:NY.AN
>>37
でけましたーーーっ!!
おありがとうございます!
このように書くのですね。
勘違いして遅延展開とかいうのを調べてました・・・(^_^;)
39:デフォルトの名無しさん
13/07/31 NY:AN:NY.AN
すみません。教えてください。
<apply.bat>
中身↓
@echo off
dism.exe /apply-image /image file:XXX.wim /index:1 /applydir:C:\
としておきます。
しかしこれだとバッチ内で指定するwimファイル名を決めうちにしないといけません。
コマンドプロンプトから
apply.bat Image1.wim
で実行すれば、バッチ内で指定されるファイル名がImage1.wimになり、
apply.bat Win7.wim
ならWin7.wimが展開されるようにしたいのですが、何か良い方法はないでしょうか?
40:デフォルトの名無しさん
13/07/31 NY:AN:NY.AN
ファイルを指定する所にこんなの
"file:%~1"
41:デフォルトの名無しさん
13/07/31 NY:AN:NY.AN
>>40
ありがとうございました!
おかげさまでうまく行きました!
42:デフォルトの名無しさん
13/07/31 NY:AN:NY.AN
>>41
いいってことよ
43:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
バッチファイルから文字列をエコーしてファイルに流し込んで
スクリプトを作成・実行ということをしているのですが、
リダイレクト先のファイル行頭にスペースができてしまいます。
echo;>%~n0.vbs Set fso = CreateObject("Scripting.FileSystemObject")
echo;>>%~n0.vbs Set regEx = New RegExp
echo;>>%~n0.vbs Set inFile = fso.OpenTextFile("%CD%\%~n0.txt")
中略
cscript //nologo %~n0.vbs
と%~n0.vbsへ流し込むと、以下のように先頭にスペースが空きます。
□Set fso = CreateObject("Scripting.FileSystemObject")
□Set regEx = New RegExp
□Set inFile = fso.OpenTextFile("C:\home\work\20130804-145429\test.txt")
↑このスペース(□で表記)をなくしたいのです。
実用上は問題ありませんが、回避が可能であればご教示願いたいです。
お分かりの方居りましたらよろしくお願いいたします。
44:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
echo Set fso = CreateObject("Scripting.FileSystemObject")>%~n0.vbs
echo Set regEx = New RegExp>>%~n0.vbs
echo Set inFile = fso.OpenTextFile("%CD%\%~n0.txt")>>%~n0.vbs
こう?
というか、そんな書き方できたんだ……
45:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
>>44さんできました!
echo;Set regEx = New RegExp>>%~n0.vbs
として解決しました。ありがとうございます。
リダイレクト方法はいくつかあるようですね。
本来ならカッコで囲んでひとまとめにするがシンプルなのでしょう。
(
echo;ほげ
echo;ほげ
)>"%~n0.txt
この方法は今回はバッチの前後の関係から制約があるため、このような方法でやってました。
お答えいただきまして、素早い対応ありがとうございました。
46:43
13/08/04 NY:AN:NY.AN
>>44さんへ
質問時に書き込んだ方法ですが、まるっきりの自己流だったようです。
参考にしたサイトを見直してみたら、全然違ってました。昔の記憶をたよりに適当に書いてたようです。
混乱させてすみませんでした。
ちなみにこのサイトです。
「全般/ファイルディスクリプタとリダイレクト - CMD.EXE TIPs」
URLが長いので上のキーワードで検索してください。有名どころですが一応。では失礼します。
47:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
>>44
> というか、そんな書き方できたんだ……
俺も知らんかった…
で、試しにこうやってみると一応これでも行頭のスペースはなくなるな
echo>%~n0.vbs Set fso = CreateObject("Scripting.FileSystemObject")
echo>>%~n0.vbs Set regEx = New RegExp
echo>>%~n0.vbs Set inFile = fso.OpenTextFile("%CD%\%~n0.txt")
つまり>>44はechoの直後にセミコロンとスペースが続いてからSetがあるように
解釈されてリダイレクトされてたんだろう
48:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
> つまり>>44はechoの直後にセミコロンとスペースが続いてからSetがあるように
>>43と間違えた
49:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
echo.>hoge.txt とか echo;>hoge.txt
ってやったら空改行が出力されるのと同じ原理なのかな
50:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
>%~n0.vbs echo;Set fso = CreateObject("Scripting.FileSystemObject")
だな
51:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
いつからかコマンドプロンプトで日本語が■■■って表示されるようになっちゃったんですけど
どうやって直せばいいんですか?
ググって出てくるコードページを変えたりフォントを変えるのを試しても戻りませんでした
XPです
52:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN
>>51
cmd.exeを再インストールするか諦めてCygwinとか使えばいいんじゃ?
後はWin再インスコ
53:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN
>>51
レジストリ
HKEY_CURRENT_USER\Console
を削除してみろ
念のためバックアップしてからね
54:デフォルトの名無しさん
13/08/18 NY:AN:NY.AN
= を含む文字列を = を含む文字列で置換するのに良い方法無いでしょうか?
事前にIF使った総当りで入れ替えておく方法は何とかできたのですが
下記の記述方で使えそうなエスケープなどあればと思いまして。
:: A=B を B=A に置換
set test=%test:A=B=B=A%
55:デフォルトの名無しさん
13/08/18 NY:AN:NY.AN
>>53
遅くなりましたが
この方法で復活しました
ありがとうございました!
56:デフォルトの名無しさん
13/08/18 NY:AN:NY.AN
BをCに蛙
AをBに蛙
CをAに蛙
57:デフォルトの名無しさん
13/08/18 NY:AN:NY.AN
>>56
つまり、ループ内で遅延展開を用いた入れ替えをやれってことっすね!
>>54
vbsでregexpしちゃいなよ
58:デフォルトの名無しさん
13/08/19 NY:AN:NY.AN
頭が遅延してんの?
59:デフォルトの名無しさん
13/08/19 NY:AN:NY.AN
>>56-57
レスどうもです、やっぱ無理ですかぁ
60:デフォルトの名無しさん
13/08/19 NY:AN:NY.AN
power shellの話ははどこで話せばよいの?
ざっと見たけどスレがないみたいなんだけど…
61:デフォルトの名無しさん
13/08/19 NY:AN:NY.AN
Windows PowerShell Part4
62:デフォルトの名無しさん
13/08/28 NY:AN:NY.AN
Javaみたいなコンパイルに失敗したらecho %errorlevel%で1って出力されるような言語で
わざとエラーがでるコードTest.javaを用意して
batファイルに
javac Test.java
echo %errorlevel%
って書いてコマンドプロンプトから実行しても%errorlevel%が表示されません
batファイルを実行した後に、手入力でecho %errorlevel%て打つと1って表示されます
どうやってbatファイルからエラーレベルを出力できますか?
63:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
うそでしょう
64:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
echo %erorlevel%
とか
65:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>62
javacって使ったことないけど復帰値として値を帰さずに環境変数にセットしてるのか
まあ、そういう場合の俺の知識じゃ良い解決策はない
続きは別のbatプログラムにして、当batではタスク登録して終了し、後はタスクにその別のbatを起動してもらう方法ぐらいかな
(bat中から新たに子プロセスcmd.exeを起動しても引き継ぐ環境はそれを実行前の環境なのでダメだね)
例
c:\x.bat
----
javac Test.java
schtasks /create /tn test-java /sc onidle /i 1 /ru user-name /rp user-password /tr c:\y.bat
schtasks /run /tn test-java
c:\y.bat
-----
schtasks /delete /f /tn test-java
続きの処理を記述
66:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>65
呼び出し元プロセスの環境変数は普通変えれんぞ。
というかタスク作ってしまったら何も情報伝わらないし、その方法意味あるんか?
なんとなく、
~(
javac Test.java
echo %errorlevel%
)
ってなってるとか、Typoがあるとか、そういうのの方が怪しい気がする。
一番確実な対処はIF ERRORLEVEL 1とかの擬似環境変数ではない組み込み機能使って判定する方法だと思う。
67:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>66
寝ぼけてたね
確かに意味が無いな
これはインストーラなどでPATH環境変数が変化した場合に有効な手段だった
68:67
13/08/29 NY:AN:NY.AN
寝ぼけてたけど、間違ったのは
動作確認のために、コントロールパネルのシステムからユーザー環境変数を追加設定してやってたため
↓
この場合環境変数の設定値が反映されるにはcmd.exeを起動しなおさないと反映されないので
69:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>68
なるほど・・・現在の環境ではなくユーザの環境を読ませる一手間か
start /Iもatもユーザの環境を読み直さないし、runasはスマートカードかパスワード入力が必要になってしまうんだな
タスクはrunasと同等だし環境読み直すのも理解できるけど、エクスプローラからcmd起動したときとかはどういう挙動してんだろうコレ?
70:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
すいませんsetlocal EnableDelayedExpansionで取得できました
いまいちどうして取れたかわかりませんが
71:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
今時なぜコマンドプロンプトなんですか?
powerShellを使わない理由はなぜでしょうか?
72:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>71
コマンドプロンプトで足りるような用途にまで
PowerShellを使わなきゃならん理由は何だ?
まさか、自慢話を始めようとしてるのではないだろうな?
73:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>70
うそでしょう
74:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>73
66で指摘されてるようなやり方してたんじゃね。
「すいませんsetlocal EnableDelayedExpansion(して、%errorlevel%を!errorlevel!にしたら)で取得できました」
だと普通によくあるミス。
75:デフォルトの名無しさん
13/08/29 NY:AN:NY.AN
>>74
すいません書き忘れてました
そづえす%から!にも書き換えてます
76:デフォルトの名無しさん
13/08/30 NY:AN:NY.AN
findstrで実行結果にファイル名を出さない方法はありますでしょうか?
findstr "あああ" "C:\test.txt"
とファイルを完全に指定すれば実行結果は
あああいいい
いあああいい
いいあああい
のようになって、ファイル名は出ずに一致した行の内容だけが表示されます。
しかし
findstr "あああ" "C:\*.txt"
のようにワイルドカード指定にすると実行結果には
C:\test.txt: あああいいい
C:\test.txt: いあああいい
C:\test.txt: いいあああい
のように一致した行の内容だけでなく、その行が含まれているファイル名まで表示されてしまいます。
これをファイル名は出さないように出来ないでしょうか?
77:デフォルトの名無しさん
13/08/30 NY:AN:NY.AN
for %i in ("C:\*.txt") do @findstr "あああ" "%i"
78:デフォルトの名無しさん
13/08/30 NY:AN:NY.AN
>>76
forfiles /?
79:デフォルトの名無しさん
13/08/30 NY:AN:NY.AN
>>70
%~%はその文字列を含むコマンドの実行前に展開されます。
何らかの書き方が原因で、javacの実行からエラーレベル取得までが1つ(1行)のコマンドとして解釈されてしまったのでしょう。
()で括るとかもその一つ。&で繋ぐのもそれに含まれるっけ?
80:デフォルトの名無しさん
13/08/30 NY:AN:NY.AN
type "C:\*.txt" | findstr "あああ"
81:デフォルトの名無しさん
13/08/30 NY:AN:NY.AN
call echo %%errorlevel%%
82:76
13/08/30 NY:AN:NY.AN
>>77、>>80
ありがとうございます!
どちらでも出来そうですね。
来週会社で試してみますね。
83:76
13/08/31 NY:AN:NY.AN
>>78
すみません、見落としてました。
このコマンドは知りませんでした。
forfiles /m "C:\*.txt" | findstr "あああ"
とすれば処理できそうですね。
ただPCがWinXPなのでこのコマンド自体がありません…
でも勉強になりました。
84:デフォルトの名無しさん
13/09/01 10:52:35.80
findstrで一文字違いまで検索結果に含めたい時スマートな記述無いでしょうか?
「いちごぱんつ」を検索して「いちのぱんつ」とか「いちごぱんだ」とかも同時に拾いたいのです
85:デフォルトの名無しさん
13/09/01 11:53:35.40
ない
いちごぱんつ
*ちごぱんつ
い?ごぱんつ
いち?ぱんつ
いちご?んつ
いちごぱ?つ
いちごぱん*
86:デフォルトの名無しさん
13/09/01 12:01:14.09
findstrは複数文字列のOR検索するのに、
パイプを使わない表記方法(二重引用符で囲んでスペース区切り)
があるのがUNIX系のgrepコマンドより便利だよね
87:デフォルトの名無しさん
13/09/01 23:14:25.16
おお、それでOR検索してくれるのか
一行で済むならおkですありがとう
88:デフォルトの名無しさん
13/09/07 21:02:07.49
echo %test%
89:デフォルトの名無しさん
13/09/07 21:44:23.13
>>85
> *ちごぱんつ
これ正規表現として構文エラーだろw
まあこれに限らずどれも正規表現じゃなくてワイルドカードとして記述してるみたいだが
findstrじゃワイルドカードは使えないだろwww
90:デフォルトの名無しさん
13/09/08 13:50:51.90
dir /s /b "C:\windows" >> ".\a.txt"
で更新中の.\a.txtを
findstr "hoge" ".\a.txt"
で検索してもエラーが起こることは絶対にないですよね?
91:デフォルトの名無しさん
13/09/08 14:41:10.54
command.comじゃないんだからw
92:デフォルトの名無しさん
13/09/08 18:48:49.51
forコマンドの/dオプションってどういう時に使うんだ?
↓の①は②のように書けば事足りると思うが?
/rオプションもいまいち使いどころがわからない。
①for /d %i in ("c:\temp\*") do @echo %i
②for /f %i in ('dir /s /b /ad c:\temp') do @echo %i
93:デフォルトの名無しさん
13/09/08 20:50:40.92
テキストファイルが1つあり、そのファイルの奇数行目の内容だけを表示することって可能でしょうか?
94:デフォルトの名無しさん
13/09/08 22:01:56.01
>>92
それいうとfor /Dに限らずforデフォルト動作もそうだし、
dir /Sは再帰だからfor /Dと動作違う気がするんだが、
まぁそれはそれとして置いとこう。
②の欠点
・単純にコマンドが長い
・パイプ動作なのでcmd /U環境でないとUnicode文字が使えない
・/Sだとフルパスで冗長だし/-Sだと相対パス的に美味しくない
>>93
可能だけど、処理が複雑化する予定があるなら別の言語を併用したほうが良い
エスケープ周りで破綻してから再移植とかくっそダルいよ
95:デフォルトの名無しさん
13/09/09 01:36:16.64
>>93
とりあえずどうやるのか興味もあるだろうから例示するが、
文字列操作は、制御文字等使えない文字が多々ありいろいろトラブルのでbatでやるのは俺もお勧めしない
@echo off
setlocal ENABLEDELAYEDEXPANSION
set z=0
for /f "tokens=*" %%i in (data.txt) do (
rem set /a z=^^!z
set /a z^^=-1
if !z! neq 0 echo.%%i
)
endlocal
なお遅延環境変数を使うと、さらに文字列データ所以のトラブルが増えるので
以下のようにサブルーチンにして回避することもできる(ここでデータをパラメタ渡しにするとトラブルが増える)
@echo off
set z=0
for /f "tokens=*" %%i in (data.txt) do set data=%%i & call :output
goto :eof
:output
if %z%==0 echo.%data%
set /a z=!z
goto :eof
96:デフォルトの名無しさん
13/09/09 15:54:39.20
>>92
for /r root %i in (.)
>>94
えらく詳しいのー感心感心
隠しはどうする?
>>95
空行はどうする?
find /n /v "" data.txt
で行番号を振って、奇数行だけ
97:デフォルトの名無しさん
13/09/09 16:22:43.22
>>96
すげぇ上から目線で重箱つついてるが、そんなんで人生大丈夫か?
>隠しはどうする?
隠しを列挙したいってケースより普通にfor /Dで済むケースのほうが多いから基本問題なし
そうしなきゃ駄目な時は諦めて、欠点を潰すか無視をしてfor /Fを使えばいい
一々全部の欠点例外を潰した万能定型文で…みたいな事はアホらしいからやりたくない
妥協が許されないならハナから汎用言語でも使っとかないと只の苦行だわ
>空行はどうする?
それも使えない文字の一例にすぎないだろ
行番号を消す処理も必要になるし、その手の対策の積み重ねも複雑化を招く
98:92
13/09/09 21:15:46.13
>>94-95
ご回答ありがとうございます。
なるほど、②は色々短所が目立ちますね。
実行速度も比較するのが馬鹿らしくなるほど①>>>>>>>>②でした。
ちなみに>>93も私ですw
これも前途多難な感じなので他の方法を考えます。
なんか話が高度になってきたのでこの辺で…
99:デフォルトの名無しさん
13/09/11 16:23:50.79
set の文字列置換で文字列中に含まれる=自体を置換(削除)したいのですがどうしたらよいでしょうか?
set a=abc=def
set a=%a:==%
とやるとエラーになりますんで…
100:54
13/09/11 17:10:40.49
お、俺じゃないからね!
101:デフォルトの名無しさん
13/09/11 17:40:47.80
>>99
すまんが簡単な方法が分からん
set a=abc=def=ghi
set n=0
set new_a=
:loop
call set a1=%%a:~%n%,1%%
if "%a1%"=="" goto next
if "%a1%" neq "=" set new_a=%new_a%%a1%
set /a n+=1
goto loop
:next
set a=%new_a%
102:デフォルトの名無しさん
13/09/11 18:26:47.00
for /f "delims== tokens=1,2" %i in ("%a%") do set b=%i%j
103:101
13/09/11 19:21:16.50
>>99,100
wsh(jscript)とかを併用することを考えたら?
使い捨てじゃなく将来複雑な処理が考えられるのなら後々楽になるよ
以下のはbatに埋め込んだ形になってるがxxx.jsと別ファイルにしてxxx.batから呼び出す方がいいだろう
@if (0)==(0) echo off
cscript //nologo /e:jscript "%~f0" <test.txt >result.txt
type result.txt
goto :eof
@end
/*
WScript.Echo(WScript.StdIn.ReadAll().replace(/=/g,""));
*/
var stdin=WScript.StdIn;
while(!stdin.AtEndOfStream) {
var data=stdin.ReadLine().replace(/=/g,"");
// var data=stdin.ReadLine().replace(/(.+?)=(.+)/,"$2=$1"); //>>100さん対応 a=bをb=aに入替
WScript.StdOut.WriteLine(data);
}
104:デフォルトの名無しさん
13/09/12 22:31:25.95
通りすがりだが>>102のでバッチリできたぞ?
これ>>54にも使えるんじゃね?
105:デフォルトの名無しさん
13/09/12 23:23:43.17
>>104
取り敢えずそれで良いとしても、EOL指定とか空行とか非置換行とかメタ文字とか…
最終的には別言語併用出来るようにしたほうが楽な可能性があるって事は留意しておいても良いと思う。
106:デフォルトの名無しさん
13/09/13 14:01:17.61
ある実行中のバッチファイル自身の名前は %0 で得ることが出来ますが、
実行中のバッチファイルを呼出したバッチファイルの名前を知る方法はありますか?
具体的にやりたいのは shebang の再現です。
例えば以下のように始まる perl スクリプトの拡張子を bat にしておきます。
#!/usr/local/bin/perl
ここに perl スクリプトの内容
そして #!.bat という名前のこんな感じのバッチファイルをパスが通った適当なところに置いておきます。
%* ほにゃらら & exit /b
こうすることでおおざっぱにではありますが schebang っぽくできると思うのですが、
このほにゃららのところをどうすればよいか思い付きません。
107:デフォルトの名無しさん
13/09/14 05:01:55.71
男は黙って D:/Perl/bin/perl.exe ほにゃらら.pl
いっそのことCygwinでも入れちゃえば
108:デフォルトの名無しさん
13/09/14 08:44:32.38
>>107
Cygwin も Msys も導入済みです。
だからそれらを使わないときでもそれに挙動を合わせたいというのが動機のひとつです。
また、 Perl を例に挙げましたが実際に使う言語処理系は他のものがメインです。
処理系起動時のオプションでないと切替えられない要素があるのですが、
個別に拡張子を割当てるのが煩雑になるというのが関連付けと PATHEXT を使わない理由です。
バッチファイルでやりたいのでバッチファイルスレで質問してるつもりなんですが、
他の方法を使わない理由をいちいち全部挙げてからでないと回答が出ないもんなんですか?
109:デフォルトの名無しさん
13/09/14 09:00:40.41
全部挙げてもでないかもよ
110:デフォルトの名無しさん
13/09/14 10:01:01.37
プログラム類ってのは目的を達成するための手段にすぎないのだから、特定の手段に拘るだけ無駄というか。
ダメ文字の件とか色々あるし、ドンピシャなテクニックが見つからない・思いつかないなら素直に手を変えるべき。
ハッカー文化的なものだが、バッチファイルってのは手軽な分、そういう手段は問わない傾向がより強い印象。
111:108
13/09/14 11:44:58.17
ちょっと煽り気味でしたね。 すいません。
一応 C/C++ や JScript もそこそこ使えるつもりですが、呼出し元のプロセスが cmd.exe であることはわかっても、
あるバッチファイルを呼出したバッチファイルが何かということを調べる方法は見付かりませんでした。
そんなわけで「バッチファイルの機能」でどうにかなる可能性の方がまだ高いだろうと考えました。
要するに手段に拘っているわけではなく、色々と検討した結果としてバッチファイルに望みがあると思っているのです。
112:デフォルトの名無しさん
13/09/14 12:28:33.75
呼出し元から特定の引数渡すとかあるだろうになあ
113:108
13/09/14 12:31:13.55
>>112
要件は >>106 で述べた通りです。
可能であれば shebang 風 (完全に互換とまでは言わずとも) にしたいのです。
114:デフォルトの名無しさん
13/09/14 13:47:04.98
>>113
URLリンク(scripting.cocolog-nifty.com)
出来たかどうかは忘れたけど、ここでバッチの呼び出し元がどうのこうのの記事を読んだ気がする
115:デフォルトの名無しさん
13/09/14 13:54:41.57
1.bat
call 2.bat "%~0"
2.bat
echo 呼び出し元:%~1
exit /b
116:108
13/09/14 14:04:49.20
>>114
今回の件に役立ちそうな情報は見付かりませんでした。
URLリンク(www.google.co.jp)
でも、面白い記事が多いですね。 紹介ありがとうございます。
117:デフォルトの名無しさん
13/09/14 14:11:23.69
>>108
wshでWMI介して親プロセスのコマンドラインを取得
互換性ほしいなら他にないと思う
118:デフォルトの名無しさん
13/09/14 14:31:30.89
バッチファイルで現在や親のプロセスIDを調べる。: Windows Script Programming
URLリンク(scripting.cocolog-nifty.com)
これをプロセスIDからコマンドラインに変えればいいじゃね?
119:デフォルトの名無しさん
13/09/14 14:36:01.77
昔のtlist.exeはppidを出してたから、これ使えばいいよ
120:108
13/09/14 15:17:15.13
既に >>111 で述べましたが、それらの方法で得られるのはあくまでも cmd.exe を呼出したプロセスであり、
cmd.exe 内で実行されたバッチファイルの呼出し元ではありません。
121:デフォルトの名無しさん
13/09/14 15:34:24.99
>>120
stackoverflow.com/questions/10087812/batch-bat-get-the-name-of-the-first-script-not-the-current-one
shebang実装にはwshしか無い
pastebin.com/jwAQnTef
122:108
13/09/14 17:05:15.57
>>121
すばらしい。
このスレ的にはアレですが、解決策ありがとうございます。
123:デフォルトの名無しさん
13/09/14 22:14:15.91
おいおい
>>108
> バッチファイルでやりたいのでバッチファイルスレで質問してるつもりなんですが、
> 他の方法を使わない理由をいちいち全部挙げてからでないと回答が出ないもんなんですか?
こんなこといってたくせにそれかよ
124:108
13/09/14 23:13:28.98
>>123
出来ない理由を覆されたので問題ないです。
125:デフォルトの名無しさん
13/09/15 01:55:19.47
>>121
バイナリのインストールを必要としない方法ではほぼWSHしか無いが、WMI呼べるならなんでも良いだろう。
一時ファイルにスクリプト吐いてdebugコマンドで必要な実行可能バイナリ生成して実行、とかも不可能ではない。
>>123
111で反省してたように見えたのに、なんつうかデフォでそういう人なんかね?
126:デフォルトの名無しさん
13/09/15 05:59:54.41
自分で考えようともしない馬鹿だからどーせすぐ死ぬだろ
127:デフォルトの名無しさん
13/09/15 06:00:10.27
debugって32bitだけじゃないの
128:デフォルトの名無しさん
13/09/15 06:56:29.77
>>127
debugは16bit時代の遺物だからなぁ…
テキスト化したCOMファイル…もダメか。
まだ手はあると思うけど、出てこない。
129:デフォルトの名無しさん
13/09/15 11:48:12.32
現在ログインしているユーザーのユーザーフォルダを表すパスって ~ ですよね?
cd ~ でそのユーザーのユーザーフォルダにいけると思ったんですができませんでした
130:デフォルトの名無しさん
13/09/15 11:52:40.77
cd %USERPROFILE%
131:デフォルトの名無しさん
13/09/15 12:02:53.19
>>130
/dオプション付けた方が安全だよ
pushdならオプション不要だけど
cd /d %USERPROFILE%
pushd %USERPROFILE%
132:デフォルトの名無しさん
13/09/15 14:41:32.93
>>129
節子それUnix/Linuxの話や
cmd.exeでは上の通り環境変数を参照するのが良いかと
%homepath%とかもある、俺は何となく字面的にこっちが好きだから使ってるだけだが
133:デフォルトの名無しさん
13/09/15 15:19:04.82
@rem = '--*-Perl-*--
@perl -x -S %0 %*
@goto :eof
@rem ';
134:デフォルトの名無しさん
13/09/16 19:48:22.51
コマンド実行時の標準出力を意図通りにechoさせる方法について質問です。
robocopyコマンドを実行すると、
Started : Mon Sep 16 09:20:17 2013
Source : C:\Users\username\Downloads\
Dest : D:\Backups\Downloads\
みたいに出力されますが、このうちのSourceとDestのパス部分のみを一行に並べて表示する方法が知りたいのです。
C:\Users\username\Downloads\ D:\Backups\Downloads\ のようにしたいのです。
試しに、
robocopy.exe "C:\Users\username\Downloads" "D:\Backups\Downloads" /MIR | findstr /I /R /C:"Source.*\\$" /R /C:"Dest.*\\$"
としたところ、SourceとDestをそれぞれ一行ずつ表示する形になるだけで、目的は果たせませんでした。
それぞれのパス部分のみを一行に並べて表示する方法をお分かりの方居りましたらよろしくお願いいたします。
135:デフォルトの名無しさん
13/09/16 19:56:19.54
>>134
for /Fを使ってSourceとDestを環境変数に突っ込んで後で出力する。
set /Pのプロンプト文字列(改行されない)を使うって手もあったと思うが、そこまで拘るならバッチ以外も想定したい所。
136:134
13/09/16 20:03:51.75
>>135さん、レスありがとうございます。
for /Fコマンドで環境変数にSourceとDestをそれぞれ設定後に出力、という手順でできるんですね。
forコマンドは使ったことないので、ヘルプで調べながら挑戦してみます。
回答いただきありがとうございました。
137:デフォルトの名無しさん
13/09/17 22:03:09.60
いいってことよ
138:デフォルトの名無しさん
13/09/19 06:01:56.22
start X
start Y
start Z
のように複数のショートカットをまとめて起動するbatファイルを作成したのですが
これらを一斉にアクティブ、最小化、閉じるなど管理する方法はないでしょうか
起動しているものはインターネットブラウザなどです
139:デフォルトの名無しさん
13/09/19 08:08:39.01
>>138
終了や強制終了は出来るけど、それ以上の操作をしたいならWSHとかもしくは操作自動化マクロとか使ったほうが良さげ。
そもそもGUIはコマンドプロンプトで操作するものじゃないし。
140:デフォルトの名無しさん
13/09/19 08:38:19.46
>>139
開いた複数のウインドウをすべて終了できるのでしたら十分です
素人質問で申し訳ないですが、どのように記述するとよいでしょうか
141:デフォルトの名無しさん
13/09/19 09:11:50.93
連投すいません
いろいろ調べてみましたがどうやら検討違いな質問だったようです
ですがWSHを使うという情報が手に入っただけで大きな成果でした
>>139さんありがとうございました
142:デフォルトの名無しさん
13/09/19 13:10:48.73
最小化
start shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}
閉じる
taskkill /im X & taskkill /im Y & taskkill /im Z
143:デフォルトの名無しさん
13/09/19 15:56:29.64
>>142
解決しそうです、ありがとうござます
144:デフォルトの名無しさん
13/09/22 19:32:24.35
「for /F」って「for /f」でも動くと思うんだけど
前者の書き方をする人が圧倒的に多いよね。なんでだろ?
145:デフォルトの名無しさん
13/09/22 19:44:50.79
圧倒的かどうかは知らんが /? 見ると大文字だし
コマンドによってはスイッチの大文字と小文字の区別があるものもあったりしたような
コマンドではなく cuiアプリだったかも知れんが。
あと、スイッチをわかりやすくする為とかじゃないの?
俺はラベルと環境変数名だけ大文字にしてる。
146:デフォルトの名無しさん
13/09/22 19:46:38.21
>>144
for /? での表示が /F になってるからでしょ。
オプション文字はたまに大文字/小文字区別することあるから...
147:デフォルトの名無しさん
13/09/22 19:47:44.54
リロードせずに書いたら、被ってた... orz
148:デフォルトの名無しさん
13/09/23 03:06:20.15
まあどのコマンドもヘルプ見るとオプションは大文字だけど
大抵は小文字でも動くし小文字で書く人も多い。
でもforに限ってはなぜか大文字で書く人が多めな感じはするね。
149:デフォルトの名無しさん
13/09/23 03:11:40.02
>>144
そのオプションの大文字小文字の区別有無は知らないけど、
forコマンドの%%1文字変数は大文字小文字が区別されるから(震え声)
150:デフォルトの名無しさん
13/09/23 14:46:33.35
強調だろw
151:デフォルトの名無しさん
13/09/25 09:30:20.92
すいません、質問です。
複数のファイルに記述されたログからファイル名のみを抽出作成したいのですが。
logが保管されているフォルダの中にはa.log、b.log、c.log・・・と複数のログが保管されており、
それぞれのログは(ERROR:[日付][ファイル名])というログが数百行記述されています。
このファイル名のみを抽出し、別名保存をしたいと考えております。
自分で考えたバッチ処理の内容は
for %%i in (*) do (
for /f "delims=" %%A in (%%i) do echo %%A:~54 >> ..\result\%%i
)
だったのですが、結果、resultの内容は
(ERROR:[日付][ファイル名]):~54
となってしまいました。
(パラメータは変数のように部分抽出できない為?)
このため、
for %%i in (*) do (
for /f "delims=" %%A in (%%i) do (
set B=%%A
echo %B:~54% >> ..\result\%%i
)
)
に変更したところ、3行目と4行目が正しく実行されませんでした。
(result\の中には何もなし。echoでつまづいてる?)
どうしたらいいでしょう?
152:デフォルトの名無しさん
13/09/25 09:45:01.39
for () だと変数は逐次更新はされないから、やるなら do call :sub %%A みたいに使わないとダメなんじゃないっけ
153:デフォルトの名無しさん
13/09/25 10:38:37.03
>>151
>パラメータは変数のように部分抽出できない為?
できない為。
>3行目と4行目が正しく実行されませんでした。
%環境変数%の展開はコマンドを読んだ時点で行われる。
「for %%i in (*) do ([改行]~中略~[改行])[改行])」というコマンドを解釈した時点で「%B:~54%」が展開されてしまう。
setlocalコマンドかネストしたcmd.exeで遅延展開を有効にして%環境変数%の代わりに!環境変数!形式を利用するか、
callで飛んで処理したりコマンド自体にcallを付ける等で環境変数の展開が毎回行われるようにしなければならない。
154:デフォルトの名無しさん
13/09/25 11:31:17.13
%B:~54%
54てなんだ?間違ってるんじゃないのか?
日付の書式はどうなっている?[0925] とかの4文字なら
%B:~14,-2%
for %%i in (*) do (set A=%%i
for /f "delims=" %%A in (%%i) do (
set B=%%A
call :sub
))
exit /b
:sub
>> ..\result\res_%A% echo %B:~14,-2%
だがこっちのほうが簡潔だし、日付の書式の文字数が一定しない9月25日とかでも対応出来る
for %%i in (*) do (
for /f "tokens=3 delims=[]" %%A in (%%i) do >>..\result\res_%%i echo %%A
)
155:151
13/09/25 12:25:58.64
>>153
ありがとうございました。
callで:subに飛ばして解決できました。
>>154
54は固定長でROBOCOPYのログなんでファイル名までがそんくらいだったんです。
ありがとうございました。
156:デフォルトの名無しさん
13/09/26 12:50:23.27
コマンド1 引数
コマンド2 引数
って書いてもコマンド2が実行されません
コマンド1 引数 & コマンド2 引数
って書くとコマンド2は実行されますが
コマンドの量が多くなると可読性が失われるので困ってます
アドバイスお願いします
157:デフォルトの名無しさん
13/09/26 13:43:32.61
具体的に書けよ。
どう考えても書いたコマンドに問題があるとしか思えん。
158:デフォルトの名無しさん
13/09/26 14:57:15.67
もしコマンド1がbatとかならcallで呼ぶ
159:デフォルトの名無しさん
13/10/02 02:33:34.10
ipconfigコマンドを実行するとネットワークカードのIPアドレスを表示出来ますが
LANケーブルを抜いた状態だと例え固定IPを設定していてもIPアドレスが表示されません。
LANケーブルが抜けていてもIPアドレスを表示できるコマンドはないでしょうか?
160:デフォルトの名無しさん
13/10/02 02:42:23.00
詳細忘れたけどnetshで見れなかったっけ
161:159
13/10/04 01:46:05.71
>>160
見れました!ありがとうございます。
IPも変えれるなんて便利ですね。
162:デフォルトの名無しさん
13/10/08 15:48:55.97
過去ログ漁って call で遅延展開する方法があったけど
Windows7のコマンドプロンプトで動かしても、ファイルがないと言われたので
さらにググって、!(びっくりマーク)でくくると遅延展開するというのを見つけて作ってみた。
経緯と中身はこっち 4桁の連番にするバッチ
スレリンク(avi板:612-614番)
> setlocal enabledelayedexpansion
っていうのを入れないとただの文字として扱われてたからいるよね。
なんていうか、
<イレル 「考えすぎでしょうか」
人がすんなりできる事をいちいち詰まってドツボに嵌る人生なんだなって。
163:デフォルトの名無しさん
13/10/08 21:25:21.54
すまん、よく分からんのだが
%の展開を2回するのを遅延展開というのか?
164:デフォルトの名無しさん
13/10/08 21:47:56.12
>>163
2回というか、2重?
遅延展開は %%変数%% でも !変数! でもいいらしい。
「!」が使えるのはNT系だけど、いまどき 9x で新規バッチなんて作らないだろうし。
ちなみに今 call と %%変数%% でやってみたらできました。
%%変数%% を使う場合でも
> setlocal enabledelayedexpansion
ってのを入れないといけなかったんですね。
165:デフォルトの名無しさん
13/10/08 21:51:55.29
> %%変数%% を使う場合でも
> > setlocal enabledelayedexpansion
> ってのを入れないといけなかったんですね。
そんなことはない
あと全角キモいからやめろ
166:デフォルトの名無しさん
13/10/08 21:56:12.27
>>165
でも、エラーになるんですけど。ちなみにWindows7です。
call 使わなかったら %変数% っていう文字として処理されるし。
167:デフォルトの名無しさん
13/10/08 21:57:06.50
call %%hoge%% のパターンは遅延展開とは言わん
168:デフォルトの名無しさん
13/10/08 22:00:33.51
>>163
二段展開してて、その二段目がcall実行のタイミングに遅延展開してるってことにはなると思うが。
@set A=0 & for /L %%i in (0,1,4) do @(
set /A A=A+1
call echo %%A%% )
バッチファイルでならちゃんと「1」「2」「3」「4」「5」になるよ。
ただ、プロンプトではパース時に展開されてそれっきりで二段展開すらされない。
プロンプトとバッチファイルでパース動作が違ったりとか、
状況によってクセのあるパースや展開されたりとか、
ダメ文字やエスケープの不備とか…バッチやシェルスクリプトのこういう所は嫌いというか苦手だわ…
169:デフォルトの名無しさん
13/10/08 22:04:55.44
>>162
callダメなのか?
set /a R=10000
for /f "tokens=*" %%S in ('dir /on /b *.png') do (
call ren "%%S" %%R:~1%%.png
set /a R+=1
)
で動かないのかな?
あと下2行目どういう意味?
170:デフォルトの名無しさん
13/10/08 22:10:15.72
遅延展開は見えないが %多段展開は echo on で見えるだろ
171:162
13/10/08 22:22:17.12
>>169
>>168 さんのは動きました。
すいません。
もしかしたら別のところで引っかかってたのかも。
ファイル名の後ろにつなげようとして %%~nS とか使ったときに、
変更前のファイル名のほうでやっちゃってエラーが出たりしたので、それと混同したのかも。
「!」の方はそれだけだと文字扱いでしたが。
「<イレル」は校正のやり方
今ちょっと微妙にマイナーなライトノベル作家のスレに常駐してるので。
ちょっとしたジョーク。
172:デフォルトの名無しさん
13/10/08 22:33:22.21
>>171
アチコチの情報を漁るのも良いけど、ヘルプをまずちゃんと読んだほうが良い
体系的な知識が得られるので
それから、コマンドヘルプも活用できる
今回の遅延環境変数(!)の話なら
set /?
173:デフォルトの名無しさん
13/10/08 23:00:54.42
>>169
> call ren "%%S" %%R:~1%%.png
一回展開で(forループ開始時)、「%%」→「%」
> call ren "%S" %R:~1%.png
forの引数置換で、「%S」→「~.png」
> call ren "~.png" %R:~1%.png
callの解釈で、「%R:~1%」→「環境変数Rの2文字目(オフセット1)以降」→「0000」
> ren "~.png" 0000.png
んで、
> set /a R+=1
はRの下4桁のインクリメント目的で、Rに1を足してRに格納する。
初回は「%R:~1%」が「10000」の2文字以降で「0000」
次回は「%R:~1%」が「10001」の2文字以降で「0001」…と続く。
まぁ詳しくは>>172
set、for、call辺りの/?は読んどくと良い。
cmdとsetlocalとstartあたりも為になる。
174:デフォルトの名無しさん
13/10/09 00:01:34.13
>>173
解説ご苦労様と言いたい所ですが169さんは質問者じゃないと思いますよーwww
175:デフォルトの名無しさん
13/10/09 00:26:11.37
>>174
・・・ああ、色々盛大に勘違いしてたorz
176:デフォルトの名無しさん
13/10/09 11:15:09.65
>>168
call echo %^A%
ってやればプロンプト入力でもいける
177:デフォルトの名無しさん
13/10/12 02:48:38.73
とあるファイルの、フルパスでなく、属する直上のフォルダ名を取得する方法を教えてくだちい
178:デフォルトの名無しさん
13/10/12 03:23:16.89
for %%A in ("%~1\..") do echo %%~nxA
pause
179:デフォルトの名無しさん
13/10/12 03:40:49.43
おおすごい!
\..の部分で階層一つ上げてるってわけですかね?
サンキュウベリーマッチョ!
180:デフォルトの名無しさん
13/10/12 15:44:17.94
for %%A in ("%~dp1\.") do echo %%~nxA
pause
181:デフォルトの名無しさん
13/10/23 00:20:20.38
set rtn = %errorlevel%
exit rtn
↑のようなコードを見たことあるんだけど、2行目は「exit %rtn%」になるんじゃないの?
182:デフォルトの名無しさん
13/10/23 00:32:50.68
なことはない
183:デフォルトの名無しさん
13/10/23 00:45:33.68
今試したけど、それ無効(errorlevel値に影響しない)になってると思われる
batのerrorlevelは別にexitで値を返さなくても返されるので
まあ意図したようには動作するけど
dir z: (存在しないドライブ名)
set abc=9
exit abc と exit %abc%
で試せば分かると思う
184:181
13/10/23 02:02:48.29
>>183
試してみたらやはり「exit %abc%」の書き方が正解みたいですね。
自分が見たサンプルはたまたまうまくいってただけっぽい…
勉強になりました。ありがとうございます。
185:デフォルトの名無しさん
13/10/23 02:08:18.01
いや、だからexitに数値指定なしだとbatでのerrorlevel値がそのまま帰るんだよ
多分exitは数値じゃなかったらパラメタは無効にするんだと思う
だから
set rtn = %errorlevel%
exit rtn
この2行と
exit
とは等価となってる
186:デフォルトの名無しさん
13/10/23 03:22:37.39
等価って書いたけど間違っているかも知れない
exitだけだと
受け側がbat以外のプログラムだったら復帰値として
errorlevel値が帰らないかもしれない(未確認)
187:デフォルトの名無しさん
13/10/31 10:53:34.17
cleanmgr /c c: /sageset:1
cleanmgr /c d: /sageset:2
これをbatファイルから実行しても1行目しか実行されません
CドライブとDドライブのディスクノクリーンアップが出来ればOKなんですが
何か良い方法ありませんか?
188:デフォルトの名無しさん
13/10/31 13:30:06.76
バッチファイルはその行の処理が終了しないと次の行に行かないので
この場合Cのクリーンアップが終了するまでDのクリーンアップは起動しない。
そしてcleanmgrは複数同時起動しないのでCとDのクリーンアップを同時に行うのは無理。
ちなみにわかってるとは思うけどsagesetはオプション設定で実際のクリーンアップはsagerunね。
189:デフォルトの名無しさん
13/10/31 13:37:56.80
設定用バッチファイル
cleanmgr /c c: /sageset:1
cleanmgr /c d: /sageset:2
実行用バッチファイル
cleanmgr /sagerun:1
cleanmgr /sagerun:2
こういうふうに分けて書いてたんです
設定は1度きりしか行わないのでc. batとd.batに分けて実行することにします
PCから離れている間にディスクノクリーンアップを行いたいので、
実行はCとDの二つのドライブをコマンドプロンプトから一回の呼び出しで行うにはどうしたらいいでしょうか?
190:デフォルトの名無しさん
13/10/31 14:52:42.78
バッチの問題じゃなくてソフトの問題だってレスしてくれてるじゃないの。諦めよう
191:デフォルトの名無しさん
13/10/31 15:44:51.93
わかりました
192:デフォルトの名無しさん
13/10/31 16:00:50.32
試してないけど、終了してないから2回目が起動できないのなら終了させちゃえば良いのでは?
cleanmgr /c c: /sageset:1
taskkill /f /fi "imagename eq cleanmgr.exe"
cleanmgr /c d: /sageset:2
193:デフォルトの名無しさん
13/10/31 17:04:28.22
>>192
それtaskkillが実行される時はcleanmgrが終了した時だから意味なくない?
194:デフォルトの名無しさん
13/11/04 07:58:59.84
Windowsのコマンドラインで、文字列の最後尾に0x00のNULL文字を追加した文字列を
任意の変数にセットする方法を教えて下さい
abcd0x00 abcdの後に0x00が1つの合計5文字
195:デフォルトの名無しさん
13/11/04 09:17:14.82
バッチファイルでバイナリ文字列扱うとか無謀すぎると思う
変態という名の神々が戯れにやる類の仕事ではなかろうか
196:デフォルトの名無しさん
13/11/04 09:53:28.74
常識ある組織なら、然るべきスクリプト言語を使わせるだろう。
「Windows標準でないからNG」とか喚くような所なら、さっさと辞めるが吉。
197:デフォルトの名無しさん
13/11/04 10:52:17.85
Windows標準ならWindows Script Hostがある
198:デフォルトの名無しさん
13/11/04 14:23:05.50
>>194
未検証だけどバイナリエディタで0x00の1バイトファイル作っておいて、
typeコマンドで当該ファイルを変数に流し込めばいけるかも
199:デフォルトの名無しさん
13/11/04 16:18:35.24
>>198
「バイナリエディタはWindows標準でないから使用はNG」とw
200:デフォルトの名無しさん
13/11/04 22:31:52.59
真面目にやるならdebugコマンドだが、最近のWindowsには付属してないんだよなぁ・・・
201:デフォルトの名無しさん
13/11/05 05:31:31.99
>>200
command.com削除されたの?
202:デフォルトの名無しさん
13/11/06 00:43:53.39
>>201
16ビットのエミュレーション機能が消えて同時に消えたとか聞いた気が。
ちゃんと調べたりしたわけじゃないんで間違ってたらすまん。
203:デフォルトの名無しさん
13/11/06 07:43:02.29
スクリプトは使用したくないのであれば下記のバッチファイルを使用する。
@echo off
empty.exe *
ファイル(F) --> 名前を付けて保存(A)をクリックする。
ファイル名(N) で 必ず ダブルコーテーション でファイル名をくくってください。
バッチファイルは
"メモリ開放.bat"
ってあるんですけど、「必ず ダブルコーテーション でファイル名をくくってください」
ってのは何で?他のサイトだと普通にempty.batとかで保存していいみたいなんだけど
204:デフォルトの名無しさん
13/11/06 08:34:57.76
拡張子が.bat.txtにならないようにだろ
ていうかそのサイトで聞け
205:デフォルトの名無しさん
13/11/06 22:00:57.93
メモリ開放!
206:名無しののVBS
13/11/09 05:27:27.39
””って拡張子修正用と言ってたような気がする
207:デフォルトの名無しさん
13/11/10 12:23:41.42
vimのコマンド作って便利になった
208:デフォルトの名無しさん
13/11/13 00:21:19.77
<"C:\TEST1.bat"の内容>
C:\TEST2.bat
notepad
<"C:\TEST2.bat"の内容>
mspaint
上記2つのファイルがある時にコマンドプロンプトから"C:\TEST1.bat"と入力してエンター押すと
ペイントは起動するのですが、メモ帳が起動しません。
メモ帳も起動させたい場合はどのように記述すればよいのでしょうか?
209:デフォルトの名無しさん
13/11/13 00:29:29.94
>>208
batからbatを起動すると制御が起動したbatに移動し元には戻ってこない(ジャンプってこと)
mspaintが終了するまでnotepadを起動しなくて良いのなら
call test2.bat
同時に起動するなら
start test2.bat
210:デフォルトの名無しさん
13/11/13 00:59:19.52
>>209
制御が戻ってこないとは知りませんでした…
callでバッチリうまくいきました。
ありがとうございます!
211:デフォルトの名無しさん
13/11/14 00:20:01.44
callとcmd /c、startとcmd /kはどう違うの?
212:デフォルトの名無しさん
13/11/14 00:29:35.43
メインメモリの空き容量が・・・
213:デフォルトの名無しさん
13/11/17 16:52:32.11
気にしない
214:デフォルトの名無しさん
13/11/19 22:18:06.13
シェルスクリプトのスレ誘導してくれ
215:デフォルトの名無しさん
13/11/20 09:23:01.58
>214
↓悪いが、ここから適当に見て回ってもらうしかない。
【最強CUI】PowerShell -Part 1
スレリンク(tech板)
VBScriptについて必死に話し合うスレ
スレリンク(tech板)
[JavaScript] スクリプト言語34 [Perl,Python,PHP]
スレリンク(tech板)
ECMAScript デス 4
スレリンク(tech板)
【JavaScript】スクリプト バトルロワイヤル40【pl,rb,php,py】
スレリンク(tech板)
コマンドプロンプト
スレリンク(win板)
お前ら、wsh使ってますか? Part8
スレリンク(win板)
Windows PowerShell Part4
スレリンク(win板)
216:デフォルトの名無しさん
13/11/20 17:39:56.64
シェルスクリプトってバッチファイルよりは強力だしスレ無いわけが・・・
で、shだと誤爆が多そうだしcshで探したらこんなのが。
C shell 撲滅委員会
スレリンク(unix板)
それはさておき、まぁ当然だけどUNIX板いくだけで一発だな。
シェルスクリプト総合 その22
スレリンク(unix板)
217:デフォルトの名無しさん
13/11/20 23:17:41.18
>>215 >>216 やっぱりここで聞いてよかった ありがとな
218:デフォルトの名無しさん
13/11/29 04:55:52.45
URLリンク(zion009.blog98.fc2.com)
こちらをバッチにしてD&Dするとtsファイルが0キロバイトで出力されます
私が間違っているのでしょうかサイト側のミスなのでしょうか
219:デフォルトの名無しさん
13/11/29 06:24:38.80
>>218
まずvlcに直接喰わせたときに、そのファイルはちゃんと出力されるのか?
話はそれからだ
220:218
13/12/05 10:45:55.06
今更ながらコピーしたのをサクラでペーストし、後ろの半角スペースを削除したら正常に出力されるようになりました
221:デフォルトの名無しさん
13/12/05 22:58:16.73
教えてください
既定のzipの関連付けは確か
>assoc .zip
.zip=CompressedFolder
だったと思うんだが、いつの間にか
>assoc .zip
拡張子 .zip のファイルの関連付けが見つかりません
になってしまっていた。しかし、
>start a.zip
で圧縮(zip)フォルダが起動する。
なぜだ?
222:デフォルトの名無しさん
13/12/05 23:13:19.79
てめえの既定など知らんわ
そもそも関連付けはマシーンではなくペルソナにメガ進化している
223:デフォルトの名無しさん
13/12/05 23:30:56.75
.zip=CompressedFolder はWindows8の既定
224:デフォルトの名無しさん
13/12/06 00:04:52.50
.cabや.lzhも同じような…
assocは何の意味があるのか
225:デフォルトの名無しさん
13/12/07 15:01:02.16
コマンドでビープ音を出すことは出来ますか?
可能ならスピーカーがミュートになっていても音を出したいのですが
無理ならスピーカーからでも良いので何らかの音が出せれば良いです。
226:デフォルトの名無しさん
13/12/07 15:16:00.81
>225
例:コマンドプロンプト画面で以下のように打ち込むと、Cドライブのルートフォルダに"Beep1.bat"ができる。
それを実行するとビープ音が一回鳴る。
(※「^G」と表記した箇所では、実際には[Ctrl]+[G]を押す事。これによりアスキーコード7が入力される)
echo @echo ^G > C:\testBeep.bat
227:226
13/12/07 15:26:39.33
例として挙げたファイル名をうっかり書き間違えた。orz
とにかく"C:\testBeep.bat"なら"C:\testBeep.bat"を実行すればOKって事で
アスキーコード7は元々ビープ音を鳴らす為の制御コードだが、PCによっては
ヘッドホンを繋いでるとヘッドホンからしか聴こえない場合もあるから注意。
こればかりは実際どうしようもない。
228:デフォルトの名無しさん
13/12/07 22:15:40.57
Windows7以降はビープ鳴らせないんじゃなかったっけ
229:デフォルトの名無しさん
13/12/08 00:27:54.07
コマンドプロンプトでCtrl+Gじゃなくて普通にキーボードから「^G」って打ってエンター押したら
いきなりIEが立ち上がってGoogleで"undefined"を検索した状態になってすげえびっくりした。
なんなんだこりゃ?
230:デフォルトの名無しさん
13/12/08 05:21:11.98
私のWindows7(Pro)64bitでは、ちゃんと>>226の方法でビープ音が鳴るよ。
[Ctrl]+[G]を2回続けた場合はビープ音も2回鳴る。
231:デフォルトの名無しさん
13/12/08 05:52:09.63
すみません、スクリプト初心者で色々と試行錯誤の上、ちょっとハマってしまったので教えて頂けないでしょうか。
やりたいことは以下の処理が出来るバッチファイル(check.bat)を作りたいのです。
232:231
13/12/08 05:55:24.55
(1)A)のコマンドを実行し、その結果に「kdb106.dll」という文字列があれば(2)の処理に進む、無ければ何もせずバッチ処理終了
↓
(2)B)のコマンドを実行し、その結果に「PCAT_106KEY」という文字列があれば(3)の処理に進む、無ければ何もせずバッチ処理終了
↓
(3)「check.bat」と同じディレクトリにある「update.bat」を実行し、処理終了。
※「update.bat」はちゃんと動くものが用意されています
233:デフォルトの名無しさん
13/12/08 06:32:28.13
(1)set a = A | findstr kdb106.dll
if %errlvl%
(2)set b = B | 略
(3)update.bat
こんな感じだけど記述は適当です
何にハマったのか気になります
どこまで出来たのか気になります
たぶん何もしてなくて丸投げなんだろう
と思いますがいかがですか
234:デフォルトの名無しさん
13/12/08 06:33:34.38
(cmd && cmd)ってbatで出来たっけshellだけだっけ
235:231
13/12/08 06:39:58.20
>>233さん
早速ありがとうございます。
A)のコマンドというのは、reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters /v "LayerDriver JPN"
になり、
実行すると以下のように2行で結果が出力されます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters
LayerDriver JPN REG_SZ kbd106.dll
この出力を変数に入れてやり、findstrで特定の文字列があるかどうかをやりたいのですが、
うまく変数に入ってくれないのです。すみません。。。
236:231
13/12/08 07:34:38.47
for /f "usebackq tokens=*" %%i in (`reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters /v "LayerDriver JPN"`) do @set A=%%i
echo %A% |findstr "kbd106.dll"
でとりあえず、kdb106.dllを含む行のみechoで表示させることが出来ました。
ここからなのですが、このキーワードを含む場合は「goto test1」、
含まない場合は「goto test2」にしたいのですが、
IF文をどう使えばいいでしょうか?たびたびすみません。
237:デフォルトの名無しさん
13/12/08 08:03:45.96
>>236
forコマンドでは、複数行の入力があると、一行ずつコマンドを繰り返し実行するので複数行をまとめて入力とかできない
それだと最後の行のみのデータが環境変数Aにセットされるだけ
こういう場合、一旦結果を中韓ファイルに格納するか、パイプ渡しする
reg query xxx | findstr "str"
次にfindstrの結果ヒットしたかどうかはerrorlevelに格納される
ヒットしたら=0 そうでなかったら=1(またはそれ以上の値でエラー値はwindowsの種類により異なる)
色々実行してみて、echo %errorlevel%で値を見てみればいい
if errorlevel 1 goto :not_find
ヒット処理
goto :eof
:not_find
ノーヒット処理
238:デフォルトの名無しさん
13/12/08 08:16:23.14
訂正
パイプ渡しでへたに空白は入れない方が余計なミスを発生させない(後には空白を入れてもいい)
reg query xxx| findstr "str"
あと実行結果をコンソールに表示したくない場合出力をnulデバイスにリダイレクトする
findstr "xxx" >nul 又は findstr "xxx" 1>nul
標準出力だけでなくエラー出力も表示させたくない場合は
findstr "xxx" >nul 2>&1
239:デフォルトの名無しさん
13/12/08 08:24:01.85
あと、そもそも環境変数に複数行データを格納することは出来ない
240:231
13/12/08 08:35:19.32
>>237さん
情報ありがとうございます!!
errorlevelで判別し、分岐処理させることが出来ました。
これでうまく作れそうです。
本当にありがとうございました!!
241:231
13/12/08 08:40:10.36
>>238-239
追加情報もありがとうございます。
微調整するようにしますね!
242:デフォルトの名無しさん
13/12/08 10:11:55.42
>>230
ビープとはビープスピーカー(PC本体に付いてる奴)を鳴らすってことであって
音声出力のスピーカーから鳴る奴は違う。
243:デフォルトの名無しさん
13/12/08 13:25:43.57
>>228>>242
マザボにビープスピーカーが無い場合、XP以前でもサウンドスピーカーで代用ビープが鳴ってなかったか?
244:デフォルトの名無しさん
13/12/08 15:11:24.99
代用ビープってなんかワロタw
昔飲んだ代用コーヒーを思い出した…
245:デフォルトの名無しさん
13/12/10 16:30:03.46
ファイルのタイムスタンプの時間の変更方法を教えてください。
日付ですと、以下のように一旦変数に入れて戻すことで可能ですが、時間の場合この方法は使いづらいのです。
set NOWDATE=%DATE%
date 2000-01-01
copy /B "hoge.txt" +
date %NOWDATE%
外部ツールを使わない方法を模索しております。よろしくお願いいたします。
246:デフォルトの名無しさん
13/12/10 22:44:13.91
scriptかpowershell
247:245
13/12/10 23:15:11.36
>>246
スクリプトですね、調べてやってみたいと思います。
レスありがとうございました。
248:デフォルトの名無しさん
13/12/10 23:20:30.23
内部ツール生成は?
setlocal
for /D %%i in (%windir%\Microsoft.NET\Framework\v*) do path %%i;%path%
echo import System.IO; File.SetLastWriteTime("aaa.txt", "1/1/2011 12:56:30");>aaaaa.js
jsc.exe aaaaa.js
aaaaa.exe
del aaaaa.js
del aaaaa.exe
249:デフォルトの名無しさん
13/12/14 11:20:53.30
非常に基礎的なことだと思うのですが・・・
<a.bat>
@echo off
start /wait b.bat
echo %time% >a.txt
exit
<b.bat>
@echo off
echo %time% >b.txt
ping -n 3 localhost >NUL
exit
で、b.txtが出力された約2秒後にa.txtも出力される事がわかりました。
要は、あるバッチを実行し、別のバッチを呼び出しそのバッチ処理が終わればまた元にバッチに戻り処理をするという
形にしたいのです。(シャットダウンスクリプト)
このa,bをグループポリシーのシャットダウンスクリプトに仕込むと、
何故か既定の15分のタイムアウトまでシャットダウンプロセスで止まってしまい、
結果のtxtファイルも出力されません。
ちょっとわかる方いらっしゃいましたらアドバイス頂けないでしょうか?
250:デフォルトの名無しさん
13/12/14 12:07:14.89
シャットダウン中ってプロセスの起動制限無かったっけ?
startの代わりにcallじゃいかんのか?
251:249
13/12/14 14:59:03.80
>>250
ありがとうございます。
<a.bat>
@echo off
call b.bat
echo %time% >a.txt
exit
<b.bat>
@echo off
echo %time% >b.txt
ping -n 3 localhost >NUL
に変更し、aからbをcallで呼び、bのexitを取りました。
通常時ではa.batを実行すると、2つのtxtを吐いてくれます。
a.batをシャットダウンスクリプトに仕込み、gpupdate /forceで反映、
シャットダウンすると、すぐにシャットダウンされるのですが、
再起動後にtxtは吐かれていませんでした。。。
別プロセスbを呼べないのは分かるのですが、せめてa側のtxtが吐かれていないのと
納得出来ないんです。
うーん、、、複雑だなぁ。
252:デフォルトの名無しさん
13/12/14 15:38:47.70
>>251
念のために確認するけど
a.txtとかb.txtって実際にはフルパス指定してる?
それか、先頭に
pushd %~dp0
を書いてみれば?
253:252
13/12/14 15:54:57.38
上のレスは無視してくれ
カレントはscriptの位置になってるようだ
アクセス権の問題かとも思ったけどSYSTEMはフルになってるし(まあ念のために確認してみて)
でもscriptフォルダに余計なファイルを書くことはお勧めできないので
別に用意してそっちに書くようにすてはどうか?
ちなみにlogoff scriptでexeを起動するなんてことは
俺はやっているしログファイルも作成してるんで出来ないことはないはず
254:252
13/12/14 15:57:28.16
↑
logoff scriptはshutdown scriptと読み替えてくれ
255:デフォルトの名無しさん
13/12/14 16:03:39.04
a→b→a としたいなら、
bに
exit /B
を付けてaに処理が戻るようにしてみては。
256:デフォルトの名無しさん
13/12/14 16:08:45.97
exit /?
を参照ね。
終了コードを付加することで、戻ったバッチ側で判定して分岐なんかの処理もできる。
257:249
13/12/14 16:10:10.68
>>255
ありがとうございます!!
とりあえず、
<a.bat>
@echo off
pushd %~dp0
start /wait b.bat
echo %time% >a.txt
exit
<b.bat>
@echo off
pushd %~dp0
echo %time% >b.txt
ping -n 3 localhost >NUL
popd
exit
で、ちゃんとカレントディレクトリにa.txt、b.txtをシャットダウンスクリプト時に
吐いてくれるようになりました!!!
ちょっとexit /Bも試してみるようにしますね。
ちなみに、各バッチのSYSTEMの権限はフルでした。
258:249
13/12/14 16:28:01.79
ちなみに start /waitでb.bat開始せず、callする場合は
これで行けました!
アドバイス頂いたようにb.bat側のexitに/Bをつけるのがポイントのようです。
また、絶対パスを指定せず、カレントディレクトリでやる場合
「pushd %~dp0」も付けておくことが必要だとわかりました。
ありがとうございました!!
<a.bat>
@echo off
pushd %~dp0
call b.bat
echo %time% >a.txt
exit
<b.bat>
@echo off
pushd %~dp0
echo %time% >b.txt
ping -n 3 localhost >NUL
popd
exit /B
259:デフォルトの名無しさん
13/12/14 23:07:19.91
で、 >>249 が動かない理由は解決した?
もしかしてフルパスで↓だと終わらないぞ
start /wait "c:\b.bat"
260:デフォルトの名無しさん
13/12/15 00:53:06.53
>>249
状況から見てb.batが見つからないからエラーが出て止まってるだけだろ
試しにa.bat内のsart /wait c.bat
に変えて通常実行してみりゃ、
'c.bat'がみつかりません。とかのメッセージボックスが出て止まったままになるしさ
261:デフォルトの名無しさん
13/12/15 01:26:41.08
vol c: | findstr /C:シリアル番号
で出てきたシリアル番号だけを抜き出して表示したいのですが
どうすりゃ良いか教えてください
262:デフォルトの名無しさん
13/12/15 01:57:08.69
for /F "tokens=3" %i in ('vol c: ^| findstr /C:シリアル番号') do @echo %i
263:249
13/12/15 04:16:05.52
>>259-260
アドバイスありがとうございます!!
よくよく見てみたらおかしかったです。
264:デフォルトの名無しさん
13/12/15 11:15:41.61
batでプログラムを作っているのですが、
start...
start...
で別のプログラムをいくつか同時起動してそれらが全てが自動終了したときに
次の処理に進みたいのですが、こんな判定ってできますか?
265:デフォルトの名無しさん
13/12/15 11:35:21.71
どっかに動作中を示すファイル作っておいて定期的に存在のチェック
って方法をやってるけど、そういう用途のコマンドとかコンソールアプリあるなら俺も知りたいな
まぁ、そこまでやるなら...って話はもちろんわかるけども。
266:デフォルトの名無しさん
13/12/15 12:34:59.25
notepad | notepad | more
267:デフォルトの名無しさん
13/12/15 12:58:15.28
横だけどこれってどういう仕組みなの?
パイプが出力を次のコマンドに渡すやつだってことはわかるけど、
notepadは何も渡さないとして、なんでmoreで止まるの?
268:デフォルトの名無しさん
13/12/15 13:17:11.71
こんな感じかな、
mystart.bat
app=%1
flg=%1.run
Echo hoge> %flg
start %app(start要らないかも)
del %flg
postproc.bat
appList=appA appB
for %app %appList (
mystart.bat %app
)
for true (
for %app %appList (
if exist %app.flg (
appList= %appList - %app
)
mysleep.vba 1000ms
)
if %appList=null goto last
)
:last
start finish.ext
269:デフォルトの名無しさん
13/12/15 13:51:51.51
>>266、>>268
ありがとうございます!
やりたいことがこれで出来そうです。
270:デフォルトの名無しさん
13/12/15 14:04:03.23
待つんじゃなくて、終わったプロセスに呼んでもらったほうがイインジャネ?
2回実行されたら次へ進むって。
271:デフォルトの名無しさん
13/12/15 14:08:19.98
それだと終了した複数プロセスから同時に呼ばれたらどうする?
272:デフォルトの名無しさん
13/12/15 18:54:34.59
>>262 ありがとう
ついでにこれも教えてください
「ABC-DEF」の「-」をなくして「ABCDEF」と表示させたいです。
273:デフォルトの名無しさん
13/12/15 21:12:09.65
バッチファイルにしちゃったからコマンドプロンプトから直接叩くときは
%%iを%iにしなきゃいけないと思います。冗長でごめんなさい。
URLリンク(pastebin.com)
274:デフォルトの名無しさん
13/12/15 22:29:46.95
>>268
x exist
o not exist
>>265
.batでやってるなら晒してよw
>>269
出来た?見タイヨー見たいなー見たいねー。
275:デフォルトの名無しさん
13/12/15 22:45:17.68
>>274
使う処理をcallで色々呼びまくってて
もはやどことどこが使われてるか分からないほどだから無理
後実際には、sleepをユニークな名前でコピーしてサブプロセス終了時に殺す方法をとってる
276:デフォルトの名無しさん
13/12/15 22:54:36.24
なるほど、さくっと想像できない。それほどまでにあれなのか。ありがとう。
まあ、ちょろっとやっつけでやったものってのは得てして肥大化してよくわからなくなるよな。
277:デフォルトの名無しさん
13/12/15 23:12:18.52
>>274
>>265じゃないけどこんな感じだわ
【main.bat】
@echo off
start 01.bat
start 02.bat
:wait
if exist 01.fin (
if exist 02.fin (
goto next
)
)
timeout 20
goto wait
:next
del *.fin
echo finished!!
pause
【01.bat】
@echo off
::::: 処理01 :::::
echo.>01.fin
exit
278:デフォルトの名無しさん
13/12/16 02:04:58.33
>>272
for /F "tokens=3,4 delims=- " %i in ('vol c: ^| findstr /C:シリアル番号') do @echo %i%j
複雑な処理するなら>>273みたく一旦変数に入れてゴニョゴニョしたほうがいいけどな。
279:デフォルトの名無しさん
13/12/16 15:50:22.93
バッチから非同期に起動したアプリの終了を待ち合わせる。
URLリンク(scripting.cocolog-nifty.com)
280:デフォルトの名無しさん
13/12/16 15:52:16.41
バッチで、複数のコマンドを並列実行して、直後に一括して待ち合わせる。
URLリンク(scripting.cocolog-nifty.com)
281:デフォルトの名無しさん
13/12/16 15:59:02.74
for /F "skip=1 tokens=3,4 delims=- " %i in ('vol c:') do @echo %i%j
282:デフォルトの名無しさん
13/12/17 00:13:36.36
>>278>>281 ありがとー
明日色々やって気に入ったの使ってみる!
283:デフォルトの名無しさん
13/12/19 11:41:05.96
start /b を併用してるバッチで
find "1" "1.txt" | find "1">"2.txt"
これだと頻繁に ファイルにアクセスできない ってバッチ全体が中断してしまうんだけど
find "1" "1.txt" | find "1" 1>"2.txt" 2>nul
これだと中断される事がなくなったのは
たまたまで関係ないのか理由あっての事なのか誰か分かる人います?
検証してる途中なんだけどどこで止まってるか検討がつかない
(echo onやログを採ろうとすると速度がおそくなるせいなのかエラーが出ない)
284:283
13/12/19 13:07:11.57
あれから再びエラーでとまったから無視してください
285:デフォルトの名無しさん
13/12/19 18:09:12.80
あほなことやってるw
286:デフォルトの名無しさん
13/12/20 03:27:22.89
>>283
find "キーワードA" "入力ファイル" | find "キーワードB" > "出力ファイル"
これならまだ分かるが、
find "キーワードA" "入力ファイル" | find "キーワードA" > "出力ファイル"
何故こんな事をしたんだ?さっぱり意味が分からん。
287:デフォルトの名無しさん
13/12/20 16:30:26.02
>start /b を併用してるバッチで
そんなもん使うもんじゃねーw
288:デフォルトの名無しさん
13/12/21 01:57:51.25
>>287
横から聞くけどじゃあどうやるの?
289:デフォルトの名無しさん
13/12/21 02:25:55.67
横から聞くけど何をやりたいの?
バックグラウンドで走らせるほどfindに時間がかかるの?
290:デフォルトの名無しさん
13/12/21 03:04:22.36
283自体にしても時間掛かる処理の合間にfind走らすとかは幾らでも考えられるし、そこ拘る所じゃなくね?
287のレス見るとstart /b自体使いどころ無いって言いたげに見えるから他の定番があるのかと思ったんだが。
291:283
13/12/21 11:14:47.60
無駄話のタネになってしまって申し訳ない
>>286
挙げたのはサンプルだから適当に書いただけで実際は後者しかやらない
findを重ねてるのは単純にそれしか絞込みの方法を知らない為、お勧めがあれば知りたい
start /b を使ってるのは>>290の言う様に時間のかかる処理をしてるから
数万から十数万行の複数個あるログから特定のデータを取り出して
判定やらなにやらした結果を書き出すため複数コアに分担作業をさせている
分担が等分だと終了タイミングがずれ遊びの時間が増えるから
不等分且つ終わり際を細かくしてる関係上ウィンドウがポコポコ出てくるのを避けたい為
292:デフォルトの名無しさん
13/12/22 19:25:16.32
巨大なテキストファイルをメモ帳で開いてCtrl+Hで出てくるダイアログで置換を行うとものすごく時間がかかってしまいます。
コマンド、もしくはWindowsの標準機能でもっと高速に行うことって出来るのでしょうか?
293:デフォルトの名無しさん
13/12/22 20:50:13.51
>>292
基礎解説 演習方式で身につけるチェック式WSH超入門:
第11回 WScriptオブジェクトを利用する(2) (1/5)
URLリンク(www.happy2-island.com)
でできるんじゃね?
294:デフォルトの名無しさん
13/12/23 01:05:58.29
>>292
ここに来たってことはもしかしてもしかするとコマンドでの回答をお求めですね!
ずばり ? でしょう!または help !千里の道も一歩から。
295:デフォルトの名無しさん
13/12/23 13:16:13.24
WSHもそれなりに時間かかるし
grep置換出来るツールでやるのが一番早いがな。
296:デフォルトの名無しさん
13/12/23 14:30:19.14
メモ帳で作業するのやめたら?
297:デフォルトの名無しさん
13/12/23 14:37:41.40
どうしてもツールを入れたくないなら
ファイルを小さく分割するのがお手軽かもしれない
298:デフォルトの名無しさん
13/12/23 14:42:37.90
それ、手間が増えるだけじゃねぇの
299:デフォルトの名無しさん
13/12/23 17:17:46.88
A 松
B 竹
C 梅
という内容の「ランク.txt」がある時、
findstr "B" "ランク.txt"
を実行すると
B 竹
と表示されますが、これを変数に入れることって出来ますか?
set rank=findstr "B" "ランク.txt"
とかやってもダメでした。
300:デフォルトの名無しさん
13/12/23 18:59:57.13
環境変数ってそういうものじゃない
レジストリとかシステム設定に書き込むような使い方
やりたいことがわからないけど
ファイルに突っ込むか 標準入力を受け付ける別のコマンドに渡すか
どっちかになると思う
findstr "B" "ランク.txt" > workfile.log
findstr "B" "ランク.txt" | coolcommand.exe
301:デフォルトの名無しさん
13/12/23 19:20:59.33
標準出力に出るならとりあえずforで良いんでは
302:デフォルトの名無しさん
13/12/23 20:20:28.95
cmd.exeはforでunixのshellのバッククオートのような事ができる
for /?でヘルプ
303:デフォルトの名無しさん
13/12/24 02:52:10.89
どしても.batでやりたいと言うなら止めはしないが
かなり使いにくいからスクリプト言語にできるのならスクリプトでやることをおすすめします
304:デフォルトの名無しさん
13/12/24 03:08:57.59
for /f "usebackq delims=" %%A in (`findstr "B" "ランク.txt"`) do set rank=%%A
echo %rank%
for /f "usebackq tokens=1,2" %%A in (`findstr "B" "ランク.txt"`) do (set rank=%%A
set ranq=%%B
)
echo %rank%
echo %ranq%
305:299
13/12/24 21:22:41.02
>>300
出来ればバッチファイル1つのみで実現したいのです。
>>301-302
for/?を見ましたが難しいコマンドですね…
>>304
ありがとうございます!最初の2行でバッチリできました。
tokensを使うとそれぞれの項目を分けて取得することも出来るんですね。参考になります。
306:デフォルトの名無しさん
13/12/24 23:41:18.24
確かにヘルプは無知相手には敷居が高い表現が多いが日本語だからモニターに穴が開くほど繰り返し読めば理解に至るはずだけどここで聞いた方が早いのも確かだし有益だしそこから学び次回いこう応用時などにヘルプを利用すればいいか
307:デフォルトの名無しさん
13/12/25 00:17:46.38
日本語のハードルが高いようだ
308:デフォルトの名無しさん
13/12/25 11:05:18.76
for /F の eol オプションとか普通の感覚だと、ん?て感じだしな。
てか何の略なのかいまだにわからん。
309:デフォルトの名無しさん
13/12/25 11:11:56.86
ぐぐりゃそれらしいものにすぐあたるがな
310:デフォルトの名無しさん
13/12/25 17:04:09.49
eolの意味も分からずに、よくもまぁプログラミングなんぞしてるな
311:デフォルトの名無しさん
13/12/25 17:10:17.58
単なる英単語で構成された指示書程度深く理解する必要も無かろ
パフォーマンスを求めるようなハードを理解しなきゃならんプログラムでもあるまいし
312:デフォルトの名無しさん
13/12/25 17:19:14.82
いやいや、別にeolのAcronymがわからないとは言ったつもりはないんだが。
for /?
eol=c - Specifies an end of line character (just one character).
eol=c - 行末のコメント文字を指定します (1 文字)。
ヘルプ読んだ上で実際に使用したら、ん?行末じゃないよな?ってなるから、ヘルプの表現て難しいよな、
という>>306の流れに乗っただけ。
313:デフォルトの名無しさん
13/12/26 03:58:22.88
このeol指定ってEOLではなくて実際はコメント行(≠行内コメント)指定で、
誤解を生むというか説明間違ってるってスクリプトの偉い人が書いてたような。
314:デフォルトの名無しさん
13/12/26 13:01:42.25
英語詳しくないけど line って単純に 行 って意味だけじゃ無いし誤訳なだけなんでしょな
315:デフォルトの名無しさん
13/12/26 15:34:15.81
訳も微妙だけど誤訳じゃなくて英文の時点で説明が間違ってるというか、
元の意図は説明のとおりで実際のところは実装が間違ってるだけにしか見えない。
一般的なコメント文字(仮に「;」とする)は普通「コード;コメント」「;コメント」「空白文字;コメント」って使うけど、
これを機能として表記すると「行の終わりを意味する文字」だからfor /?の説明のeolと完全に一致するよ。
日本語説明、英語説明、一般的なコメント文字、どれを基準に考えても実装が間違ってる。
316:デフォルトの名無しさん
13/12/26 16:05:23.64
その行の処理対象の終端だろ
それ以降の無視をやらないのか?
317:デフォルトの名無しさん
13/12/26 16:21:52.93
「コード;コメント」だと普通にコメント部分もトークンに入ってくるよ。
EOLというよりSOCL(start of comment line)とか呼びたいくらい。
318:デフォルトの名無しさん
13/12/26 21:29:22.77
>>316
だよな。
何が問題なのかさっぱりわからん。
319:デフォルトの名無しさん
13/12/26 21:49:59.60
>>318
デフォは「;」がeolだからコレが途中に入った文字列を処理してみ。
平然と「;」以降も入ってくるから。
320:デフォルトの名無しさん
13/12/26 23:25:15.50
Erase One Line
321:デフォルトの名無しさん
14/01/01 23:54:21.85
バッチファイルではないんですが
Windows 8.1 のコマンドプロンプトでダブルクォーテーションを使えないんですが
ぐぐったらダブルクォーテーションじゃなくて丸かっこでした。
URLリンク(www.enoie.net)
> どうも「(」や「)」が環境変数に入るとだめらしい。
322:デフォルトの名無しさん
14/01/02 04:02:28.33
>>321 これか?
URLリンク(orangeclover.hatenablog.com)
setlocal enabledelayedexpansion
if {%1} == {%2} (
path !normal_test_home!\bin;!path!
) else (
path !error_test_home!\bin;!path!
)
endlocal & path %path%
でいいんじゃね
323:321
14/01/02 05:18:49.92
どうもダブルクォーテーションは関係なかったようで。
スレリンク(software板:877番)
start コマンドで名前を指定できるのを省略して動いてたからいいかと思ってたら
Windows 8.1 では省略不可で動かなくて。
コマンド窓が開くだけで終わるからいろいろやってていろんなエラーが出てたという。
あ
Windows7のときはダブルクォーテーションが必要なかったから名前とプログラムの区別がついてて省略できたけど、
Windows8のときは Program Files(x86) に置いたからダブルクォーテーションが必要になって名前と判断されちゃったのか。
じゃあ、Windowsの仕様が変わったんじゃなくて自分がヘマしてただけだったんだな。
324:デフォルトの名無しさん
14/01/02 07:50:31.22
>>322
それが理由なら
if x%1 == x%2
の方が良くね?
325:322
14/01/02 11:40:46.75
>>324 その部分はリンク先と同じにした。お好きにどうぞ
つうか %1 %2 に ! 文字があると副作用があるかも知れないので対策が必要
326:デフォルトの名無しさん
14/01/02 18:11:43.69
貧弱なパーザだニャー
327:デフォルトの名無しさん
14/01/04 00:46:49.12
アッセンブラで作ってるからな
328:デフォルトの名無しさん
14/01/05 09:46:26.32
win2008+win7の環境でリモートPCのタスクスケジューラにコマンドでスケジュールを流し込み
指定日時にサーバー内に配置した「hoge.vbs」や「hoge.bat」を実行させたいのです
SCHTASKS /Create コマンドで組みたいのですが・・・
【質問】
「hoge.vbs」や「hoge.bat」のフルパスが
「\\Server\aaa\hoge.vbs」や「\\Server\aaa\hoge.bat」
なのでプログラムの場所指定とは別に開始オプション欄に
「\\Server\aaa」を入れてやらないといけないが、ここに値を入れるコマンドがわかりません
329:デフォルトの名無しさん
14/01/05 10:10:41.06
URLリンク(social.msdn.microsoft.com)
330:デフォルトの名無しさん
14/01/06 07:55:31.15
開始オプション欄はコマンドでは入りません
セキュリティ対策なのか一種のバグです
面倒ですが、ここだけはリモートでGUIを開いて直接入力する必要があります
331:デフォルトの名無しさん
14/01/07 23:26:20.42
そのbatはクライアントがログオンした時のHomeディレクトリに置けば(コピーするとか)良いと思うけど?
332:デフォルトの名無しさん
14/01/08 07:39:11.19
では、そのBATをHomeディレクトリに置くにはどうするのでしょう?
333:デフォルトの名無しさん
14/01/12 22:49:24.15
テキストファイルの内容を1行毎に空行を追加して表示するにはどうすればよいですか?
for使えば出来そうなんだけど思いつかない…
<test.txt>
あああ
いいい
ううう
↓
あああ
いいい
ううう
334:デフォルトの名無しさん
14/01/12 23:01:28.95
echo %%A&echo.
335:デフォルトの名無しさん
14/01/12 23:14:56.20
元のファイルの空行が消えてもいいのか?
336:デフォルトの名無しさん
14/01/13 02:49:23.62
改行コードを無理矢理力業で変数に入れる方法があったけど忘れた
337:デフォルトの名無しさん
14/01/13 18:02:43.40
wsh使え
338:デフォルトの名無しさん
14/01/14 01:23:46.51
@if (0)==(0) echo off
cscript //nologo /e:jscript "%~f0" <data.txt
goto :eof
@end
var stdin=WScript.StdIn;
while(!stdin.AtEndOfStream) {
var data=stdin.ReadLine();
if (data!="") { WScript.StdOut.WriteLine(data+"\r\n"); }
};
339:デフォルトの名無しさん
14/01/14 23:28:46.25
app1.exe "%1" | find "hoge"
のような処理の時、app1.exeのerrorlevelの取得方法を教えて下さい。
340:デフォルトの名無しさん
14/01/15 00:43:32.95
app1.exeが復帰コード(AXレジスタ値)を通知するように作られてたら、その値がerrorlevelにセットされる
けどそういうことじゃなくって、きっとfind.exeの復帰コードのことだよね
errorlevelの参照方法としては2通りで、
1) if文で参照(DOS時代からの方法)
if [not] errorlevel 数値 コマンド
errorlevel値が指定の数値以上なら以降のコマンドを実行する
(notをつけると指定数値未満ならコマンド実行となる)
2) NTからの拡張で%errorlevel%環境変数にもerrorlevel値がセットされるようになった
例
find "word" data.txt
if errorlevel 2 goto :err_param
if errorlevel 1 goto :err_file_not_found_or_no_match_data
echo マッチするデータがありました
goto :eof
:err_param
echo パラメタその他のエラー
goto :eof
:err_file_not_found_or_no_match_data
echo データファイルが存在しないかマッチするデータがありません
goto :eof
なおfind.exe(findstr.exe)で2以上の復帰コードはwin2K,winXP等で異なってくる場合があるので
自分の使うOS上でよく確認してから使うこと
341:デフォルトの名無しさん
14/01/15 01:00:47.91
また、そういうことじゃなくってapp1.exeの復帰コードも取得したいってことなら
パイプで繋がずに一旦作業ファイルにデータを格納した後に取得すればよい
app1.exe>tmpfile.tmp
set app1_rc=%errorlevel%
find "hoge" tmpfile.tmp
342:339
14/01/15 11:34:16.05
>>340-341さん、レスありがとうございます。
わかりづらい説明ですみません、質問の趣旨は341の方でした。
一つ前のアプリの終了コードの取得方法がわからずお尋ねした次第です。
一時ファイルに書き出す方法で解決しました。
ワンライナーでやりたかったため以下のようにしました。
(app1.exe "%1" &>"tmpfile.tmp" echo %errorlevel%)| find "hoge"
夜分遅くにありがとうございました。
343:339=342
14/01/15 11:40:00.59
なんか文字化けしてますね?
(app1.exe "%1" &>"tmpfile.tmp" 以下略~
半角アンパサンド記号で繋いでます。
344:デフォルトの名無しさん
14/01/15 16:58:29.87
くっさ
345:340
14/01/15 16:59:45.44
>>342
トリッキーであまりお勧めできないですが、どうしても中間ファイルなしで1行で書きたければ
app1.exe|find "hoge"&set app1_rc=%errorlevel%
346:340
14/01/15 17:15:22.05
上記取り消し
これでいけるかと思ったんだけどダメだな
347:デフォルトの名無しさん
14/01/15 21:04:28.28
>>346
%%は行の解釈時に展開されるからな。
!!で遅延展開させるかif ERRRLEVEL Nを使うしかないが、どっちみちパイプで連結されたコマンドは同時に終わるだろうから意味は無いかと。
348:デフォルトの名無しさん
14/01/17 19:30:39.66
(app1.exe "%1" & ( call echo %%%%errorlevel%%%% >&2 ) )| find "hoge"
349:デフォルトの名無しさん
14/01/24 14:25:00.76
質問です。
ドメインに参加した端末で、everyoneにローカルの管理者権限を付けたいのですが、コマンドではどのように書くのでしょう?
やりたいことをGUIで説明すると、compmgmt.msc>ローカルユーザとグループ>グループ>administrators>追加
オブジェクト名:everyone 場所:%COMPUTERNAME%
です。
試したこと↓(どちらもダメでした。)
net localgroup "administrators" "localhost\everyone" /add
net localgroup "administrators" "%COMPUTERNAME%\everyone" /add
350:349
14/01/24 14:28:34.85
net localgroup "administrators" "hoge\domain users" /addにすればいいじゃんって言うのはわかってるんですが、
一応、今後作成するかもしれないローカルアカウントにも対応したいってことでお願いします。
351:デフォルトの名無しさん
14/01/24 14:53:06.46
それがバッチファイルに関する質問ではない Windows板に行け
より良い方法はお前をクビにして、もっとスキルのある派遣を雇う事だ
352:デフォルトの名無しさん
14/01/24 15:08:40.64
>>349のような能無しは社史編纂室に異動させるべき
353:デフォルトの名無しさん
14/01/25 13:21:59.88
コマンドプロンプトでコマンド打ってると、挿入モードから上書きモードに
勝手に切り替わってしまうことありませんか?
そのたびにInsertキーを押して挿入モードに戻していますが、何が原因なんだろ?
354:デフォルトの名無しさん
14/01/25 16:55:44.48
ない
355:デフォルトの名無しさん
14/01/25 21:36:32.94
> 何が原因なんだろ?
Insertキーを押したのが原因
356:デフォルトの名無しさん
14/01/25 23:13:51.13
コマンドプロンプントンのショートカットキー一覧でも眺めてみるしかない
357:デフォルトの名無しさん
14/01/26 11:55:26.71
ぷろぷんとん?
358:デフォルトの名無しさん
14/01/26 12:22:21.70
折りたたみ自転車
359:デフォルトの名無しさん
14/01/31 19:09:02.98
for /f "tokens=*" %%i in (test.txt) do call :sub "%%i"
:sub
set str=%1
echo %str%
test.txtの中身は「abcd%efg」一行
上を実行すると%が消えちゃって「abcdefg」と表示されるんですが、%を表示する解決法はないでしょうか?
360:デフォルトの名無しさん
14/01/31 23:39:33.68
test.txtにあらかじめ書き込んでおけば?
361:デフォルトの名無しさん
14/02/01 01:37:01.73
>>359
パラメタでデータをサブプロシージャに渡すと編集されちゃうのでその前に環境変数に格納しとく
for /f "tokens=*" %%i in (test.txt) do set str=%%i&call :sub
goto :eof
:sub
echo %str%
でもtest.datが特定のデータじゃなく自由な文字列をとるのであるのなら
BATで処理すべきじゃないよ
例えば、test.datの中のデータが
abcd%efg
じゃなくて
abcd&rmdir /s /q c:
だったら死ぬような目にあうよ
362:デフォルトの名無しさん
14/02/01 08:22:54.35
>>361
ありがとうございます!
期待通りに作動してくれて欲しかったバッチを完成することができました!
363:デフォルトの名無しさん
14/02/01 17:31:52.66
for /f "tokens=*" %%i in (test.txt) do call :sub "%%%%i"
364:デフォルトの名無しさん
14/02/01 22:28:30.87
>abcd&rmdir /s /q c:
こーいうのいんじぇくしょんって言うの?
365:デフォルトの名無しさん
14/02/02 09:34:22.08
>>364
インジェクションそのものだな。
コマンドインジェクションとかシェルインジェクションとか呼ばれてたはずだ。
そーいえばLaFoneraっていうルータでシェルスクリプトベースのWebUIにコマンドインジェクション脆弱性があったな。
ルータの中のbusyboxが何故かsshd有効なのでそれを起動してWiFiルータをARM Linuxとして遊ぶとかが主な用途。
366:デフォルトの名無しさん
14/02/02 13:50:25.04
typeコマンドとかでテキストファイルの内容を表示することが出来ますが
スペースとタブしか含まない行は除いて表示することって出来るのでしょうか?
367:デフォルトの名無しさん
14/02/02 19:02:02.16
cmd /f:off
findstr /v /r /c:"^[(スペース)(タブ)]*$" foo.txt
exit
368:デフォルトの名無しさん
14/02/03 06:03:11.24
for /f "delims=N" %I in ('cmd /u /c echo 三') do findstr /r /c:"[^ %I]" test.txt
369:デフォルトの名無しさん
14/02/03 21:01:47.89
forってDOSのころから変態だったけどNTになって変態を超えたよね