【.cmd】 バッチファイルスクリプト %10 【.bat】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %9 【.bat】
http://toro.2ch.net/test/read.cgi/tech/1335015478/

それ以前の過去スレ
%8  http://toro.2ch.net/test/read.cgi/tech/1315844420/
%7  http://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6  http://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5  http://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4  http://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3  http://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2  http://pc12.2ch.net/test/read.cgi/tech/1197881068/
%1  http://pc11.2ch.net/test/read.cgi/tech/1178281991/
2デフォルトの名無しさん:2013/07/19(金) NY:AN:NY.AN
うんちっち
3デフォルトの名無しさん:2013/07/19(金) NY:AN:NY.AN
@echo ^>^>1乙
4デフォルトの名無しさん:2013/07/20(土) NY:AN:NY.AN
wshもここでええのんか?
5デフォルトの名無しさん:2013/07/20(土) NY:AN:NY.AN
お前ら、wsh使ってますか? Part8
6デフォルトの名無しさん:2013/07/21(日) NY:AN:NY.AN
C:\Users\user\desktop
の時にdesktopだけを表示したいのですがよい方法はありませんか
7デフォルトの名無しさん:2013/07/22(月) NY:AN:NY.AN
「set /p hizuke=日付を入力して下さい:」
とやると
「日付を入力して下さい:」
と出ますが、この時に
「日付を入力して下さい:2013/07/22」
のように今日の日付をデフォルト値として表示出来ないでしょうか?
思いつきで
「set /p hizuke=日付を入力して下さい:<echo %date%」
とかやってみましたがもちろんダメでした…
8デフォルトの名無しさん:2013/07/23(火) NY:AN:NY.AN
set /p hizuke="日付を入力して下さい:%date%"
9デフォルトの名無しさん:2013/07/23(火) NY:AN:NY.AN
空入力でデフォルト値
set hizuke=%date%
set /p hizuke=日付を入力して下さい:%hizuke%
107:2013/07/23(火) NY:AN:NY.AN
ありがとうございます。
ただ言い忘れていましたが、表示したデフォルト値をキーボードで変更できるようにしたいのです。
例えば2013/07/22と表示されたら最後の2を消して5にしたりといった具合にです。
11デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/07/24(水) NY:AN:NY.AN
ありません
13デフォルトの名無しさん:2013/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
1413:2013/07/24(水) NY:AN:NY.AN
ヘルプ見たら
schtasks /query /fo list
または
schtasks /query /fo csv
で表示できるんでないかな
1511:2013/07/24(水) NY:AN:NY.AN
>>13-14
/foオプションで出せるんですね。知りませんでした…
"%systemroot%\tasks"フォルダに保存されるというのも初めて知りました。
これはこれで使い道が色々ありそうなので覚えておきます。
助かりました。どうもありがとうございます。

(実は家のPCはXP-Homeでschtasks無いので試すのは明日会社でですが…(笑))
16デフォルトの名無しさん:2013/07/24(水) NY:AN:NY.AN
3つの.exe ファイルが有るんですが、1つを実行するBATファイルを作りたいです
どうすればいいですか?
17デフォルトの名無しさん:2013/07/25(木) NY:AN:NY.AN
if
1815:2013/07/25(木) NY:AN:NY.AN
今日会社のPC(Win7)で/foオプション使ってうまくいきました。
しかしWin7だとタスクのファイルは"%systemroot%\system32\tasks"フォルダに作成されるようです。
OSの種類によってパスが変わるなんてめんどうな仕様ですよね…(泣)
19デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
仕様なんだからしようがない
20デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN BE:1441685344-2BP(0)
僕のpcにあるテキストファイルを全てusbにコピーしたいです。
すぐにコピーしてペーストすれば使えるbatのコマンドを教えてください!
21デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
@echo off
echo pcにあるテキストファイルを全てusbにコピーしました!!!
exit /b 0
22デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
ありがとう!
23デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
>>20
テキストファイルかどうか、テキストエディタで開いてみないとわからない
25デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
>>23
DELコマンドじゃなくて、COPYコマンドだ。COPYコマンドなら、どこに送るかかかなければならない
26デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
もうねます
27デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
誤ってDELコマンドでファイルを削除した場合、
undeleteという英語版のソフトウェアで復旧できるかもしれない
どれがいいのかしらない
28デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
MOVEコマンドで、ひどいめにあったことがある。MOVEコマンドは、要注意
29デフォルトの名無しさん:2013/07/26(金) NY:AN:NY.AN
ワイルドカードの指定が短いファイル名の方にも効いてしまう問題って
Win7あたりで解消したんだっけ?
30デフォルトの名無しさん:2013/07/27(土) NY:AN:NY.AN BE:4054739459-2BP(0)
ではpc内のデータをすべて削除する場合はどうしたら?
31デフォルトの名無しさん:2013/07/27(土) NY:AN:NY.AN
iso2bin.exe isoをbin 形式に変換するファイルを見つけたんですが
使い方は、
コマンドプロンプト → cd c:\場所 → iso2bin track03.bin track01.iso
コマンドプロンプを呼び出さず簡略化したいんですけどどうすればいいですか?
D&D しても無理みたいです・・・orz
32デフォルトの名無しさん:2013/07/27(土) NY:AN:NY.AN
バッチファイル経由でD&D する
33デフォルトの名無しさん:2013/07/28(日) NY:AN:NY.AN
>>29
仕様は解消したりしないよ
自分が短いファイル名を作るからだろ。自業自得ってもんだ。
作らなきゃいいんだよ。
3417:2013/07/28(日) NY:AN:NY.AN
ちょっと記述が間違ってたので一応訂正しときます。
Win7ではSchtasksで作成したタスクはファイルとして作成されないようです。
"%systemroot%\tasks"フォルダも
"%systemroot%\system32\tasks"フォルダも見ましたが自分が作成したタスクは見当たりません。
"dir /s/b C:\*.job"ってコマンド叩いても出てきません。
コマンドで"Schtasks /query"を叩くともちろん出てきます
そういう仕様に変わったのかな?まあ"Schtasks /query"で確認できるので困りませんが。
35デフォルトの名無しさん:2013/07/28(日) NY:AN:NY.AN
↑は>>17ではなく>>18でした。すみません。
36デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/07/28(日) NY:AN:NY.AN
for /f "delims=: tokens=2" %i in ('type test.txt') do echo %i
3836:2013/07/29(月) NY:AN:NY.AN
>>37
でけましたーーーっ!!
おありがとうございます!
このように書くのですね。
勘違いして遅延展開とかいうのを調べてました・・・(^_^;)
39デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/07/31(水) NY:AN:NY.AN
ファイルを指定する所にこんなの
"file:%~1"
41デフォルトの名無しさん:2013/07/31(水) NY:AN:NY.AN
>>40
ありがとうございました!
おかげさまでうまく行きました!
42デフォルトの名無しさん:2013/07/31(水) NY:AN:NY.AN
>>41
いいってことよ
43デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN
>>44さんできました!
echo;Set regEx = New RegExp>>%~n0.vbs
として解決しました。ありがとうございます。

リダイレクト方法はいくつかあるようですね。
本来ならカッコで囲んでひとまとめにするがシンプルなのでしょう。
(
echo;ほげ
echo;ほげ
)>"%~n0.txt

この方法は今回はバッチの前後の関係から制約があるため、このような方法でやってました。
お答えいただきまして、素早い対応ありがとうございました。
4643:2013/08/04(日) NY:AN:NY.AN
>>44さんへ
質問時に書き込んだ方法ですが、まるっきりの自己流だったようです。
参考にしたサイトを見直してみたら、全然違ってました。昔の記憶をたよりに適当に書いてたようです。
混乱させてすみませんでした。

ちなみにこのサイトです。
「全般/ファイルディスクリプタとリダイレクト - CMD.EXE TIPs」
URLが長いので上のキーワードで検索してください。有名どころですが一応。では失礼します。
47デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN
> つまり>>44はechoの直後にセミコロンとスペースが続いてからSetがあるように
>>43と間違えた
49デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN
echo.>hoge.txt とか echo;>hoge.txt
ってやったら空改行が出力されるのと同じ原理なのかな
50デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN
>%~n0.vbs echo;Set fso = CreateObject("Scripting.FileSystemObject")
だな
51デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN
いつからかコマンドプロンプトで日本語が■■■って表示されるようになっちゃったんですけど
どうやって直せばいいんですか?
ググって出てくるコードページを変えたりフォントを変えるのを試しても戻りませんでした
XPです
52デフォルトの名無しさん:2013/08/05(月) NY:AN:NY.AN
>>51
cmd.exeを再インストールするか諦めてCygwinとか使えばいいんじゃ?
後はWin再インスコ
53デフォルトの名無しさん:2013/08/05(月) NY:AN:NY.AN
>>51
レジストリ
HKEY_CURRENT_USER\Console
を削除してみろ
念のためバックアップしてからね
54デフォルトの名無しさん:2013/08/18(日) NY:AN:NY.AN
= を含む文字列を = を含む文字列で置換するのに良い方法無いでしょうか?
事前にIF使った総当りで入れ替えておく方法は何とかできたのですが
下記の記述方で使えそうなエスケープなどあればと思いまして。


:: A=B を B=A に置換
set test=%test:A=B=B=A%
55デフォルトの名無しさん:2013/08/18(日) NY:AN:NY.AN
>>53
遅くなりましたが
この方法で復活しました
ありがとうございました!
56デフォルトの名無しさん:2013/08/18(日) NY:AN:NY.AN
BをCに蛙
AをBに蛙
CをAに蛙
57デフォルトの名無しさん:2013/08/18(日) NY:AN:NY.AN
>>56
つまり、ループ内で遅延展開を用いた入れ替えをやれってことっすね!

>>54
vbsでregexpしちゃいなよ
58デフォルトの名無しさん:2013/08/19(月) NY:AN:NY.AN
頭が遅延してんの?
59デフォルトの名無しさん:2013/08/19(月) NY:AN:NY.AN
>>56-57
レスどうもです、やっぱ無理ですかぁ
60デフォルトの名無しさん:2013/08/19(月) NY:AN:NY.AN
power shellの話ははどこで話せばよいの?
ざっと見たけどスレがないみたいなんだけど…
61デフォルトの名無しさん:2013/08/19(月) NY:AN:NY.AN
Windows PowerShell Part4
62デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
うそでしょう
64デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
echo %erorlevel%
とか
65デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>65
呼び出し元プロセスの環境変数は普通変えれんぞ。
というかタスク作ってしまったら何も情報伝わらないし、その方法意味あるんか?

なんとなく、
〜(
javac Test.java
echo %errorlevel%
)
ってなってるとか、Typoがあるとか、そういうのの方が怪しい気がする。
一番確実な対処はIF ERRORLEVEL 1とかの擬似環境変数ではない組み込み機能使って判定する方法だと思う。
67デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>66
寝ぼけてたね
確かに意味が無いな
これはインストーラなどでPATH環境変数が変化した場合に有効な手段だった
6867:2013/08/29(木) NY:AN:NY.AN
寝ぼけてたけど、間違ったのは
動作確認のために、コントロールパネルのシステムからユーザー環境変数を追加設定してやってたため

この場合環境変数の設定値が反映されるにはcmd.exeを起動しなおさないと反映されないので
69デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>68
なるほど・・・現在の環境ではなくユーザの環境を読ませる一手間か
start /Iもatもユーザの環境を読み直さないし、runasはスマートカードかパスワード入力が必要になってしまうんだな
タスクはrunasと同等だし環境読み直すのも理解できるけど、エクスプローラからcmd起動したときとかはどういう挙動してんだろうコレ?
70デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
すいませんsetlocal EnableDelayedExpansionで取得できました
いまいちどうして取れたかわかりませんが
71デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
今時なぜコマンドプロンプトなんですか?
powerShellを使わない理由はなぜでしょうか?
72デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>71
コマンドプロンプトで足りるような用途にまで
PowerShellを使わなきゃならん理由は何だ?
まさか、自慢話を始めようとしてるのではないだろうな?
73デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>70
うそでしょう
74デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>73
66で指摘されてるようなやり方してたんじゃね。
「すいませんsetlocal EnableDelayedExpansion(して、%errorlevel%を!errorlevel!にしたら)で取得できました」
だと普通によくあるミス。
75デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>74
すいません書き忘れてました
そづえす%から!にも書き換えてます
76デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
findstrで実行結果にファイル名を出さない方法はありますでしょうか?

findstr "あああ" "C:\test.txt"

とファイルを完全に指定すれば実行結果は

あああいいい
いあああいい
いいあああい

のようになって、ファイル名は出ずに一致した行の内容だけが表示されます。
しかし

findstr "あああ" "C:\*.txt"

のようにワイルドカード指定にすると実行結果には

C:\test.txt: あああいいい
C:\test.txt: いあああいい
C:\test.txt: いいあああい

のように一致した行の内容だけでなく、その行が含まれているファイル名まで表示されてしまいます。
これをファイル名は出さないように出来ないでしょうか?
77デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
for %i in ("C:\*.txt") do @findstr "あああ" "%i"
78デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
>>76
forfiles /?
79デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
>>70
%〜%はその文字列を含むコマンドの実行前に展開されます。
何らかの書き方が原因で、javacの実行からエラーレベル取得までが1つ(1行)のコマンドとして解釈されてしまったのでしょう。
()で括るとかもその一つ。&で繋ぐのもそれに含まれるっけ?
80デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
type "C:\*.txt" | findstr "あああ"
81デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
call echo %%errorlevel%%
8276:2013/08/30(金) NY:AN:NY.AN
>>77>>80
ありがとうございます!
どちらでも出来そうですね。
来週会社で試してみますね。
8376:2013/08/31(土) NY:AN:NY.AN
>>78
すみません、見落としてました。
このコマンドは知りませんでした。

forfiles /m "C:\*.txt" | findstr "あああ"

とすれば処理できそうですね。
ただPCがWinXPなのでこのコマンド自体がありません…
でも勉強になりました。
84デフォルトの名無しさん:2013/09/01(日) 10:52:35.80
findstrで一文字違いまで検索結果に含めたい時スマートな記述無いでしょうか?
「いちごぱんつ」を検索して「いちのぱんつ」とか「いちごぱんだ」とかも同時に拾いたいのです
85デフォルトの名無しさん:2013/09/01(日) 11:53:35.40
ない

いちごぱんつ
*ちごぱんつ
い?ごぱんつ
いち?ぱんつ
いちご?んつ
いちごぱ?つ
いちごぱん*
86デフォルトの名無しさん:2013/09/01(日) 12:01:14.09
findstrは複数文字列のOR検索するのに、
パイプを使わない表記方法(二重引用符で囲んでスペース区切り)
があるのがUNIX系のgrepコマンドより便利だよね
87デフォルトの名無しさん:2013/09/01(日) 23:14:25.16
おお、それでOR検索してくれるのか
一行で済むならおkですありがとう
88デフォルトの名無しさん:2013/09/07(土) 21:02:07.49
echo %test%
89デフォルトの名無しさん:2013/09/07(土) 21:44:23.13
>>85
> *ちごぱんつ
これ正規表現として構文エラーだろw
まあこれに限らずどれも正規表現じゃなくてワイルドカードとして記述してるみたいだが
findstrじゃワイルドカードは使えないだろwww
90デフォルトの名無しさん:2013/09/08(日) 13:50:51.90
dir /s /b "C:\windows" >> ".\a.txt"

で更新中の.\a.txtを

findstr "hoge" ".\a.txt"

で検索してもエラーが起こることは絶対にないですよね?
91デフォルトの名無しさん:2013/09/08(日) 14:41:10.54
command.comじゃないんだからw
92デフォルトの名無しさん:2013/09/08(日) 18:48:49.51
forコマンドの/dオプションってどういう時に使うんだ?
↓の@はAのように書けば事足りると思うが?
/rオプションもいまいち使いどころがわからない。

@for /d %i in ("c:\temp\*") do @echo %i

Afor /f %i in ('dir /s /b /ad c:\temp') do @echo %i
93デフォルトの名無しさん:2013/09/08(日) 20:50:40.92
テキストファイルが1つあり、そのファイルの奇数行目の内容だけを表示することって可能でしょうか?
94デフォルトの名無しさん:2013/09/08(日) 22:01:56.01
>>92
それいうとfor /Dに限らずforデフォルト動作もそうだし、
dir /Sは再帰だからfor /Dと動作違う気がするんだが、
まぁそれはそれとして置いとこう。
Aの欠点
・単純にコマンドが長い
・パイプ動作なのでcmd /U環境でないとUnicode文字が使えない
・/Sだとフルパスで冗長だし/-Sだと相対パス的に美味しくない

>>93
可能だけど、処理が複雑化する予定があるなら別の言語を併用したほうが良い
エスケープ周りで破綻してから再移植とかくっそダルいよ
95デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/09/09(月) 15:54:39.20
>>92
for /r root %i in (.)


>>94
えらく詳しいのー感心感心

隠しはどうする?


>>95
空行はどうする?
find /n /v "" data.txt
で行番号を振って、奇数行だけ
97デフォルトの名無しさん:2013/09/09(月) 16:22:43.22
>>96
すげぇ上から目線で重箱つついてるが、そんなんで人生大丈夫か?

>隠しはどうする?
隠しを列挙したいってケースより普通にfor /Dで済むケースのほうが多いから基本問題なし
そうしなきゃ駄目な時は諦めて、欠点を潰すか無視をしてfor /Fを使えばいい
一々全部の欠点例外を潰した万能定型文で…みたいな事はアホらしいからやりたくない
妥協が許されないならハナから汎用言語でも使っとかないと只の苦行だわ

>空行はどうする?
それも使えない文字の一例にすぎないだろ
行番号を消す処理も必要になるし、その手の対策の積み重ねも複雑化を招く
9892:2013/09/09(月) 21:15:46.13
>>94-95
ご回答ありがとうございます。
なるほど、Aは色々短所が目立ちますね。
実行速度も比較するのが馬鹿らしくなるほど@>>>>>>>>Aでした。
ちなみに>>93も私ですw
これも前途多難な感じなので他の方法を考えます。
なんか話が高度になってきたのでこの辺で…
99デフォルトの名無しさん:2013/09/11(水) 16:23:50.79
set の文字列置換で文字列中に含まれる=自体を置換(削除)したいのですがどうしたらよいでしょうか?

set a=abc=def
set a=%a:==%

とやるとエラーになりますんで…
10054:2013/09/11(水) 17:10:40.49
お、俺じゃないからね!
101デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/09/11(水) 18:26:47.00
for /f "delims== tokens=1,2" %i in ("%a%") do set b=%i%j
103101:2013/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デフォルトの名無しさん:2013/09/12(木) 22:31:25.95
通りすがりだが>>102のでバッチリできたぞ?
これ>>54にも使えるんじゃね?
105デフォルトの名無しさん:2013/09/12(木) 23:23:43.17
>>104
取り敢えずそれで良いとしても、EOL指定とか空行とか非置換行とかメタ文字とか…
最終的には別言語併用出来るようにしたほうが楽な可能性があるって事は留意しておいても良いと思う。
106デフォルトの名無しさん:2013/09/13(金) 14:01:17.61
ある実行中のバッチファイル自身の名前は %0 で得ることが出来ますが、
実行中のバッチファイルを呼出したバッチファイルの名前を知る方法はありますか?
具体的にやりたいのは shebang の再現です。

例えば以下のように始まる perl スクリプトの拡張子を bat にしておきます。

#!/usr/local/bin/perl
ここに perl スクリプトの内容

そして #!.bat という名前のこんな感じのバッチファイルをパスが通った適当なところに置いておきます。

%* ほにゃらら & exit /b

こうすることでおおざっぱにではありますが schebang っぽくできると思うのですが、
このほにゃららのところをどうすればよいか思い付きません。
107デフォルトの名無しさん:2013/09/14(土) 05:01:55.71
男は黙って D:/Perl/bin/perl.exe ほにゃらら.pl

いっそのことCygwinでも入れちゃえば
108デフォルトの名無しさん:2013/09/14(土) 08:44:32.38
>>107
Cygwin も Msys も導入済みです。
だからそれらを使わないときでもそれに挙動を合わせたいというのが動機のひとつです。

また、 Perl を例に挙げましたが実際に使う言語処理系は他のものがメインです。
処理系起動時のオプションでないと切替えられない要素があるのですが、
個別に拡張子を割当てるのが煩雑になるというのが関連付けと PATHEXT を使わない理由です。

バッチファイルでやりたいのでバッチファイルスレで質問してるつもりなんですが、
他の方法を使わない理由をいちいち全部挙げてからでないと回答が出ないもんなんですか?
109デフォルトの名無しさん:2013/09/14(土) 09:00:40.41
全部挙げてもでないかもよ
110デフォルトの名無しさん:2013/09/14(土) 10:01:01.37
プログラム類ってのは目的を達成するための手段にすぎないのだから、特定の手段に拘るだけ無駄というか。
ダメ文字の件とか色々あるし、ドンピシャなテクニックが見つからない・思いつかないなら素直に手を変えるべき。

ハッカー文化的なものだが、バッチファイルってのは手軽な分、そういう手段は問わない傾向がより強い印象。
111108:2013/09/14(土) 11:44:58.17
ちょっと煽り気味でしたね。 すいません。
一応 C/C++ や JScript もそこそこ使えるつもりですが、呼出し元のプロセスが cmd.exe であることはわかっても、
あるバッチファイルを呼出したバッチファイルが何かということを調べる方法は見付かりませんでした。
そんなわけで「バッチファイルの機能」でどうにかなる可能性の方がまだ高いだろうと考えました。
要するに手段に拘っているわけではなく、色々と検討した結果としてバッチファイルに望みがあると思っているのです。
112デフォルトの名無しさん:2013/09/14(土) 12:28:33.75
呼出し元から特定の引数渡すとかあるだろうになあ
113108:2013/09/14(土) 12:31:13.55
>>112
要件は >>106 で述べた通りです。
可能であれば shebang 風 (完全に互換とまでは言わずとも) にしたいのです。
114デフォルトの名無しさん:2013/09/14(土) 13:47:04.98
>>113
ttp://scripting.cocolog-nifty.com/
出来たかどうかは忘れたけど、ここでバッチの呼び出し元がどうのこうのの記事を読んだ気がする
115デフォルトの名無しさん:2013/09/14(土) 13:54:41.57
1.bat

call 2.bat "%~0"

2.bat

echo 呼び出し元:%~1
exit /b
116108:2013/09/14(土) 14:04:49.20
>>114
今回の件に役立ちそうな情報は見付かりませんでした。
https://www.google.co.jp/webhp#q=site:http%3A%2F%2Fscripting.cocolog-nifty.com++%22%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%85%83%22

でも、面白い記事が多いですね。 紹介ありがとうございます。
117デフォルトの名無しさん:2013/09/14(土) 14:11:23.69
>>108
wshでWMI介して親プロセスのコマンドラインを取得
互換性ほしいなら他にないと思う
118デフォルトの名無しさん:2013/09/14(土) 14:31:30.89
バッチファイルで現在や親のプロセスIDを調べる。: Windows Script Programming
http://scripting.cocolog-nifty.com/blog/2007/01/id_548f.html
これをプロセスIDからコマンドラインに変えればいいじゃね?
119デフォルトの名無しさん:2013/09/14(土) 14:36:01.77
昔のtlist.exeはppidを出してたから、これ使えばいいよ
120108:2013/09/14(土) 15:17:15.13
既に >>111 で述べましたが、それらの方法で得られるのはあくまでも cmd.exe を呼出したプロセスであり、
cmd.exe 内で実行されたバッチファイルの呼出し元ではありません。
121デフォルトの名無しさん:2013/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
122108:2013/09/14(土) 17:05:15.57
>>121
すばらしい。
このスレ的にはアレですが、解決策ありがとうございます。
123デフォルトの名無しさん:2013/09/14(土) 22:14:15.91
おいおい

>>108
> バッチファイルでやりたいのでバッチファイルスレで質問してるつもりなんですが、
> 他の方法を使わない理由をいちいち全部挙げてからでないと回答が出ないもんなんですか?

こんなこといってたくせにそれかよ
124108:2013/09/14(土) 23:13:28.98
>>123
出来ない理由を覆されたので問題ないです。
125デフォルトの名無しさん:2013/09/15(日) 01:55:19.47
>>121
バイナリのインストールを必要としない方法ではほぼWSHしか無いが、WMI呼べるならなんでも良いだろう。
一時ファイルにスクリプト吐いてdebugコマンドで必要な実行可能バイナリ生成して実行、とかも不可能ではない。
>>123
111で反省してたように見えたのに、なんつうかデフォでそういう人なんかね?
126デフォルトの名無しさん:2013/09/15(日) 05:59:54.41
自分で考えようともしない馬鹿だからどーせすぐ死ぬだろ
127デフォルトの名無しさん:2013/09/15(日) 06:00:10.27
debugって32bitだけじゃないの
128デフォルトの名無しさん:2013/09/15(日) 06:56:29.77
>>127
debugは16bit時代の遺物だからなぁ…
テキスト化したCOMファイル…もダメか。
まだ手はあると思うけど、出てこない。
129デフォルトの名無しさん:2013/09/15(日) 11:48:12.32
現在ログインしているユーザーのユーザーフォルダを表すパスって ~ ですよね?
cd ~ でそのユーザーのユーザーフォルダにいけると思ったんですができませんでした
130デフォルトの名無しさん:2013/09/15(日) 11:52:40.77
cd %USERPROFILE%
131デフォルトの名無しさん:2013/09/15(日) 12:02:53.19
>>130
/dオプション付けた方が安全だよ
pushdならオプション不要だけど

cd /d %USERPROFILE%
pushd %USERPROFILE%
132デフォルトの名無しさん:2013/09/15(日) 14:41:32.93
>>129
節子それUnix/Linuxの話や
cmd.exeでは上の通り環境変数を参照するのが良いかと
%homepath%とかもある、俺は何となく字面的にこっちが好きだから使ってるだけだが
133デフォルトの名無しさん:2013/09/15(日) 15:19:04.82
@rem = '--*-Perl-*--
@perl -x -S %0 %*
@goto :eof
@rem ';
134デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/09/16(月) 19:56:19.54
>>134
for /Fを使ってSourceとDestを環境変数に突っ込んで後で出力する。
set /Pのプロンプト文字列(改行されない)を使うって手もあったと思うが、そこまで拘るならバッチ以外も想定したい所。
136134:2013/09/16(月) 20:03:51.75
>>135さん、レスありがとうございます。
for /Fコマンドで環境変数にSourceとDestをそれぞれ設定後に出力、という手順でできるんですね。
forコマンドは使ったことないので、ヘルプで調べながら挑戦してみます。
回答いただきありがとうございました。
137デフォルトの名無しさん:2013/09/17(火) 22:03:09.60
いいってことよ
138デフォルトの名無しさん:2013/09/19(木) 06:01:56.22
start X
start Y
start Z
のように複数のショートカットをまとめて起動するbatファイルを作成したのですが
これらを一斉にアクティブ、最小化、閉じるなど管理する方法はないでしょうか

起動しているものはインターネットブラウザなどです
139デフォルトの名無しさん:2013/09/19(木) 08:08:39.01
>>138
終了や強制終了は出来るけど、それ以上の操作をしたいならWSHとかもしくは操作自動化マクロとか使ったほうが良さげ。
そもそもGUIはコマンドプロンプトで操作するものじゃないし。
140デフォルトの名無しさん:2013/09/19(木) 08:38:19.46
>>139
開いた複数のウインドウをすべて終了できるのでしたら十分です
素人質問で申し訳ないですが、どのように記述するとよいでしょうか
141デフォルトの名無しさん:2013/09/19(木) 09:11:50.93
連投すいません
いろいろ調べてみましたがどうやら検討違いな質問だったようです
ですがWSHを使うという情報が手に入っただけで大きな成果でした
>>139さんありがとうございました
142デフォルトの名無しさん:2013/09/19(木) 13:10:48.73
最小化
start shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}
閉じる
taskkill /im X & taskkill /im Y & taskkill /im Z
143デフォルトの名無しさん:2013/09/19(木) 15:56:29.64
>>142
解決しそうです、ありがとうござます
144デフォルトの名無しさん:2013/09/22(日) 19:32:24.35
「for /F」って「for /f」でも動くと思うんだけど
前者の書き方をする人が圧倒的に多いよね。なんでだろ?
145デフォルトの名無しさん:2013/09/22(日) 19:44:50.79
圧倒的かどうかは知らんが /? 見ると大文字だし
コマンドによってはスイッチの大文字と小文字の区別があるものもあったりしたような
コマンドではなく cuiアプリだったかも知れんが。
あと、スイッチをわかりやすくする為とかじゃないの?
俺はラベルと環境変数名だけ大文字にしてる。
146デフォルトの名無しさん:2013/09/22(日) 19:46:38.21
>>144
for /? での表示が /F になってるからでしょ。
オプション文字はたまに大文字/小文字区別することあるから...
147デフォルトの名無しさん:2013/09/22(日) 19:47:44.54
リロードせずに書いたら、被ってた... orz
148デフォルトの名無しさん:2013/09/23(月) 03:06:20.15
まあどのコマンドもヘルプ見るとオプションは大文字だけど
大抵は小文字でも動くし小文字で書く人も多い。
でもforに限ってはなぜか大文字で書く人が多めな感じはするね。
149デフォルトの名無しさん:2013/09/23(月) 03:11:40.02
>>144
そのオプションの大文字小文字の区別有無は知らないけど、
forコマンドの%%1文字変数は大文字小文字が区別されるから(震え声)
150デフォルトの名無しさん:2013/09/23(月) 14:46:33.35
強調だろw
151デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/09/25(水) 09:45:01.39
for () だと変数は逐次更新はされないから、やるなら do call :sub %%A みたいに使わないとダメなんじゃないっけ
153デフォルトの名無しさん:2013/09/25(水) 10:38:37.03
>>151
>パラメータは変数のように部分抽出できない為?
できない為。
>3行目と4行目が正しく実行されませんでした。
%環境変数%の展開はコマンドを読んだ時点で行われる。
「for %%i in (*) do ([改行]〜中略〜[改行])[改行])」というコマンドを解釈した時点で「%B:~54%」が展開されてしまう。
setlocalコマンドかネストしたcmd.exeで遅延展開を有効にして%環境変数%の代わりに!環境変数!形式を利用するか、
callで飛んで処理したりコマンド自体にcallを付ける等で環境変数の展開が毎回行われるようにしなければならない。
154デフォルトの名無しさん:2013/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
)
155151:2013/09/25(水) 12:25:58.64
>>153
ありがとうございました。
callで:subに飛ばして解決できました。

>>154
54は固定長でROBOCOPYのログなんでファイル名までがそんくらいだったんです。

ありがとうございました。
156デフォルトの名無しさん:2013/09/26(木) 12:50:23.27
コマンド1 引数
コマンド2 引数
って書いてもコマンド2が実行されません

コマンド1 引数 & コマンド2 引数
って書くとコマンド2は実行されますが
コマンドの量が多くなると可読性が失われるので困ってます

アドバイスお願いします
157デフォルトの名無しさん:2013/09/26(木) 13:43:32.61
具体的に書けよ。

どう考えても書いたコマンドに問題があるとしか思えん。
158デフォルトの名無しさん:2013/09/26(木) 14:57:15.67
もしコマンド1がbatとかならcallで呼ぶ
159デフォルトの名無しさん:2013/10/02(水) 02:33:34.10
ipconfigコマンドを実行するとネットワークカードのIPアドレスを表示出来ますが
LANケーブルを抜いた状態だと例え固定IPを設定していてもIPアドレスが表示されません。
LANケーブルが抜けていてもIPアドレスを表示できるコマンドはないでしょうか?
160デフォルトの名無しさん:2013/10/02(水) 02:42:23.00
詳細忘れたけどnetshで見れなかったっけ
161159:2013/10/04(金) 01:46:05.71
>>160
見れました!ありがとうございます。
IPも変えれるなんて便利ですね。
162デフォルトの名無しさん:2013/10/08(火) 15:48:55.97
過去ログ漁って call で遅延展開する方法があったけど
Windows7のコマンドプロンプトで動かしても、ファイルがないと言われたので
さらにググって、!(びっくりマーク)でくくると遅延展開するというのを見つけて作ってみた。

経緯と中身はこっち 4桁の連番にするバッチ
ttp://toro.2ch.net/test/read.cgi/avi/1319451871/612-614

> setlocal enabledelayedexpansion
っていうのを入れないとただの文字として扱われてたからいるよね。

なんていうか、
           <イレル 「考えすぎでしょうか」
人がすんなりできる事をいちいち詰まってドツボに嵌る人生なんだなって。
163デフォルトの名無しさん:2013/10/08(火) 21:25:21.54
すまん、よく分からんのだが
%の展開を2回するのを遅延展開というのか?
164デフォルトの名無しさん:2013/10/08(火) 21:47:56.12
>>163
2回というか、2重?

遅延展開は %%変数%% でも !変数! でもいいらしい。
「!」が使えるのはNT系だけど、いまどき 9x で新規バッチなんて作らないだろうし。

ちなみに今 call と %%変数%% でやってみたらできました。

%%変数%% を使う場合でも
> setlocal enabledelayedexpansion
ってのを入れないといけなかったんですね。
165デフォルトの名無しさん:2013/10/08(火) 21:51:55.29
> %%変数%% を使う場合でも
> > setlocal enabledelayedexpansion
> ってのを入れないといけなかったんですね。
そんなことはない
あと全角キモいからやめろ
166デフォルトの名無しさん:2013/10/08(火) 21:56:12.27
>>165
でも、エラーになるんですけど。ちなみにWindows7です。

call 使わなかったら %変数% っていう文字として処理されるし。
167デフォルトの名無しさん:2013/10/08(火) 21:57:06.50
call %%hoge%% のパターンは遅延展開とは言わん
168デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/10/08(火) 22:10:15.72
遅延展開は見えないが %多段展開は echo on で見えるだろ
171162:2013/10/08(火) 22:22:17.12
>>169
>>168 さんのは動きました。

すいません。
もしかしたら別のところで引っかかってたのかも。
ファイル名の後ろにつなげようとして %%~nS とか使ったときに、
変更前のファイル名のほうでやっちゃってエラーが出たりしたので、それと混同したのかも。

「!」の方はそれだけだと文字扱いでしたが。

「<イレル」は校正のやり方
今ちょっと微妙にマイナーなライトノベル作家のスレに常駐してるので。
ちょっとしたジョーク。
172デフォルトの名無しさん:2013/10/08(火) 22:33:22.21
>>171
アチコチの情報を漁るのも良いけど、ヘルプをまずちゃんと読んだほうが良い
体系的な知識が得られるので
それから、コマンドヘルプも活用できる
今回の遅延環境変数(!)の話なら
set /?
173デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/10/09(水) 00:01:34.13
>>173
解説ご苦労様と言いたい所ですが169さんは質問者じゃないと思いますよーwww
175デフォルトの名無しさん:2013/10/09(水) 00:26:11.37
>>174
・・・ああ、色々盛大に勘違いしてたorz
176デフォルトの名無しさん:2013/10/09(水) 11:15:09.65
>>168
call echo %^A%
ってやればプロンプト入力でもいける
177デフォルトの名無しさん:2013/10/12(土) 02:48:38.73
とあるファイルの、フルパスでなく、属する直上のフォルダ名を取得する方法を教えてくだちい
178デフォルトの名無しさん:2013/10/12(土) 03:23:16.89
for %%A in ("%~1\..") do echo %%~nxA
pause
179デフォルトの名無しさん:2013/10/12(土) 03:40:49.43
おおすごい!
\..の部分で階層一つ上げてるってわけですかね?

サンキュウベリーマッチョ!
180デフォルトの名無しさん:2013/10/12(土) 15:44:17.94
for %%A in ("%~dp1\.") do echo %%~nxA
pause
181デフォルトの名無しさん:2013/10/23(水) 00:20:20.38
set rtn = %errorlevel%
exit rtn

↑のようなコードを見たことあるんだけど、2行目は「exit %rtn%」になるんじゃないの?
182デフォルトの名無しさん:2013/10/23(水) 00:32:50.68
なことはない
183デフォルトの名無しさん:2013/10/23(水) 00:45:33.68
今試したけど、それ無効(errorlevel値に影響しない)になってると思われる
batのerrorlevelは別にexitで値を返さなくても返されるので
まあ意図したようには動作するけど

dir z: (存在しないドライブ名)
set abc=9
exit abc と exit %abc%
で試せば分かると思う
184181:2013/10/23(水) 02:02:48.29
>>183
試してみたらやはり「exit %abc%」の書き方が正解みたいですね。
自分が見たサンプルはたまたまうまくいってただけっぽい…
勉強になりました。ありがとうございます。
185デフォルトの名無しさん:2013/10/23(水) 02:08:18.01
いや、だからexitに数値指定なしだとbatでのerrorlevel値がそのまま帰るんだよ
多分exitは数値じゃなかったらパラメタは無効にするんだと思う
だから
set rtn = %errorlevel%
exit rtn
この2行と
exit
とは等価となってる
186デフォルトの名無しさん:2013/10/23(水) 03:22:37.39
等価って書いたけど間違っているかも知れない
exitだけだと
受け側がbat以外のプログラムだったら復帰値として
errorlevel値が帰らないかもしれない(未確認)
187デフォルトの名無しさん:2013/10/31(木) 10:53:34.17
cleanmgr /c c: /sageset:1
cleanmgr /c d: /sageset:2

これをbatファイルから実行しても1行目しか実行されません
CドライブとDドライブのディスクノクリーンアップが出来ればOKなんですが
何か良い方法ありませんか?
188デフォルトの名無しさん:2013/10/31(木) 13:30:06.76
バッチファイルはその行の処理が終了しないと次の行に行かないので
この場合Cのクリーンアップが終了するまでDのクリーンアップは起動しない。
そしてcleanmgrは複数同時起動しないのでCとDのクリーンアップを同時に行うのは無理。
ちなみにわかってるとは思うけどsagesetはオプション設定で実際のクリーンアップはsagerunね。
189デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/10/31(木) 14:52:42.78
バッチの問題じゃなくてソフトの問題だってレスしてくれてるじゃないの。諦めよう
191デフォルトの名無しさん:2013/10/31(木) 15:44:51.93
わかりました
192デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/10/31(木) 17:04:28.22
>>192
それtaskkillが実行される時はcleanmgrが終了した時だから意味なくない?
194デフォルトの名無しさん:2013/11/04(月) 07:58:59.84
Windowsのコマンドラインで、文字列の最後尾に0x00のNULL文字を追加した文字列を
任意の変数にセットする方法を教えて下さい

abcd0x00 abcdの後に0x00が1つの合計5文字
195デフォルトの名無しさん:2013/11/04(月) 09:17:14.82
バッチファイルでバイナリ文字列扱うとか無謀すぎると思う
変態という名の神々が戯れにやる類の仕事ではなかろうか
196デフォルトの名無しさん:2013/11/04(月) 09:53:28.74
常識ある組織なら、然るべきスクリプト言語を使わせるだろう。
「Windows標準でないからNG」とか喚くような所なら、さっさと辞めるが吉。
197デフォルトの名無しさん:2013/11/04(月) 10:52:17.85
Windows標準ならWindows Script Hostがある
198デフォルトの名無しさん:2013/11/04(月) 14:23:05.50
>>194
未検証だけどバイナリエディタで0x00の1バイトファイル作っておいて、
typeコマンドで当該ファイルを変数に流し込めばいけるかも
199デフォルトの名無しさん:2013/11/04(月) 16:18:35.24
>>198
「バイナリエディタはWindows標準でないから使用はNG」とw
200デフォルトの名無しさん:2013/11/04(月) 22:31:52.59
真面目にやるならdebugコマンドだが、最近のWindowsには付属してないんだよなぁ・・・
201デフォルトの名無しさん:2013/11/05(火) 05:31:31.99
>>200
command.com削除されたの?
202デフォルトの名無しさん:2013/11/06(水) 00:43:53.39
>>201
16ビットのエミュレーション機能が消えて同時に消えたとか聞いた気が。
ちゃんと調べたりしたわけじゃないんで間違ってたらすまん。
203デフォルトの名無しさん:2013/11/06(水) 07:43:02.29
スクリプトは使用したくないのであれば下記のバッチファイルを使用する。

@echo off
empty.exe *

ファイル(F) --> 名前を付けて保存(A)をクリックする。
ファイル名(N) で 必ず ダブルコーテーション でファイル名をくくってください。

バッチファイルは

"メモリ開放.bat"


ってあるんですけど、「必ず ダブルコーテーション でファイル名をくくってください」
ってのは何で?他のサイトだと普通にempty.batとかで保存していいみたいなんだけど
204デフォルトの名無しさん:2013/11/06(水) 08:34:57.76
拡張子が.bat.txtにならないようにだろ
ていうかそのサイトで聞け
205デフォルトの名無しさん:2013/11/06(水) 22:00:57.93
メモリ開放!
206名無しののVBS:2013/11/09(土) 05:27:27.39
””って拡張子修正用と言ってたような気がする
207デフォルトの名無しさん:2013/11/10(日) 12:23:41.42
vimのコマンド作って便利になった
208デフォルトの名無しさん:2013/11/13(水) 00:21:19.77
<"C:\TEST1.bat"の内容>
C:\TEST2.bat
notepad

<"C:\TEST2.bat"の内容>
mspaint


上記2つのファイルがある時にコマンドプロンプトから"C:\TEST1.bat"と入力してエンター押すと
ペイントは起動するのですが、メモ帳が起動しません。
メモ帳も起動させたい場合はどのように記述すればよいのでしょうか?
209デフォルトの名無しさん:2013/11/13(水) 00:29:29.94
>>208
batからbatを起動すると制御が起動したbatに移動し元には戻ってこない(ジャンプってこと)

mspaintが終了するまでnotepadを起動しなくて良いのなら
call test2.bat

同時に起動するなら
start test2.bat
210デフォルトの名無しさん:2013/11/13(水) 00:59:19.52
>>209
制御が戻ってこないとは知りませんでした…
callでバッチリうまくいきました。
ありがとうございます!
211デフォルトの名無しさん:2013/11/14(木) 00:20:01.44
callとcmd /c、startとcmd /kはどう違うの?
212デフォルトの名無しさん:2013/11/14(木) 00:29:35.43
メインメモリの空き容量が・・・
213デフォルトの名無しさん:2013/11/17(日) 16:52:32.11
気にしない
214デフォルトの名無しさん:2013/11/19(火) 22:18:06.13
シェルスクリプトのスレ誘導してくれ
215デフォルトの名無しさん:2013/11/20(水) 09:23:01.58
>214
↓悪いが、ここから適当に見て回ってもらうしかない。
【最強CUI】PowerShell -Part 1
ttp://toro.2ch.net/test/read.cgi/tech/1378978504/
VBScriptについて必死に話し合うスレ
ttp://toro.2ch.net/test/read.cgi/tech/1242136180/
[JavaScript] スクリプト言語34 [Perl,Python,PHP]
ttp://toro.2ch.net/test/read.cgi/tech/1367771981/
ECMAScript デス 4
ttp://toro.2ch.net/test/read.cgi/tech/1325448978/
【JavaScript】スクリプト バトルロワイヤル40【pl,rb,php,py】
ttp://toro.2ch.net/test/read.cgi/tech/1379350030/
       コマンドプロンプト       
ttp://toro.2ch.net/test/read.cgi/win/1381119881/
お前ら、wsh使ってますか? Part8
ttp://toro.2ch.net/test/read.cgi/win/1292764835/
Windows PowerShell Part4
ttp://toro.2ch.net/test/read.cgi/win/1359719778/
216デフォルトの名無しさん:2013/11/20(水) 17:39:56.64
シェルスクリプトってバッチファイルよりは強力だしスレ無いわけが・・・
で、shだと誤爆が多そうだしcshで探したらこんなのが。
C shell 撲滅委員会
http://toro.2ch.net/test/read.cgi/unix/1094041299/

それはさておき、まぁ当然だけどUNIX板いくだけで一発だな。

シェルスクリプト総合 その22
http://toro.2ch.net/test/read.cgi/unix/1383260330/
217デフォルトの名無しさん:2013/11/20(水) 23:17:41.18
>>215 >>216 やっぱりここで聞いてよかった  ありがとな
218デフォルトの名無しさん:2013/11/29(金) 04:55:52.45
http://zion009.blog98.fc2.com/blog-entry-50.html
こちらをバッチにしてD&Dするとtsファイルが0キロバイトで出力されます
私が間違っているのでしょうかサイト側のミスなのでしょうか
219デフォルトの名無しさん:2013/11/29(金) 06:24:38.80
>>218
まずvlcに直接喰わせたときに、そのファイルはちゃんと出力されるのか?
話はそれからだ
220218:2013/12/05(木) 10:45:55.06
今更ながらコピーしたのをサクラでペーストし、後ろの半角スペースを削除したら正常に出力されるようになりました
221デフォルトの名無しさん:2013/12/05(木) 22:58:16.73
教えてください
既定のzipの関連付けは確か

>assoc .zip
.zip=CompressedFolder

だったと思うんだが、いつの間にか

>assoc .zip
拡張子 .zip のファイルの関連付けが見つかりません

になってしまっていた。しかし、

>start a.zip

で圧縮(zip)フォルダが起動する。
なぜだ?
222デフォルトの名無しさん:2013/12/05(木) 23:13:19.79
てめえの既定など知らんわ
そもそも関連付けはマシーンではなくペルソナにメガ進化している
223デフォルトの名無しさん:2013/12/05(木) 23:30:56.75
.zip=CompressedFolder はWindows8の既定
224デフォルトの名無しさん:2013/12/06(金) 00:04:52.50
.cabや.lzhも同じような…
assocは何の意味があるのか
225デフォルトの名無しさん:2013/12/07(土) 15:01:02.16
コマンドでビープ音を出すことは出来ますか?
可能ならスピーカーがミュートになっていても音を出したいのですが
無理ならスピーカーからでも良いので何らかの音が出せれば良いです。
226デフォルトの名無しさん:2013/12/07(土) 15:16:00.81
>225
例:コマンドプロンプト画面で以下のように打ち込むと、Cドライブのルートフォルダに"Beep1.bat"ができる。
それを実行するとビープ音が一回鳴る。
(※「^G」と表記した箇所では、実際には[Ctrl]+[G]を押す事。これによりアスキーコード7が入力される)

echo @echo ^G > C:\testBeep.bat
227226:2013/12/07(土) 15:26:39.33
例として挙げたファイル名をうっかり書き間違えた。orz
とにかく"C:\testBeep.bat"なら"C:\testBeep.bat"を実行すればOKって事で

アスキーコード7は元々ビープ音を鳴らす為の制御コードだが、PCによっては
ヘッドホンを繋いでるとヘッドホンからしか聴こえない場合もあるから注意。
こればかりは実際どうしようもない。
228デフォルトの名無しさん:2013/12/07(土) 22:15:40.57
Windows7以降はビープ鳴らせないんじゃなかったっけ
229デフォルトの名無しさん:2013/12/08(日) 00:27:54.07
コマンドプロンプトでCtrl+Gじゃなくて普通にキーボードから「^G」って打ってエンター押したら
いきなりIEが立ち上がってGoogleで"undefined"を検索した状態になってすげえびっくりした。
なんなんだこりゃ?
230デフォルトの名無しさん:2013/12/08(日) 05:21:11.98
私のWindows7(Pro)64bitでは、ちゃんと>>226の方法でビープ音が鳴るよ。
[Ctrl]+[G]を2回続けた場合はビープ音も2回鳴る。
231デフォルトの名無しさん:2013/12/08(日) 05:52:09.63
すみません、スクリプト初心者で色々と試行錯誤の上、ちょっとハマってしまったので教えて頂けないでしょうか。

やりたいことは以下の処理が出来るバッチファイル(check.bat)を作りたいのです。
232231:2013/12/08(日) 05:55:24.55
(1)A)のコマンドを実行し、その結果に「kdb106.dll」という文字列があれば(2)の処理に進む、無ければ何もせずバッチ処理終了

(2)B)のコマンドを実行し、その結果に「PCAT_106KEY」という文字列があれば(3)の処理に進む、無ければ何もせずバッチ処理終了

(3)「check.bat」と同じディレクトリにある「update.bat」を実行し、処理終了。
  ※「update.bat」はちゃんと動くものが用意されています
233デフォルトの名無しさん:2013/12/08(日) 06:32:28.13
(1)set a = A | findstr kdb106.dll
if %errlvl%
(2)set b = B | 略
(3)update.bat

こんな感じだけど記述は適当です
何にハマったのか気になります
どこまで出来たのか気になります
たぶん何もしてなくて丸投げなんだろう
と思いますがいかがですか
234デフォルトの名無しさん:2013/12/08(日) 06:33:34.38
(cmd && cmd)ってbatで出来たっけshellだけだっけ
235231:2013/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で特定の文字列があるかどうかをやりたいのですが、
うまく変数に入ってくれないのです。すみません。。。
236231:2013/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デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/12/08(日) 08:24:01.85
あと、そもそも環境変数に複数行データを格納することは出来ない
240231:2013/12/08(日) 08:35:19.32
>>237さん

情報ありがとうございます!!
errorlevelで判別し、分岐処理させることが出来ました。
これでうまく作れそうです。
本当にありがとうございました!!
241231:2013/12/08(日) 08:40:10.36
>>238-239

追加情報もありがとうございます。
微調整するようにしますね!
242デフォルトの名無しさん:2013/12/08(日) 10:11:55.42
>>230
ビープとはビープスピーカー(PC本体に付いてる奴)を鳴らすってことであって
音声出力のスピーカーから鳴る奴は違う。
243デフォルトの名無しさん:2013/12/08(日) 13:25:43.57
>>228>>242
マザボにビープスピーカーが無い場合、XP以前でもサウンドスピーカーで代用ビープが鳴ってなかったか?
244デフォルトの名無しさん:2013/12/08(日) 15:11:24.99
代用ビープってなんかワロタw
昔飲んだ代用コーヒーを思い出した…
245デフォルトの名無しさん:2013/12/10(火) 16:30:03.46
ファイルのタイムスタンプの時間の変更方法を教えてください。
日付ですと、以下のように一旦変数に入れて戻すことで可能ですが、時間の場合この方法は使いづらいのです。

set NOWDATE=%DATE%
date 2000-01-01
copy /B "hoge.txt" +
date %NOWDATE%

外部ツールを使わない方法を模索しております。よろしくお願いいたします。
246デフォルトの名無しさん:2013/12/10(火) 22:44:13.91
scriptかpowershell
247245:2013/12/10(火) 23:15:11.36
>>246
スクリプトですね、調べてやってみたいと思います。
レスありがとうございました。
248デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/12/14(土) 12:07:14.89
シャットダウン中ってプロセスの起動制限無かったっけ?
startの代わりにcallじゃいかんのか?
251249:2013/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デフォルトの名無しさん:2013/12/14(土) 15:38:47.70
>>251
念のために確認するけど
a.txtとかb.txtって実際にはフルパス指定してる?
それか、先頭に
pushd %~dp0
を書いてみれば?
253252:2013/12/14(土) 15:54:57.38
上のレスは無視してくれ
カレントはscriptの位置になってるようだ
アクセス権の問題かとも思ったけどSYSTEMはフルになってるし(まあ念のために確認してみて)
でもscriptフォルダに余計なファイルを書くことはお勧めできないので
別に用意してそっちに書くようにすてはどうか?
ちなみにlogoff scriptでexeを起動するなんてことは
俺はやっているしログファイルも作成してるんで出来ないことはないはず
254252:2013/12/14(土) 15:57:28.16

logoff scriptはshutdown scriptと読み替えてくれ
255デフォルトの名無しさん:2013/12/14(土) 16:03:39.04
a→b→a としたいなら、
bに
exit /B
を付けてaに処理が戻るようにしてみては。
256デフォルトの名無しさん:2013/12/14(土) 16:08:45.97
exit /?
を参照ね。
終了コードを付加することで、戻ったバッチ側で判定して分岐なんかの処理もできる。
257249:2013/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の権限はフルでした。
258249:2013/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デフォルトの名無しさん:2013/12/14(土) 23:07:19.91
で、 >>249 が動かない理由は解決した?

もしかしてフルパスで↓だと終わらないぞ
start /wait "c:\b.bat"
260デフォルトの名無しさん:2013/12/15(日) 00:53:06.53
>>249
状況から見てb.batが見つからないからエラーが出て止まってるだけだろ
試しにa.bat内のsart /wait c.bat
に変えて通常実行してみりゃ、
'c.bat'がみつかりません。とかのメッセージボックスが出て止まったままになるしさ
261デフォルトの名無しさん:2013/12/15(日) 01:26:41.08
vol c: | findstr /C:シリアル番号
で出てきたシリアル番号だけを抜き出して表示したいのですが
どうすりゃ良いか教えてください
262デフォルトの名無しさん:2013/12/15(日) 01:57:08.69
for /F "tokens=3" %i in ('vol c: ^| findstr /C:シリアル番号') do @echo %i
263249:2013/12/15(日) 04:16:05.52
>>259-260

アドバイスありがとうございます!!
よくよく見てみたらおかしかったです。
264デフォルトの名無しさん:2013/12/15(日) 11:15:41.61
batでプログラムを作っているのですが、
start...
start...
で別のプログラムをいくつか同時起動してそれらが全てが自動終了したときに
次の処理に進みたいのですが、こんな判定ってできますか?
265デフォルトの名無しさん:2013/12/15(日) 11:35:21.71
どっかに動作中を示すファイル作っておいて定期的に存在のチェック
って方法をやってるけど、そういう用途のコマンドとかコンソールアプリあるなら俺も知りたいな

まぁ、そこまでやるなら...って話はもちろんわかるけども。
266デフォルトの名無しさん:2013/12/15(日) 12:34:59.25
notepad | notepad | more
267デフォルトの名無しさん:2013/12/15(日) 12:58:15.28
横だけどこれってどういう仕組みなの?
パイプが出力を次のコマンドに渡すやつだってことはわかるけど、
notepadは何も渡さないとして、なんでmoreで止まるの?
268デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/12/15(日) 13:51:51.51
>>266>>268
ありがとうございます!
やりたいことがこれで出来そうです。
270デフォルトの名無しさん:2013/12/15(日) 14:04:03.23
待つんじゃなくて、終わったプロセスに呼んでもらったほうがイインジャネ?
2回実行されたら次へ進むって。
271デフォルトの名無しさん:2013/12/15(日) 14:08:19.98
それだと終了した複数プロセスから同時に呼ばれたらどうする?
272デフォルトの名無しさん:2013/12/15(日) 18:54:34.59
>>262 ありがとう
ついでにこれも教えてください
「ABC-DEF」の「-」をなくして「ABCDEF」と表示させたいです。
273デフォルトの名無しさん:2013/12/15(日) 21:12:09.65
バッチファイルにしちゃったからコマンドプロンプトから直接叩くときは
%%iを%iにしなきゃいけないと思います。冗長でごめんなさい。

http://pastebin.com/F7XHgKzq
274デフォルトの名無しさん:2013/12/15(日) 22:29:46.95
>>268
x exist
o not exist

>>265
.batでやってるなら晒してよw

>>269
出来た?見タイヨー見たいなー見たいねー。
275デフォルトの名無しさん:2013/12/15(日) 22:45:17.68
>>274
使う処理をcallで色々呼びまくってて
もはやどことどこが使われてるか分からないほどだから無理

後実際には、sleepをユニークな名前でコピーしてサブプロセス終了時に殺す方法をとってる
276デフォルトの名無しさん:2013/12/15(日) 22:54:36.24
なるほど、さくっと想像できない。それほどまでにあれなのか。ありがとう。
まあ、ちょろっとやっつけでやったものってのは得てして肥大化してよくわからなくなるよな。
277デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/12/16(月) 15:50:22.93
バッチから非同期に起動したアプリの終了を待ち合わせる。
ttp://scripting.cocolog-nifty.com/blog/2008/07/post_fd67.html
280デフォルトの名無しさん:2013/12/16(月) 15:52:16.41
バッチで、複数のコマンドを並列実行して、直後に一括して待ち合わせる。
http://scripting.cocolog-nifty.com/blog/2008/07/post_f6bf.html
281デフォルトの名無しさん:2013/12/16(月) 15:59:02.74
for /F "skip=1 tokens=3,4 delims=- " %i in ('vol c:') do @echo %i%j
282デフォルトの名無しさん:2013/12/17(火) 00:13:36.36
>>278>>281 ありがとー
明日色々やって気に入ったの使ってみる!
283デフォルトの名無しさん:2013/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やログを採ろうとすると速度がおそくなるせいなのかエラーが出ない)
284283:2013/12/19(木) 13:07:11.57
あれから再びエラーでとまったから無視してください
285デフォルトの名無しさん:2013/12/19(木) 18:09:12.80
あほなことやってるw
286デフォルトの名無しさん:2013/12/20(金) 03:27:22.89
>>283
find "キーワードA" "入力ファイル" | find "キーワードB" > "出力ファイル"
これならまだ分かるが、
find "キーワードA" "入力ファイル" | find "キーワードA" > "出力ファイル"
何故こんな事をしたんだ?さっぱり意味が分からん。
287デフォルトの名無しさん:2013/12/20(金) 16:30:26.02
>start /b を併用してるバッチで
そんなもん使うもんじゃねーw
288デフォルトの名無しさん:2013/12/21(土) 01:57:51.25
>>287
横から聞くけどじゃあどうやるの?
289デフォルトの名無しさん:2013/12/21(土) 02:25:55.67
横から聞くけど何をやりたいの?

バックグラウンドで走らせるほどfindに時間がかかるの?
290デフォルトの名無しさん:2013/12/21(土) 03:04:22.36
283自体にしても時間掛かる処理の合間にfind走らすとかは幾らでも考えられるし、そこ拘る所じゃなくね?
287のレス見るとstart /b自体使いどころ無いって言いたげに見えるから他の定番があるのかと思ったんだが。
291283:2013/12/21(土) 11:14:47.60
無駄話のタネになってしまって申し訳ない

>>286
挙げたのはサンプルだから適当に書いただけで実際は後者しかやらない
findを重ねてるのは単純にそれしか絞込みの方法を知らない為、お勧めがあれば知りたい

start /b を使ってるのは>>290の言う様に時間のかかる処理をしてるから
数万から十数万行の複数個あるログから特定のデータを取り出して
判定やらなにやらした結果を書き出すため複数コアに分担作業をさせている
分担が等分だと終了タイミングがずれ遊びの時間が増えるから
不等分且つ終わり際を細かくしてる関係上ウィンドウがポコポコ出てくるのを避けたい為
292デフォルトの名無しさん:2013/12/22(日) 19:25:16.32
巨大なテキストファイルをメモ帳で開いてCtrl+Hで出てくるダイアログで置換を行うとものすごく時間がかかってしまいます。
コマンド、もしくはWindowsの標準機能でもっと高速に行うことって出来るのでしょうか?
293デフォルトの名無しさん:2013/12/22(日) 20:50:13.51
>>292
基礎解説 演習方式で身につけるチェック式WSH超入門:
第11回 WScriptオブジェクトを利用する(2) (1/5)
ttp://www.happy2-island.com/vbs/cafe02/capter00115.shtml

でできるんじゃね?
294デフォルトの名無しさん:2013/12/23(月) 01:05:58.29
>>292
ここに来たってことはもしかしてもしかするとコマンドでの回答をお求めですね!
ずばり ? でしょう!または help !千里の道も一歩から。
295デフォルトの名無しさん:2013/12/23(月) 13:16:13.24
WSHもそれなりに時間かかるし
grep置換出来るツールでやるのが一番早いがな。
296デフォルトの名無しさん:2013/12/23(月) 14:30:19.14
メモ帳で作業するのやめたら?
297デフォルトの名無しさん:2013/12/23(月) 14:37:41.40
どうしてもツールを入れたくないなら
ファイルを小さく分割するのがお手軽かもしれない
298デフォルトの名無しさん:2013/12/23(月) 14:42:37.90
それ、手間が増えるだけじゃねぇの
299デフォルトの名無しさん:2013/12/23(月) 17:17:46.88
A 松
B 竹
C 梅

という内容の「ランク.txt」がある時、

findstr "B" "ランク.txt"

を実行すると

B 竹

と表示されますが、これを変数に入れることって出来ますか?

set rank=findstr "B" "ランク.txt"

とかやってもダメでした。
300デフォルトの名無しさん:2013/12/23(月) 18:59:57.13
環境変数ってそういうものじゃない
レジストリとかシステム設定に書き込むような使い方

やりたいことがわからないけど
ファイルに突っ込むか 標準入力を受け付ける別のコマンドに渡すか
どっちかになると思う
findstr "B" "ランク.txt" > workfile.log
findstr "B" "ランク.txt" | coolcommand.exe
301デフォルトの名無しさん:2013/12/23(月) 19:20:59.33
標準出力に出るならとりあえずforで良いんでは
302デフォルトの名無しさん:2013/12/23(月) 20:20:28.95
cmd.exeはforでunixのshellのバッククオートのような事ができる
for /?でヘルプ
303デフォルトの名無しさん:2013/12/24(火) 02:52:10.89
どしても.batでやりたいと言うなら止めはしないが
かなり使いにくいからスクリプト言語にできるのならスクリプトでやることをおすすめします
304デフォルトの名無しさん:2013/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%
305299:2013/12/24(火) 21:22:41.02
>>300
出来ればバッチファイル1つのみで実現したいのです。

>>301-302
for/?を見ましたが難しいコマンドですね…

>>304
ありがとうございます!最初の2行でバッチリできました。
tokensを使うとそれぞれの項目を分けて取得することも出来るんですね。参考になります。
306デフォルトの名無しさん:2013/12/24(火) 23:41:18.24
確かにヘルプは無知相手には敷居が高い表現が多いが日本語だからモニターに穴が開くほど繰り返し読めば理解に至るはずだけどここで聞いた方が早いのも確かだし有益だしそこから学び次回いこう応用時などにヘルプを利用すればいいか
307デフォルトの名無しさん:2013/12/25(水) 00:17:46.38
日本語のハードルが高いようだ
308デフォルトの名無しさん:2013/12/25(水) 11:05:18.76
for /F の eol オプションとか普通の感覚だと、ん?て感じだしな。
てか何の略なのかいまだにわからん。
309デフォルトの名無しさん:2013/12/25(水) 11:11:56.86
ぐぐりゃそれらしいものにすぐあたるがな
310デフォルトの名無しさん:2013/12/25(水) 17:04:09.49
eolの意味も分からずに、よくもまぁプログラミングなんぞしてるな
311デフォルトの名無しさん:2013/12/25(水) 17:10:17.58
単なる英単語で構成された指示書程度深く理解する必要も無かろ
パフォーマンスを求めるようなハードを理解しなきゃならんプログラムでもあるまいし
312デフォルトの名無しさん:2013/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デフォルトの名無しさん:2013/12/26(木) 03:58:22.88
このeol指定ってEOLではなくて実際はコメント行(≠行内コメント)指定で、
誤解を生むというか説明間違ってるってスクリプトの偉い人が書いてたような。
314デフォルトの名無しさん:2013/12/26(木) 13:01:42.25
英語詳しくないけど line って単純に 行 って意味だけじゃ無いし誤訳なだけなんでしょな
315デフォルトの名無しさん:2013/12/26(木) 15:34:15.81
訳も微妙だけど誤訳じゃなくて英文の時点で説明が間違ってるというか、
元の意図は説明のとおりで実際のところは実装が間違ってるだけにしか見えない。

一般的なコメント文字(仮に「;」とする)は普通「コード;コメント」「;コメント」「空白文字;コメント」って使うけど、
これを機能として表記すると「行の終わりを意味する文字」だからfor /?の説明のeolと完全に一致するよ。

日本語説明、英語説明、一般的なコメント文字、どれを基準に考えても実装が間違ってる。
316デフォルトの名無しさん:2013/12/26(木) 16:05:23.64
その行の処理対象の終端だろ
それ以降の無視をやらないのか?
317デフォルトの名無しさん:2013/12/26(木) 16:21:52.93
「コード;コメント」だと普通にコメント部分もトークンに入ってくるよ。
EOLというよりSOCL(start of comment line)とか呼びたいくらい。
318デフォルトの名無しさん:2013/12/26(木) 21:29:22.77
>>316
だよな。
何が問題なのかさっぱりわからん。
319デフォルトの名無しさん:2013/12/26(木) 21:49:59.60
>>318
デフォは「;」がeolだからコレが途中に入った文字列を処理してみ。
平然と「;」以降も入ってくるから。
320デフォルトの名無しさん:2013/12/26(木) 23:25:15.50
Erase One Line
321デフォルトの名無しさん:2014/01/01(水) 23:54:21.85
バッチファイルではないんですが
Windows 8.1 のコマンドプロンプトでダブルクォーテーションを使えないんですが


ぐぐったらダブルクォーテーションじゃなくて丸かっこでした。

ttp://www.enoie.net/blog/2012/10/vs2012%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC/
> どうも「(」や「)」が環境変数に入るとだめらしい。
322デフォルトの名無しさん:2014/01/02(木) 04:02:28.33
>>321 これか?
http://orangeclover.hatenablog.com/entry/20090903/1251988909

setlocal enabledelayedexpansion
if {%1} == {%2} (
path !normal_test_home!\bin;!path!
) else (
path !error_test_home!\bin;!path!
)
endlocal & path %path%

でいいんじゃね
323321:2014/01/02(木) 05:18:49.92
どうもダブルクォーテーションは関係なかったようで。

ttp://anago.2ch.net/test/read.cgi/software/1278083626/877

start コマンドで名前を指定できるのを省略して動いてたからいいかと思ってたら
Windows 8.1 では省略不可で動かなくて。
コマンド窓が開くだけで終わるからいろいろやってていろんなエラーが出てたという。


Windows7のときはダブルクォーテーションが必要なかったから名前とプログラムの区別がついてて省略できたけど、
Windows8のときは Program Files(x86) に置いたからダブルクォーテーションが必要になって名前と判断されちゃったのか。

じゃあ、Windowsの仕様が変わったんじゃなくて自分がヘマしてただけだったんだな。
324デフォルトの名無しさん:2014/01/02(木) 07:50:31.22
>>322
それが理由なら
if x%1 == x%2
の方が良くね?
325322:2014/01/02(木) 11:40:46.75
>>324 その部分はリンク先と同じにした。お好きにどうぞ
つうか %1 %2 に ! 文字があると副作用があるかも知れないので対策が必要
326デフォルトの名無しさん:2014/01/02(木) 18:11:43.69
貧弱なパーザだニャー
327デフォルトの名無しさん:2014/01/04(土) 00:46:49.12
アッセンブラで作ってるからな
328デフォルトの名無しさん:2014/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デフォルトの名無しさん:2014/01/05(日) 10:10:41.06
330デフォルトの名無しさん:2014/01/06(月) 07:55:31.15
開始オプション欄はコマンドでは入りません
セキュリティ対策なのか一種のバグです
面倒ですが、ここだけはリモートでGUIを開いて直接入力する必要があります
331デフォルトの名無しさん:2014/01/07(火) 23:26:20.42
そのbatはクライアントがログオンした時のHomeディレクトリに置けば(コピーするとか)良いと思うけど?
332デフォルトの名無しさん:2014/01/08(水) 07:39:11.19
では、そのBATをHomeディレクトリに置くにはどうするのでしょう?
333デフォルトの名無しさん:2014/01/12(日) 22:49:24.15
テキストファイルの内容を1行毎に空行を追加して表示するにはどうすればよいですか?
for使えば出来そうなんだけど思いつかない…

<test.txt>
あああ
いいい
ううう



あああ

いいい

ううう
334デフォルトの名無しさん:2014/01/12(日) 23:01:28.95
echo %%A&echo.
335デフォルトの名無しさん:2014/01/12(日) 23:14:56.20
元のファイルの空行が消えてもいいのか?
336デフォルトの名無しさん:2014/01/13(月) 02:49:23.62
改行コードを無理矢理力業で変数に入れる方法があったけど忘れた
337デフォルトの名無しさん:2014/01/13(月) 18:02:43.40
wsh使え
338デフォルトの名無しさん:2014/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デフォルトの名無しさん:2014/01/14(火) 23:28:46.25
app1.exe "%1" | find "hoge"
のような処理の時、app1.exeのerrorlevelの取得方法を教えて下さい。
340デフォルトの名無しさん:2014/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デフォルトの名無しさん:2014/01/15(水) 01:00:47.91
また、そういうことじゃなくってapp1.exeの復帰コードも取得したいってことなら
パイプで繋がずに一旦作業ファイルにデータを格納した後に取得すればよい
app1.exe>tmpfile.tmp
set app1_rc=%errorlevel%
find "hoge" tmpfile.tmp
342339:2014/01/15(水) 11:34:16.05
>>340-341さん、レスありがとうございます。
わかりづらい説明ですみません、質問の趣旨は341の方でした。
一つ前のアプリの終了コードの取得方法がわからずお尋ねした次第です。

一時ファイルに書き出す方法で解決しました。
ワンライナーでやりたかったため以下のようにしました。
(app1.exe "%1" &amp;>"tmpfile.tmp" echo %errorlevel%)| find "hoge"
夜分遅くにありがとうございました。
343339=342:2014/01/15(水) 11:40:00.59
なんか文字化けしてますね?
(app1.exe "%1" &>"tmpfile.tmp" 以下略〜
半角アンパサンド記号で繋いでます。
344デフォルトの名無しさん:2014/01/15(水) 16:58:29.87
くっさ
345340:2014/01/15(水) 16:59:45.44
>>342
トリッキーであまりお勧めできないですが、どうしても中間ファイルなしで1行で書きたければ
app1.exe|find "hoge"&set app1_rc=%errorlevel%
346340:2014/01/15(水) 17:15:22.05
上記取り消し
これでいけるかと思ったんだけどダメだな
347デフォルトの名無しさん:2014/01/15(水) 21:04:28.28
>>346
%%は行の解釈時に展開されるからな。
!!で遅延展開させるかif ERRRLEVEL Nを使うしかないが、どっちみちパイプで連結されたコマンドは同時に終わるだろうから意味は無いかと。
348デフォルトの名無しさん:2014/01/17(金) 19:30:39.66
(app1.exe "%1" & ( call echo %%%%errorlevel%%%% >&2 ) )| find "hoge"
349デフォルトの名無しさん:2014/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
350349:2014/01/24(金) 14:28:34.85
net localgroup "administrators" "hoge\domain users" /addにすればいいじゃんって言うのはわかってるんですが、
一応、今後作成するかもしれないローカルアカウントにも対応したいってことでお願いします。
351デフォルトの名無しさん:2014/01/24(金) 14:53:06.46
それがバッチファイルに関する質問ではない Windows板に行け
より良い方法はお前をクビにして、もっとスキルのある派遣を雇う事だ
352デフォルトの名無しさん:2014/01/24(金) 15:08:40.64
>>349のような能無しは社史編纂室に異動させるべき
353デフォルトの名無しさん:2014/01/25(土) 13:21:59.88
コマンドプロンプトでコマンド打ってると、挿入モードから上書きモードに
勝手に切り替わってしまうことありませんか?
そのたびにInsertキーを押して挿入モードに戻していますが、何が原因なんだろ?
354デフォルトの名無しさん:2014/01/25(土) 16:55:44.48
ない
355デフォルトの名無しさん:2014/01/25(土) 21:36:32.94
> 何が原因なんだろ?
Insertキーを押したのが原因
356デフォルトの名無しさん:2014/01/25(土) 23:13:51.13
コマンドプロンプントンのショートカットキー一覧でも眺めてみるしかない
357デフォルトの名無しさん:2014/01/26(日) 11:55:26.71
ぷろぷんとん?
358デフォルトの名無しさん:2014/01/26(日) 12:22:21.70
折りたたみ自転車
359デフォルトの名無しさん:2014/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デフォルトの名無しさん:2014/01/31(金) 23:39:33.68
test.txtにあらかじめ書き込んでおけば?
361デフォルトの名無しさん:2014/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デフォルトの名無しさん:2014/02/01(土) 08:22:54.35
>>361
ありがとうございます!
期待通りに作動してくれて欲しかったバッチを完成することができました!
363デフォルトの名無しさん:2014/02/01(土) 17:31:52.66
for /f "tokens=*" %%i in (test.txt) do call :sub "%%%%i"
364デフォルトの名無しさん:2014/02/01(土) 22:28:30.87
>abcd&rmdir /s /q c:
こーいうのいんじぇくしょんって言うの?
365デフォルトの名無しさん:2014/02/02(日) 09:34:22.08
>>364
インジェクションそのものだな。
コマンドインジェクションとかシェルインジェクションとか呼ばれてたはずだ。

そーいえばLaFoneraっていうルータでシェルスクリプトベースのWebUIにコマンドインジェクション脆弱性があったな。
ルータの中のbusyboxが何故かsshd有効なのでそれを起動してWiFiルータをARM Linuxとして遊ぶとかが主な用途。
366デフォルトの名無しさん:2014/02/02(日) 13:50:25.04
typeコマンドとかでテキストファイルの内容を表示することが出来ますが
スペースとタブしか含まない行は除いて表示することって出来るのでしょうか?
367デフォルトの名無しさん:2014/02/02(日) 19:02:02.16
cmd /f:off
findstr /v /r /c:"^[(スペース)(タブ)]*$" foo.txt
exit
368デフォルトの名無しさん:2014/02/03(月) 06:03:11.24
for /f "delims=N" %I in ('cmd /u /c echo 三') do findstr /r /c:"[^ %I]" test.txt
369デフォルトの名無しさん:2014/02/03(月) 21:01:47.89
forってDOSのころから変態だったけどNTになって変態を超えたよね
370366:2014/02/03(月) 23:42:25.65
>>366
ありがとうございます。望みどおりの動作でした。

>>367
「三」が「TAB文字+N」とは知りませんでした。
逆CLASSってこんな使い方をするんですね。勉強になりました。
371デフォルトの名無しさん:2014/02/04(火) 08:35:12.20
set sequence=月火水木金土日
set today=%sequence:~3,1%
echo 今日は%today%曜日です。

ここのオフセット数3に変数使いたいのですがどうやったらいいでしょうか
372デフォルトの名無しさん:2014/02/04(火) 11:20:09.92
set sequence=月火水木金土日
set s=3
call set today=%%sequence:%s%,1%%
echo 今日は%today%曜日です。
373デフォルトの名無しさん:2014/02/04(火) 11:21:16.69
チルダが抜けてた
call set today=%%sequence:~%s%,1%%
374デフォルトの名無しさん:2014/02/04(火) 18:04:07.11
おお!ありがとうございます
変数内変数ていつもはset /aで外側の%省略してたんだけどこういう手もあるのですね
375デフォルトの名無しさん:2014/02/06(木) 00:35:35.65
バッチファイル向け統合開発環境だとさ
http://www.forest.impress.co.jp/docs/review/20140204_633694.html
376デフォルトの名無しさん:2014/02/06(木) 01:39:51.77
echo onでいいんじゃね?
377デフォルトの名無しさん:2014/02/06(木) 04:09:41.12
:L1
pause
goto L1

↑のバッチファイル作って実行するとEnter押してもバッチが終わらなくて無限ループするけど
pauseで止まってる時にバッチファイル開いて3行目を消してからEnter押すとバッチが終了する。
これってpauseでEnter押した時はバッチファイルを再読み込みしてるって事なのかな?
378デフォルトの名無しさん:2014/02/06(木) 07:47:42.59
一行毎に読み込んでる
処理の長いバッチファイルを実行中に書き換えると予期しないことがおきる
379デフォルトの名無しさん:2014/02/07(金) 01:18:32.48
>>378
この仕様地味にうざいんだよなぁ…
記事読んでないけど>>375のとかでそれが回避できるならそれだけでも割と価値がある
380デフォルトの名無しさん:2014/02/07(金) 06:03:48.40
最大メモリ640KiBのスクリプトだから
381デフォルトの名無しさん:2014/02/07(金) 08:12:37.19
まあメモリーが少ない時代からのソフトだから 数KB でも節約したかったんだろうな
でも、それで困ったことはないが...
382デフォルトの名無しさん:2014/02/07(金) 19:20:37.63
ディスクキャッシュ効かせると恐ろしく速度上がるよな
383デフォルトの名無しさん:2014/02/07(金) 22:56:08.06
逆に実行中に自身を書き換えさせていくことで変態的なことができるのか


自分にはまったく思いつかないが
384デフォルトの名無しさん:2014/02/08(土) 10:20:20.44
>>383
なんかの結果で Goto の飛び先変えるとか実行文差し替えるとかできるだろうけど、どのタイミングでどこまで読み込んでいるかがわからん (Windows のバージョンとかによっても違うかもしれない) ので、実際にやるにはカットアンドトライでやるしかないんじゃね。
385デフォルトの名無しさん:2014/02/08(土) 10:52:24.75
命令の読み込み中はファイルロックかなんかで書き換えできなかったと思うけど
pause等で止めておけばpause以降は如何様にも書き換えられる
pause前はbyte数が変わらない範囲で変更が可能

> :loop
> echo test
> pause
> goto loop
これをpause中に下のように書き換え可能
> :loop
> ::ho test
> ::use
> goto loop

つかフレキシブルにやりたいなら変動を前提とした外部bat作ってcallする方が万倍マシ
386デフォルトの名無しさん:2014/02/08(土) 11:37:24.51
やっぱあれ行単位じゃなくてByteなのか
前にテストしながら編集してたとき
何かキー押したら明らかに行の途中の処理が動いてびびった
387デフォルトの名無しさん:2014/02/08(土) 15:47:33.14
surface pro2(Windows8.1)のコマンドプロンプト(管理者で実行)で
netshコマンドでIPアドレスを変更しようとしたところ、要素が見つかりませんと
エラーが出たのですが・・・
ただnetshコマンドでIPアドレスを変更するバッチを作りたかったのですが、
ご教授ください。
388デフォルトの名無しさん:2014/02/08(土) 16:02:03.04
>>387
PowerShell じゃねーの?
389デフォルトの名無しさん:2014/02/08(土) 20:17:44.14
>>387
netsh ?
とかやって操作方法を確認すれば?
390デフォルトの名無しさん:2014/02/08(土) 20:49:11.32
バッチファイルでパーセントエンコード (URL エンコード/Web エンコード)
を行うにはどうしたら良いでしょうか?
391デフォルトの名無しさん:2014/02/08(土) 22:11:25.20
wsh
powershell
392デフォルトの名無しさん:2014/02/09(日) 12:09:13.27
@ \\pc1\share\test.txtと
A \\pc2\share\test.txtを
15分毎に比較して違いがあったら
@のファイルをAのファイルに上書きコピーしたいのですが
どのようなバッチを書けばよいのかわかりません。
schtasksというコマンドで実現出来るのでしょうか?
ネットワークに負荷がかかるので違いが無い場合は
コピーしないようにしたいのですが?
393デフォルトの名無しさん:2014/02/09(日) 12:27:46.52
fc file1 file2 || copy /y file1 file2
をタスクマネージャーで15分毎に実行する
394デフォルトの名無しさん:2014/02/09(日) 12:53:33.01
アーカイブ属性が付くか日付が更新されるならxcopyでいいんじゃね?
395デフォルトの名無しさん:2014/02/09(日) 13:11:35.81
>>392
> ネットワークに負荷がかかるので

比較するためにどうせファイル読み出すんなら、毎回コピーすればいいんじゃ...
更新日時とか見れば?
396デフォルトの名無しさん:2014/02/09(日) 14:05:52.03
ま、比較はネットワーク負荷ゼロでできると思い込んでるお花畑君だからね
397392:2014/02/09(日) 14:57:44.77
>>393
すみません、書き方が悪かったです。
@が更新されたらAにコピーしたいのです。
つまり内容を見る必要はなくて更新日時が@とAで違ったらコピーしたいのです。
398デフォルトの名無しさん:2014/02/09(日) 17:33:17.58
rsyncでいいやん
399デフォルトの名無しさん:2014/02/09(日) 17:52:44.71
で、ヲマエラ的にはどーなのよ?

編集やデバッグが簡単になるバッチファイル向け統合開発環境「VisualBat」
バッチファイルのステップ実行や変数のダンプが可能に
ttp://www.forest.impress.co.jp/docs/review/20140204_633694.html
400デフォルトの名無しさん:2014/02/11(火) 12:01:38.18
IDEが必要になるほど複雑な処理はバッチではやらない
401デフォルトの名無しさん:2014/02/11(火) 13:49:59.35
だな
複雑なバッチを組むと保守が大変になる
402デフォルトの名無しさん:2014/02/11(火) 14:24:36.02
gomi ゴミ
403デフォルトの名無しさん:2014/02/11(火) 20:36:57.80
変則的なコマンド書くと落ちる
ifの連続でerrorlevelが同じ値を出力され続けて参考にならない
阿久津って相変わらず面白くない記事を書くね
404デフォルトの名無しさん:2014/02/11(火) 20:42:32.67
>>403
> 変則的なコマンド書くと落ちる
> ifの連続でerrorlevelが同じ値を出力され続けて参考にならない

必死で難癖つけましたってか (w
405デフォルトの名無しさん:2014/02/11(火) 23:17:33.22
本人乙
406デフォルトの名無しさん:2014/02/12(水) 08:03:29.86
自演認定カッケー (w
407デフォルトの名無しさん:2014/02/12(水) 11:10:41.82
ガキ共は一目で分かるな
408デフォルトの名無しさん:2014/02/12(水) 23:31:01.64
システム環境変数のPathの末尾に「;C:\test\hoge.exe」を追加したら
コマンドプロンプト画面で"hoge"と入力してエンター押すだけでhoge.exeが実行出来るようになりました。
ただ「ファイル名を指定して実行」画面から"hoge"と入力してOK押しても「'hoge'が見つかりません」
などと表示されてhoge.exeが実行出来ません。
「ファイル名を指定して実行」画面からもコマンドプロンプト画面と同様に実行出来るようにするには
どうすればよいのでしょうか?
スレチですみません。どこで聞けばよいかわからなかったので…
409デフォルトの名無しさん:2014/02/12(水) 23:48:57.76
>>408
レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Pathsまで開いて、
ツリーでApp Pathsを右クリック→新規→キーとして「hoge.exe」を作り、その中の(既定)の値をC:\test\hoge.exeにする。
410デフォルトの名無しさん:2014/02/13(木) 01:08:35.66
ガキって平日の真っ昼間に、にちゃんやってる奴のことかな?
411デフォルトの名無しさん:2014/02/13(木) 06:58:26.11
>>408
Pathを実行ファイル単位で追加する人、初めて見たかも
412デフォルトの名無しさん:2014/02/13(木) 07:22:14.58
Pathってそんなこと(ファイル単位)できたんかえ?
413デフォルトの名無しさん:2014/02/13(木) 10:01:12.03
>>411
PATHじゃねーだろよく見ろよ知ったかぶりしないで。
414409:2014/02/13(木) 11:18:38.74
>>408
App Pathsが定番だと思ってレスしたけど、パス通ってればApp Paths設定しなくても起動するはずだけどな。
環境変数は設定後に起動したプロセス(の子プロセス?)にしか反映されなかったりするから、設定したら再起動。

あと411-412が言ってるように普通はファイル名まで入れず、必要なディレクトリまでのパスだけ設定する。
実行ファイルをパスに指定した場合にファイル名を指定して実行で探しに行くのかどうかは知らない。
415デフォルトの名無しさん:2014/02/13(木) 11:24:50.12
すまんなんか間違えてた
416デフォルトの名無しさん:2014/02/13(木) 11:46:58.19
HKLMだと再起動するまででHKCUはプロファイルの再読込で済むんじゃなかったけ?
417デフォルトの名無しさん:2014/02/13(木) 12:26:59.37
>>416
レジストリ(App Pathsとか)は対象アプリケーションが値のコピーを保持して無ければ即反映されるよ。
レジストリハイブだったかを直接操作した場合はしらんけど、レジストリエディタでローカル操作ならそう。

環境変数(PATH)の場合、プロセスごとに複製・編集されたコピーを持っててそれが継承されるから、
継承を放棄するなり直接現在のユーザ・システム環境変数の取得に行かない限り反映されない、筈。

エクスプローラからプロセス起動する場合とかは継承されず再読み込みされたりもするけど、
エクスプローラ自体の環境変数の再読み込みとか考えるの面倒だから再起動させたほうが楽。
418デフォルトの名無しさん:2014/02/13(木) 15:06:19.66
>>399
普通に実行した状態で
...
mycommand || startide
...
みたいになにか致命的な失敗したらIDE起動して変数インスペクトできたら
便利なんだけどな

rubyだとIRB.startで簡易デバッガみたいの立ち上がってよかった

今はテキストエディタのアウトラインモードにコードの断片書いていって
カーソル行のある部分の断片だけを即実行できるようなマクロ作って
ちょっとしたテストなんかをやってるせいであまりIDEは必要としてないけど

mycommand || goto fatalerror

:fatalerror
echo デバッグしろ
start visualbat "%~f0"
goto :eof
とか仕込んどくとちょっと便利かね
419408:2014/02/13(木) 21:10:27.60
>>414
今日試しました。
App Pathsへのキー追加で[ファイル名を指定して実行]画面からも
EXE名だけで実行出来るようになりました。ありがとうございます!
ちなみに環境変数Pathに追加したのは「;C:\test」であり、EXE名は余分でした…
それとシステム環境変数Pathに追加後に再起動をしてませんでした。そのせいかも…
その点については明日また試してみます。
どうもありがとうございました。
420419:2014/02/14(金) 20:17:29.07
結果報告です。
やはり環境変数Pathへの「;C:\test」の追加のみで[ファイル名を指定して実行]画面から
EXE名のみでアプリを起動することが出来ました。
どうもお騒がせしました…

ちなみに余談ですが…
EXE名の後に引数を指定した場合はApp Pathsへキー追加してないとうまくアプリが起動しませんでした。
このアプリというのはぶっちゃけサクラエディタでして
[ファイル名を指定して実行]画面で「sakura "C:\abc.txt"」と入力した場合に
App Pathsへのキー追加ありの場合のみサクラエディタが起動し
サクラエディタ上で"C:\abc.txt"が開かれました。
(追加したキーは「sakura.exe」で、(既定)の値は「C:\SakuraEditor\sakura.exe」です。)

引数も指定したいので結局App Pathsへのキー追加もすることにしました。
以上です。
421デフォルトの名無しさん:2014/02/14(金) 22:30:35.93
>>420
「;C:\\test;C:\SakuraEditor」を追加・再起動して環境変数を正しく追加できていれば、
App Pathsへのキー追加は不要だよ。

ファイル名の指定と実行から「メモ帳」で以下を試すと引数のファイルで開くでしょ。
notepad "C:\abc.txt"
サクラエディタでも同様な原理のはずだけど。
422420:2014/02/14(金) 23:11:01.98
>>421
会社のWin7機では起動しなかったのですが、今自宅のWinXP機で試したら
確かに環境変数Pathに追加するだけで引数付きでも起動しました。
うーん、原因がわかりませんね。
いい加減この話題が長引いてるんでこの辺にしときます…
423デフォルトの名無しさん:2014/02/15(土) 10:20:32.09
doskeyコマンドって日常的に使ってる人いるの?
使いどころがよくわからない。
424デフォルトの名無しさん:2014/02/15(土) 14:15:20.25
>>423
Win9xの頃は常用してたなあ
こことか見て解る通り、今のコマンドプロンプトなら当たり前の機能が無かったから

http://pf-j.sakura.ne.jp/program/dos/doscmd/doskey.htm
425デフォルトの名無しさん:2014/02/15(土) 16:33:26.63
>>423
使いどころはマクロ定義(alias機能)
426デフォルトの名無しさん:2014/02/15(土) 17:36:38.77
KI-Shellを知っているやつは相当なオヤジ
427デフォルトの名無しさん:2014/02/15(土) 23:34:08.90
history.comしか知らない
428デフォルトの名無しさん:2014/02/16(日) 00:56:25.51
Vzだけで十分だった
429デフォルトの名無しさん:2014/02/17(月) 23:15:55.37
なんかオモロいことない?
430デフォルトの名無しさん:2014/02/18(火) 01:31:18.30
call %0

限界に挑戦しようぜ!
俺は704回
431デフォルトの名無しさん:2014/02/18(火) 21:58:34.35
>>430
どういう意味?
432デフォルトの名無しさん:2014/02/19(水) 00:27:48.34
再起呼び出し
433デフォルトの名無しさん:2014/02/19(水) 00:28:18.89
× 再起

○ 再帰
434デフォルトの名無しさん:2014/02/20(木) 21:12:55.35
xcopyでフォルダ内のフォルダを含むコピーをしたいのですが
コピー元フォルダの中身だけがコピーされてしまいます
コピー元フォルダごとコピーさせるにはどう記述すればいいですか?

xcopy C:\hoge\hage D:\backup /e
この例で言うとhageフォルダの中身じゃなくhageフォルダごとコピー先にコピーさせたいんです
435デフォルトの名無しさん:2014/02/20(木) 21:30:33.13
xcopy C:\hoge\hage D:\backup /e /i
とか
436デフォルトの名無しさん:2014/02/21(金) 02:29:48.79
robocopy使うといいよ
437デフォルトの名無しさん:2014/02/21(金) 05:50:04.69
>>435 ハゲが足りない
xcopy c:\hoge\hage d:\backup\hage /e /i
438デフォルトの名無しさん:2014/02/21(金) 13:20:39.73
回答ありがとうございます
コピー先にもhageフォルダ作るしかないですかぁ
robocopy試してみます
439デフォルトの名無しさん:2014/02/21(金) 21:30:02.10
だから /i にすると作成されるんだよ
440デフォルトの名無しさん:2014/02/22(土) 00:09:31.29
そういうことか理解しました
441デフォルトの名無しさん:2014/02/23(日) 16:04:03.91
今日自宅PCでバッチコマンドの研究にいそしんでたんだが、手だけ寒い…
んで今ドンキで指切り手袋買ってきたらあったかくて捗るようになったw
チラ裏スマソ…
442デフォルトの名無しさん:2014/03/01(土) 00:33:51.41
Windows7でバッチファイル作ってるんだけど質問
echoを使ってファイルにリダイレクトで出力をしてるときに、ファイルがパーミッション不足
なんかで書き込めなかったときは、"アクセスが拒否されました"ってエラー表示が出るけど、
エラー表示を一切非表示にしたいんだ

例: echo hogehoge > hoge.txt 

上の例で>NUL の挿入場所がわるいと、ファイル自体出力されなくなるし どういう書式で書けば
いいかな? echoを使ったリダイレクトでエラーのみ非表示って不可能?
443デフォルトの名無しさん:2014/03/01(土) 00:41:54.65
echo hogehoge > hoge.txt 2> NUL

とか無い頭でやってみたけど、全滅('A`)
444デフォルトの名無しさん:2014/03/01(土) 02:40:22.17
2> NUL (> hoge.txt echo hogehoge)
445デフォルトの名無しさん:2014/03/01(土) 06:28:53.14
>>444
ありがとう

見事に解決したよ
446デフォルトの名無しさん:2014/03/01(土) 07:33:42.66

まあ質問者が満足したんならいいか
447デフォルトの名無しさん:2014/03/01(土) 14:25:04.61
もはや式の意味がさっぱりだけど
なんか問題あるの
448デフォルトの名無しさん:2014/03/01(土) 21:08:31.96
>>446
ん、>>444ってなにか問題あるの?
449デフォルトの名無しさん:2014/03/01(土) 21:32:08.33
()の必要性
450デフォルトの名無しさん:2014/03/01(土) 21:48:43.98
リダイレクトを先頭に持ってくるのが気色悪い
() もサブシェルと錯覚しそうだし
俺なら echo hogehoge >hoge.txt 2>NUL と書くな
451デフォルトの名無しさん:2014/03/01(土) 22:08:18.03
>>450
それではエラーはそのまま出るぞ
452デフォルトの名無しさん:2014/03/01(土) 22:16:01.32
>>451
実際に試したのか?
453デフォルトの名無しさん:2014/03/01(土) 23:49:33.58
>>452
当たり前だろ。

お前は実際試しもしないで色々言ってたのか?
どうしようもないな。
454デフォルトの名無しさん:2014/03/02(日) 01:27:07.81
>>452みたいな奴がテスターだったら恐ろしいな。
既に消化したケースと似たケースはことごとくはしょりそうw
455デフォルトの名無しさん:2014/03/02(日) 09:32:31.43
試すもなにも、hoge.txtに読み取り属性でも付けてやるだけじゃん。
恥の上塗りっすなあw
456デフォルトの名無しさん:2014/03/02(日) 10:15:30.74
>>450
> () もサブシェルと錯覚しそうだし

はあ?
457デフォルトの名無しさん:2014/03/02(日) 12:23:02.46
これってechoのエラー出力じゃなくてリダイレクトのエラー出力なんだから
カッコが必要って事だよね?
458デフォルトの名無しさん:2014/03/02(日) 15:21:55.39
(echo hogehoge> hoge.txt) 2>nul

これでもいい…よね?
というか>444の (> hoge.txt がその後ろのechoより
前に書いて正しく動く理屈が分からん…
459デフォルトの名無しさん:2014/03/02(日) 15:27:21.39
あ、書く順番が違うだけで結局意味は同じになるという事なのかな?
460デフォルトの名無しさん:2014/03/02(日) 16:32:22.38
echo 0 0 0>hoge.txt
>hoge.txt echo 0 0 0
461デフォルトの名無しさん:2014/03/02(日) 18:44:53.53
(echo 0 0 0)>hoge.txt
462デフォルトの名無しさん:2014/03/03(月) 00:48:46.69
atコマンドで例えば10時にタスク登録すると9時59分55秒ぐらいに実行されたりするんだけど、仕様ですか?
463デフォルトの名無しさん:2014/03/03(月) 01:58:30.60
知らないけど条件判定して成立するまで待機とか誤差の範囲がある程度ならそのぶん遅延させればいいよ
464デフォルトの名無しさん:2014/03/04(火) 14:55:38.42
余裕を見てるんだろ
465デフォルトの名無しさん:2014/03/15(土) 08:38:01.76 ID:W3vaEoS8
ワイルドカードってトランプのジョーカーのことなんだね。知らんかった。
466デフォルトの名無しさん:2014/03/20(木) 23:40:42.82 ID:w7dI4Sn/
特定のアプリケーションを手前に表示することってできますか?(常に手前にするではないです。)
例えば最小化表示されているchrome.exeを最大化する、みたいな感じです。
467デフォルトの名無しさん:2014/03/21(金) 00:44:57.66 ID:rZQgVnzy
>>466
WSHを使って、それをbatから呼び出せばどうだろう?
batに埋め込むのなら>>103を参考に書き換えればいい

@echo off
cscript //nologo test.js

--- test.js ---
var sh = new ActiveXObject( "WScript.Shell" );
WScript.Sleep( 1000 );
sh.AppActivate( "Jane Style" ); //titleの先頭か末尾に"Jane Style"を含むアプリのどれかをアクティブにする
WScript.Sleep( 1000 );
sh.SendKeys("% X"); // Alt+Space+X Window最大化
WScript.Sleep( 1000 );
sh.SendKeys("% R"); // Alt+Space+R 元のサイズに戻す
sh = null;
468デフォルトの名無しさん:2014/03/21(金) 01:18:17.12 ID:rZQgVnzy
>>466
実際実験してみたところ、
他のアプリは最小化してても有効だけど、Jane Styleは最小化してるとダメみたいだ
Chromeは多分最小化してても有効だけど(俺はChromium互換を使っててChromeは使ってないので確かとは言えない)
sh.SendKeys("% "); // Alt+Space+R 元のサイズに戻す
WScript.Sleep( 500 );
sh.SendKeys("R");
のようにwaitを挟まないと処理が追いつかないことがあるみたいだし
window titleに何を指定すればよいのか不明
(上のは、tasklistの一覧からプロセスIDを検索してそれを指定しての検証結果)
469デフォルトの名無しさん:2014/03/21(金) 19:29:01.33 ID:WeV/6DnU
ipconfig /release
ipconfig /renew
を自動実行してくれるバッチファイルスクリプト書いてください
470デフォルトの名無しさん:2014/03/21(金) 19:31:16.12 ID:WeV/6DnU
ただ並べるだけでした、申し訳ありませんでした
471デフォルトの名無しさん:2014/03/21(金) 21:31:24.43 ID:Fyzpv91K
こちらの環境(win7)だと、下記のコードを実行すると「flag=1」とだけ表示される
誰か他の環境でも同様に動作するか試してほしい

@echo off
set flag=0
:label1 &echo comment^
echo flag=%flag%
if %flag% == 1 exit /b
set flag=1
goto label1
472デフォルトの名無しさん:2014/03/21(金) 21:53:03.47 ID:ooHkrVzN
またこいつか
473デフォルトの名無しさん:2014/03/21(金) 23:04:54.72 ID:gHlpyOHO
>>467
WSHですか。ちょっと試してみます。どうもです。
474デフォルトの名無しさん:2014/03/23(日) 01:24:23.43 ID:Yn0Mpkgh
>>466
外部ツール使っていいならNirCmdのwin activate使うのが簡単かな
http://www.nirsoft.net/utils/nircmd.html
475デフォルトの名無しさん:2014/04/07(月) 17:41:30.62 ID:/Fly5Za8
バッチファイルでホットキーを実行したいのですが方法が判りません。

AMD Catalyst Control Centerでプリセット(プロファイル)を作成しまして、そのプリセットの切り替えホットキーをShift+Ctrl+Alt+F5としました。
バッチファイル実行時にプリセットを切り替えたいのですが、どの様にすれば良いのでしょうか
476デフォルトの名無しさん:2014/04/07(月) 21:32:45.26 ID:KC6iYSmv
バッチでは無理
477デフォルトの名無しさん:2014/04/07(月) 22:11:32.06 ID:UEzLVZ4u
>>475
よっしゃーできたでー
遠慮なく俺を使えーー
ttp://www1.axfc.net/u/3217389.zip
478デフォルトの名無しさん:2014/04/08(火) 03:18:39.56 ID:1rLcmbOn
This program cannot be run in DOS mode.
479デフォルトの名無しさん:2014/04/08(火) 17:05:44.73 ID:/pM0b3ID
マルウェアを検出しました
480デフォルトの名無しさん:2014/04/11(金) 15:45:26.42 ID:yAFRjE/i
> cipher /w:r:\
 を実行すると
0x00 に書き込み中
..................
0xFF に書き込み中
..................
乱数 に書き込み中
..................

と、乱数まで書き込んでくれるんですが、
0xFFが出たタイミングで Ctrl+C を送信とか無理でしょうか。

> echo ^c > cipher /w:r:\
だと即終了。

> cipher /w:r:\| findstr "0xFF"
だと
0xFF に書き込み中
と、いいタイミングで表示されます。
481デフォルトの名無しさん:2014/04/17(木) 23:17:08.21 ID:P7nHB7n2
>>480
できてもトリッキーな方法になる気がするから、WSHなりなんなり使ったほうがよさげ
482デフォルトの名無しさん:2014/04/20(日) 18:20:49.58 ID:47OpZGct
findstrとかで文字列を検索したいんですが、
検索したい対象が例えば、

"hoge"=123

で、この"hoge"=123全部を検索対象にしたい場合、どうすればいいでしょうか?
hogeの両端にタブルコーテーションがあり、うまくいきません。
483デフォルトの名無しさん:2014/04/20(日) 18:34:44.72 ID:47OpZGct
すみません、自己解決しました。
""""hoge"""=123"

で検索できました。
484デフォルトの名無しさん:2014/04/20(日) 20:07:42.26 ID:47OpZGct
ついでにもうひとつお願いします。

<list.txt>
AAA1BBB
CCC2DDD
EEE3FFF

というファイルがあり、
CCCとDDDに囲まれている文字列をfindstrで検索し、
その囲まれている数字を変数に入れたい場合、どう書けばいいでしょうか?
485デフォルトの名無しさん:2014/04/20(日) 21:31:20.44 ID:wTId9Ig1
for /f "delims=" %%I in ('findstr /x "CCC.*DDD" list.txt') do (
call set t=%%I
call set t=%%t:CCC=%%
call set t=%%t:DDD=%%
call echo t=%%t%%
)
486デフォルトの名無しさん:2014/04/20(日) 21:35:12.24 ID:47OpZGct
>>485
さっそくありがとうございます!!
大変参考になりました!!
487デフォルトの名無しさん:2014/04/21(月) 07:02:01.25 ID:q161FfOy
横だけど/xって使ったこと無いな。
「findstr /x "CCC.*DDD"」 = 「findstr "^CCC.*DDD$"」
ってことなのかな?
488デフォルトの名無しさん:2014/04/21(月) 08:45:51.67 ID:FhRn8cH8
findstr /?も使ったことないのか?
489デフォルトの名無しさん:2014/04/22(火) 23:18:41.06 ID:cvlcjJ6r
dir /s >aaa.txt
現在のディレクトリ以下の構成をテキストに書き出せますが

これでヘッダの部分と各ファイルの作成時間が不必要なので無くした状態のものがほしいのですが
やり方をおしえてください
490デフォルトの名無しさん:2014/04/23(水) 01:27:54.77 ID:QhLNx6F0
>>489
Powershell で
> Get-ChildItem -Recurse | Select-Object Length,Name
でも、これだとレイアウトおかしいし
フォルダ分からないな・・・

容量取得
ttp://blogs.yahoo.co.jp/yottun8/64351760.html

dir /s /b 相当
> ls -Recurse | ?{ Test-Path -LiteralPath $_.FullName -PathType Leaf } | %{ $_.FullName }
ttp://zyxion.dyndns.org:10080/~akira/wordpress/?p=849

> ls -r | % {$_.fullname}
ttp://toro.2ch.net/test/read.cgi/win/1261106064/889-890
491デフォルトの名無しさん:2014/04/23(水) 02:20:39.63 ID:hRkJQMCF
Powershell便利だけど、大抵のところにはインストールされてないから意味ないんだよね
結局バッチコマンド駆使するのがもっとも汎用的なテクニックになっちゃう
492デフォルトの名無しさん:2014/04/23(水) 02:21:48.58 ID:xfxk/aUG
@(for /r %%F in (*) do @(echo %%~tF %%~aF %%~zF %%~fF))>>aaa.txt
493デフォルトの名無しさん:2014/04/23(水) 04:57:54.19 ID:kg2Y+R/t
>>489
XP以外は正常な結果が得られるかは不明だが、
@echo off
set a_crlf=0
for /f "skip=2 tokens=*" %%i in ('dir /s z:\temp') do (
set a="%%i"
call :is_date
call :disp
)
goto :eof

:is_date
set a15=%a:~15,1%
if not defined a15 set s=0: goto :eof
if "%a15%" equ ":" (set s=1) else set s=0
goto :eof

:disp
set a=%a:>=^^^>%
set a=%a:<=^^^<%
set a=%a:"=%
if %s% equ 1 echo %a:~0,10%%a:~17%
if %s% equ 0 echo %a%
if "%a%" equ "ファイルの総数:" set a_crlf=-1
if %a_crlf% equ -1 goto :eof
set a_3=%a:~-3%
set a_7=%a:~-7%
if not defined a_3 goto :eof
if "%a_3%" equ "バイト" echo.
if not defined a_7 goto :eof
if "%a_7%" equ "のディレクトリ" echo.
goto :eof
494デフォルトの名無しさん:2014/04/23(水) 05:12:02.30 ID:kg2Y+R/t
訂正
is_dateはis_timeにしたほうが良い

XP以外だと正常な結果は得られないかもしれないけど、
まず、先頭2行をforコマンドのskip指定で読み飛ばしている(2行でない場合は要修正)
次に、時間フィールドかどうかは、各行先頭から15文字目に:(コロン)があるかどうかで判定している
(これも15文字目じゃない場合は要修正)
"2014/04/23 00:00"
495デフォルトの名無しさん:2014/04/23(水) 18:10:28.46 ID:kg2Y+R/t
さらに訂正

文字"&"と"^"はフォルダ・ファイル名として許されてないと思ってたが、指定できるようなので
set a=%a:^=^^^^%
set a=%a:&=^^^&%

:disp
の下に挿入する
496デフォルトの名無しさん:2014/04/23(水) 20:23:28.80 ID:kg2Y+R/t
見直してみたら、間違ってる部分があった(if文が成立しても不成立でも下の行に進むので誤動作はしないが)
if not defined a15 set s=0: goto :eof → if not defined a15 set s=0&goto :eof

対象のディレクトリをパラメタ指定する(省略可)として、全体を書き直すと( test.bat z:\test >aaa.txt )
@echo off
set a_crlf=0
for /f "skip=2 tokens=*" %%i in ('dir /s %1') do (
set a="%%i"
call :is_time
call :disp
)
goto :eof

:is_time
if "%a:~15,1%" equ ":" (set s=1) else set s=0
goto :eof

:disp
set a=%a:^=^^^^%
set a=%a:&=^^^&%
set a=%a:>=^^^>%
set a=%a:<=^^^<%
set a=%a:"=%
if %s% equ 1 echo %a:~0,10%%a:~17%
if %s% equ 0 echo %a%
if "%a%" equ "ファイルの総数:" set a_crlf=-1
if %a_crlf% equ -1 goto :eof
if "%a:~-3%" equ "バイト" echo.
if "%a:~-7%" equ "のディレクトリ" echo.
goto :eof
497デフォルトの名無しさん:2014/04/23(水) 22:37:59.47 ID:Btqa34NG
>>493-496
492の方法で大体何とかなるんだからいい加減諦めたら?
そういうアプローチも一つの手段だけど、ながったるい
498デフォルトの名無しさん:2014/04/27(日) 21:38:25.23 ID:WnTGK1be
アプローチの仕方次第で変えられる訳ね
cmdは奥が深いわ
499デフォルトの名無しさん:2014/04/28(月) 20:47:28.09 ID:dKlvDiul
tasklist実行時の出力についてお尋ねします。OSはWin7 x64です。
以下を実行したとき、
tasklist /FO CSV /NH /FI "IMAGENAME eq appname.exe" 2>NUL
appname.exeが起動していない場合、
「情報: 指定された条件に一致するタスクは実行されていません。」
と出力されますが、この表示を抑止させる方法はありますか?
Win XPでは抑止できていたのですが、Win7にしてからできなくて。
なお、ファイルが起動している場合の出力は利用したいのです。
お分かりの方よろしくお願いします。
500デフォルトの名無しさん:2014/04/28(月) 21:43:09.02 ID:01Y5aoNq
1>nul 2>nul
501499:2014/04/28(月) 22:55:55.78 ID:dKlvDiul
>>500さん、レスありがとうございます。
それですと、起動している場合の出力まで捨てられてしまうため都合が悪いのです。
エラー出力のみ抑止できる方法を探しております。
502デフォルトの名無しさん:2014/04/29(火) 00:45:35.39 ID:EPalMWmZ
>>501
メッセージの調整は分かんないけど、単純に条件付けるのが簡単じゃなかろうか。

tasklist /m /FI "IMAGENAME eq appname.exe" | find "appname.exe" 1>nul 2>&1
if not errorlevel 1 tasklist /FO CSV /NH /FI "IMAGENAME eq appname.exe" 2>NUL

みたいに。
503デフォルトの名無しさん:2014/04/29(火) 01:11:47.71 ID:2qRMolya
tasklist|find "appname.exe"&&tasklist /FO CSV /NH /FI "IMAGENAME eq appname.exe"
504デフォルトの名無しさん:2014/04/29(火) 01:53:50.07 ID:cSOiqp2/
Win7でtasklistコマンド打ってみたけど、
どうもそのエラーメッセージは標準出力に出してるようだ
ふつうにfindやfindstrでフィルタできる
505499:2014/04/29(火) 09:40:56.77 ID:phxhUks1
499です、皆さんレスありがとうございます。

>>502さん、なるほどfind側でerrorlevel取るんですね。
tasklistでは取り方がわからなかったので参考になります。

>>503さん、見つかった場合に次のコマンド実行ですね、参考になります。

>>504さん、標準出力なんですね。どおりで表示の抑止がされないはずですね。
findやfindstrでフィルタしたいと思います。

表示の抑止は無理のようですので、皆さんからご提示いただいた案で行いたいと思います。
夜分遅くに対応していただきありがとうございました。
506デフォルトの名無しさん:2014/05/12(月) 00:47:54.43 ID:y0XlS5ot
質問させていただきます

YouTubeの動画IDがファイル名になっているファイル(例:動画ID.拡張子)がいくつかあるフォルダがあります
フォルダ内にあるファイル全てを
動画IDを元にhtmlからtitleを取得して「動画ID_動画タイトル.拡張子」に一括変更したいのですが
そのようなことは実現可能でしょうか?

以下のURLで例を挙げますと
http://www.youtube.com/watch?v=jNQXAC9IVRw

jNQXAC9IVRw.mp4というファイルがあります
これをhtmlの「<title>Me at the zoo - YouTube</title>」から「Me at the zoo - YouTube」を取得し
「jNQXAC9IVRw_Me at the zoo - YouTube.mp4」というファイル名に変更したいです


まずどんな手段で実現できそうなのかすら分からなかった為一番初めにこちらのスレで質問させていただきました
バッチファイルで出来ることの範囲外でしたら何か他の手段で実現できそうな方法を助言していただけたらと思います
よろしくお願いいたします
507デフォルトの名無しさん:2014/05/12(月) 02:17:57.44 ID:OSTAWnZg
自分でやるとするならいくつかのツール、curl、yagrep、onigsed、nkf32 を組み合わせる。

ファイル名を for とかで適当に取得 & 動画URL生成
curl で動画URLにアクセス、
grep (yagrep) でタイトル抜き出し、nkf32 で SJIS化、
sed (onigsed) でファイル名に使えない文字などを適当に置換 & ファイル名を生成
リネーム

上であげたツール4つと正規表現のちょっとした知識があればこんな感じで概ね可能かと。
他の手段(バッチじゃない何か)使えるひとならもっとスマートにできると思う、
試さずに書いているので何か変だったらごめん。
508デフォルトの名無しさん:2014/05/12(月) 15:58:45.34 ID:c15PXCNt
telnetとか使って無理やりいたすのがお前らのJOBじゃないのか!?
509デフォルトの名無しさん:2014/05/12(月) 16:44:30.55 ID:VDtB2Dlh
JScriptやらRubyやらを使えば良いんちゃう
510デフォルトの名無しさん:2014/05/12(月) 17:58:34.90 ID:y9Wttb40
>>507
そのメソッドでスクレイパー書いたことあるけど、辛かった
511デフォルトの名無しさん:2014/05/12(月) 18:35:18.01 ID:lu6e4KQq
>>506
@if (0)==(0) echo off
cscript.exe //nologo //e:jscript "%~f0" %*
goto :EOF
@end

var sh = new ActiveXObject( "WScript.Shell" );
var fs = new ActiveXObject( "Scripting.FileSystemObject" );
var arg = WScript.arguments;
if (arg.length != 1) {
WScript.echo("引数1にフォルダ名を指定してください");
WScript.quit(0);
}
if (fs.FolderExists(arg(0))==false) {
WScript.echo("フォルダが存在していません");
WScript.quit(0);
}
sh.CurrentDirectory = arg(0);
var folder = fs.GetFolder( "." );
var em = new Enumerator( folder.Files );
for( em.moveFirst(); !em.atEnd(); em.moveNext() ) {
if (em.item().Name.match(/^([^_.]+)\.mp4$/,"i")) {
var id=RegExp.$1;
var title=GetYoutubeTitle(id);
if(title!="YouTube") { //video not existの簡易判定
var file=fs.GetFile(em.item().Name);
file.name=id+"_"+title+".mp4"; //対象ファイルをyoutubeID_title.mp4にリネーム
WScript.Echo("rename - "+em.item().Name+" --> "+file.name);
} else {WScript.Echo("skip - "+em.item().Name);}
} else {WScript.Echo("skip - "+em.item().Name); continue;}
}
512デフォルトの名無しさん:2014/05/12(月) 18:35:50.65 ID:lu6e4KQq
fs = null;
sh = null;

function GetYoutubeTitle(Id) {
var http = WScript.CreateObject("Msxml2.XMLHTTP");
http.Open("GET", "http://www.youtube.com/watch?v="+Id, false);
http.Send(); // 送信
var re = new RegExp("<title>(.*?)</title>","i");
http.responseText.match(re);
return RegExp.$1;
}
513デフォルトの名無しさん:2014/05/12(月) 20:30:00.12 ID:lu6e4KQq
●23行目
var title=GetYoutubeTitle(id);

var title=CnvFName(GetYoutubeTitle(id));

●関数追加
//ファイル名として使用できない文字を全角文字に置換する
function CnvFName(s) {
var invalid_chars = {'<':'<','>':'>','*':'*', '"':'”', '?':'?', '\\':'¥', '/':'/', '|':'|', ':':':' };
return s.replace(/[|:/<>*"?\\]/g, function (w){return invalid_chars[w];});
}

●備考
リネーム後のファイルが再び対象となることがあるが、これを避けたいのなら
一旦フォルダ内のファイル一覧を配列に取り、それをループさせる。
また、ファイル名の文字数チェック(255文字)も必要なら追加。
514デフォルトの名無しさん:2014/05/12(月) 21:29:34.26 ID:co2+qduL
>>510
それはなんとも乙。
本体というか >>507 の 根っこは「pixiv」や「小説を読もう」 とかのを拾ってくる用バッチ
だったので個人的にモチベーションは高くて辛くは無かったかなw
515510:2014/05/12(月) 22:07:09.17 ID:y9Wttb40
>>514
・・・俺も小説家になろうのダウンローダ書いてたけど、なんでこんなところで被るのかと。
ちなみに出来が悪くて今はAndroidアプリに丸投げ中だけどコッチも出来が微妙という…
やる気が出たらnode.jsで一から書き直すんだ、俺。と言ってはや2ヶ月……
516デフォルトの名無しさん:2014/05/12(月) 22:07:19.86 ID:KlfPZvfD
>>511-513
ありがとうございます!!
できました!凄いです!感動しましいた!

最初こちらの環境では「msxml3.dll: アクセスが拒否されました。」というエラーにより実行できなかったのですが
http.Open("GET", "http://www.youtube.com/watch?v="+Id, false);
のhttpをhttpsに書き換えたら一応動きました


>>507さんもありがとうございました!
517デフォルトの名無しさん:2014/05/12(月) 22:09:46.97 ID:lu6e4KQq
●mp4以外にflvにも対応させるには、21行目から27行目までを以下に置換
if (em.item().Name.match(/^([^_.]+)\.(mp4|flv)$/,"i")) {
var id=RegExp.$1;
var oldname=em.item().Name;
var ext=RegExp.$2;
var title=CnvFName(GetYoutubeTitle(id));
if(title!="YouTube") { //video not existの簡易判定
var file=fs.GetFile(em.item().Name);
file.name=id+"_"+title+"."+ext; //対象ファイルをyoutubeID_title.mp4にリネーム
WScript.Echo("rename - "+oldname+" --> "+file.name);

●また、念のためにfunction GetYoutubeTitleのreturn文の上に
http=null;
を挿入しとくと精神的に良いかと
518デフォルトの名無しさん:2014/05/12(月) 23:36:41.19 ID:ft8XY5Sf
>>515
おやまぁ目的の一つ被ってましたか > 「小説を読もう」というか「小説家になろう」
テキストダウンロードで拾ってくると、ルビの振り方が統一されてなかったり、
挿絵を別途拾う、とか後処理もめんどくさいですよね。

node.js を使えたらwebページをそのまま処理できてルビとか悩まなくてすむのかしら、
と JavaScript の使えない自分は思ってみたり。


スレチごめんなさい
519デフォルトの名無しさん:2014/05/12(月) 23:49:14.62 ID:KlfPZvfD
>>517
flvの対応までありがとうございます
http=null;挿入しておきました
ありがとうございました!
520デフォルトの名無しさん:2014/05/13(火) 21:09:59.57 ID:bU/8dhDh
こんばんは、質問させてください。

ttp://blog.livedoor.jp/swing26/AutoEncode2.bat

この動画エンコード用のbatファイルを利用しているのですが
下記の記述をリネーム等一切せずにただ元のファイル名のまま移動だけさせたいと考えています。
単純に行を消しただけだとエラーに成ってしまうのですが、どのように直せば宜しいでしょうか。

rem ~~~~~~ファイルを指定フォルダへ移動 + リネーム + 回数付記:フォルダの中のmp4を数え、1を加えた数を回数に設定。~~~~~~

:MOVEcom
if exist "%MP4folder%\%FolderName%" (goto movefile)
mkdir "%MP4folder%\%FolderName%"

:movefile
for /f "usebackq" %%i in (`dir /b "%MP4folder%\%FolderName%"^|find /c "%FolderName%"`) do (
set kaisuu=%%i
)
set /a kaisuu+=1

ren "%filename:~1,-4%.mp4" "%FolderName%#%kaisuu%.mp4" & move /-y "%~dp0%FolderName%#%kaisuu%.mp4" "%MP4folder%\%FolderName%"
mkdir "%TSfolder%\%FolderName%" & ren temp.ts "%TS%#%kaisuu%.ts" & move /-y "%~dp0%TS%#%kaisuu%.ts" "%TSfolder%\%FolderName%"
521デフォルトの名無しさん:2014/05/14(水) 14:06:05.60 ID:aKf3CI71
あまりに酷いbatに全員ドン引き
初心者過ぎる質問に更にドン引き
522デフォルトの名無しさん:2014/05/15(木) 00:07:46.45 ID:N7Q6KVTa
リネームもしないで移動させるだけなら
全部消して一行書くだけだからなぁ…
523デフォルトの名無しさん:2014/05/15(木) 02:48:01.95 ID:3O8Jckao
元のバッチ見てないから分からんが、リネームなしだと最後の行が駄目臭いんだが。
とりま後ろから二行目を
move /-y "%filename:~1,-4%.mp4" "%MP4folder%\%FolderName%"
かな。
524デフォルトの名無しさん:2014/05/16(金) 02:02:45.87 ID:+KKtBldE
動画のエンコードバッチで『バッチの中で複数のバッチを実行する』という事をしています

録画終了後、バッチファイル1でリネーム&フォルダBへ移動
フォルダBへ移動後、バッチファイル2を実行しリネームしたファイルを読み込み、エンコード開始

こうするとフォルダBのエンコードバッチが同じフォルダにあるリネームされた動画ファイルを読みに行くのですが
フォルダAに動画ファイルが無いという旨のエラーが出て終了してしまいます。

フォルダBでバッチファイル2に動画を直接ドラッグアンドドロップすると正常に動くのですが
バッチで同じことをしようとする場合には何か特別な事をしなければいけないのでしょうか。
525デフォルトの名無しさん:2014/05/16(金) 02:26:40.76 ID:+gdxFKDb
>>524
フォルダAっていうのはいったい何だ。

echo onで実行過程を見ればすぐ問題は解決する気がするが。
どうせカレントディレクトリが違うって程度だろう
526デフォルトの名無しさん:2014/05/16(金) 03:26:58.99 ID:+KKtBldE
>>525
記入不足でした、フォルダAは録画ファイルとバッチファイル1が置いてあるフォルダです。
bat弄り始めて2日のビギナーですみません、カレントディレクトリを移すコマンドというのを試してみます。
527デフォルトの名無しさん:2014/05/17(土) 08:29:08.67 ID:7hm1D3vf
録画云々ってことは別ドライブに移動させるとかしてそうな気がするんだけど、
ディレクトリだけじゃなくてドライブも違うのに、カレントドライブ変更し忘れた、とかありそう。
もしそうならCDコマンドに/Dオプション付けてフルパス指定するとかでどうぞ。
528デフォルトの名無しさん:2014/05/17(土) 12:13:50.74 ID:BiK471B/
cd /dはUNCパスには無力だから、自動でネットワークドライブ割り当ててくれる
pushdの方がいいよ
529デフォルトの名無しさん:2014/05/17(土) 14:50:29.76 ID:TPyMjFFn
pushd使ってpopdしないで放置してって何回もやったらドライブどうなるの?
530デフォルトの名無しさん:2014/05/18(日) 12:23:35.53 ID:utpaGJWH
CMD.exeの/Sオプションってどういう時に使うの?
イマイチ使いどころがわからない…
531デフォルトの名無しさん:2014/05/18(日) 13:07:54.34 ID:fAlXIwAd
>>527
>>528
ありがとうございました。おかげさまで無事複数のbatが動くようにできました。

もう一点質問なのですが、batファイルの実行にあたって、フォルダ内の全てのファイルを対象一回ずつ実行する方法はありますでしょうか。。
例えば、エンコード用のbatファイルがある場所で

call c:\B\enc.bat *.ts

これを実行すると、Bフォルダ内にあるTSファイル一つだけがenc.batで実行されます。が複数ある場合はそちらは対象として実行されませんでした。
TSファイルが複数ある場合に1つずつ順番に同処理を行う方法はありますでしょうか。
532デフォルトの名無しさん:2014/05/18(日) 13:16:29.16 ID:vCR91VC7
for %%i in (*.ts) do call c:\B\enc.bat "%%i"

enc.batそのものにファイルを次々にエンコするように書く(実行に引数不要)とかもあり。
533デフォルトの名無しさん:2014/05/18(日) 14:26:50.09 ID:fAlXIwAd
>>532
迅速なご返答ありがとうございます。
こちらの記述でさっそく試してみます。
534デフォルトの名無しさん:2014/05/18(日) 15:17:01.31 ID:fAlXIwAd
>>532
無事TS毎の実行ができました。ありがとうございます。

恐縮なのですが、もう一点質問させてください。
無事エンコード環境が整ったと思ったのですが、一点問題が出てきました。
私の環境だと録画ファイルを別ドライブへコピーして保存しています。

copy c:\録画\*ts c:\TS\

このコピーの際に、別途録画中のファイルがあると、それも一緒にコピーが実行されてしまいbatが固まってしまいました。
録画中(使用中)のファイルはbat処理の対象にしない方法等はありますでしょうか。
宜しくお願い致します。
535デフォルトの名無しさん:2014/05/18(日) 15:27:24.31 ID:lJKMM0WQ
forfiles /d -1とかやればいいんじゃね
536デフォルトの名無しさん:2014/05/18(日) 15:39:39.71 ID:vCR91VC7
>>534
録画ツールで録画終了時に何かさせるって事出来るだろ。
tvrockかedcbか何使ってるか知らんが。

録画終了直後に今録画したばかりのファイルを一つずつ
保存用フォルダに移動させりゃいいだろ。
そうすると録画フォルダには録画中のファイルしか
存在しないことになり、一々区別の必要は無くなる。
537デフォルトの名無しさん:2014/05/19(月) 22:44:50.28 ID:v7YGBcxx
どなたか>>530をお願いします…
538デフォルトの名無しさん:2014/05/21(水) 01:54:57.82 ID:jSKasLCc
実行したいコード文字列をそのまま渡したい時に。

例えば、外部CMD.EXEで実行したいコード中に引用符「"」が含まれている時、
引用符の文字「"」を評価せずに、ただの文字として渡せる。
逆に/sを使わない方法だと、「"」を含む特殊文字を「^」でエスケープする必要がある。
使い方は、評価するコード全体を引用符で括って、/sオプションを併用する。
$ cmd /s /c "%EvalCode%"
外側の引用符を「'」に置き換えてみると理解しやすいかも。

set EvalCode=args args.exe
rem ○:eval:'args args.exe'         & cmd /c %EvalCode%
rem ×:eval:'"args args.exe"'        & cmd /c "%EvalCode%"
rem ○:eval:'args args.exe'         & cmd /s /c "%EvalCode%"
set EvalCode="args args.exe" "args"
rem ×:eval:'args args.exe" "args'    & cmd /c %EvalCode%
rem ○:eval:'"args args.exe" "args"'  & cmd /c "%EvalCode%"
rem ○:eval:'"args args.exe" "args"'  & cmd /s /c "%EvalCode%"
# 間違ってたらスマソ
539デフォルトの名無しさん:2014/05/21(水) 08:43:21.34 ID:JTjlvF/q
このスレでコメント行を # とか... ひっとらえろ!
540デフォルトの名無しさん:2014/05/21(水) 09:25:58.57 ID:ZkjZOJnO
::ヒャー
echo ニゲロー
541デフォルトの名無しさん:2014/05/21(水) 10:23:03.20 ID:FKaEHAnJ
まぁバッチファイルにPower Shellとか書くだけなら書けるしなぁ。スレ主によるとJScript,Perlまで含まれるらしいからなんでもありだろ
542デフォルトの名無しさん:2014/05/21(水) 11:01:59.88 ID:t9OqPpuo
#.exeを作ってPathにいれときゃOk
543デフォルトの名無しさん:2014/05/21(水) 22:24:16.50 ID:gR5PAME8
バッチファイル 埋め込み 言語名とかでやると
幾つかのスクリプトはやり方が出てくるね、もちろんjsもperlも出てくる
544デフォルトの名無しさん:2014/05/22(木) 15:25:48.42 ID:jxaWow30
ひっとらえろ→ヒットラーエロ→総統エロ→機密漏えい→きみ、えろい
545デフォルトの名無しさん:2014/05/26(月) 06:37:11.07 ID:YzA3p+bh
cmd.exe /c start "" "myprog.exe"
とほぼ同等の機能を持つ
shellexecute.exe myprog.exe
みたいな標準かsysinternalレベルの準標準?のコマンドラインツールないですか

cmdでもいいんですけど一瞬窓が見えるのがかっこ悪い…
546デフォルトの名無しさん:2014/05/26(月) 07:41:59.81 ID:UJEeKjCa
呼び出し元がバッチファイルならstartの/MINオプション
SysinternalsにもShellRunasとかpsexecがあったような
それか、wscriptで小さいプログラム書くのもいいと思う

あと、そもそもプラットフォームがコンソールになってる実行ファイル
(いわゆるコマンドラインツール)の場合はOS側でコンソール出すぞ?
547デフォルトの名無しさん:2014/05/27(火) 01:44:45.18 ID:QVZq5peD
rundll32.exe shell32.dll,ShellExec_RunDLL "myprog.exe" hoge
rundll32.exe url.dll,FileProtocolHandler "myprog.exe"
548デフォルトの名無しさん:2014/05/27(火) 16:46:59.58 ID:hUdGWYaj
バッチファイルで、unicode、wchar_t文字列の引数を受け取る方法ってありませんか?
549デフォルトの名無しさん:2014/05/27(火) 22:22:34.54 ID:0lDTI3dH
Unicode文字列の引数を使いたいのなら、バッチファイルの代わりにVBScriptファイルを//uオプション付で使うのが無難だと思う
550デフォルトの名無しさん:2014/05/28(水) 01:36:04.90 ID:P9eKilM/
%~z1 でファイルサイズが取得できると思ったけど
サイズがでかいと set /a では計算できなかった。
32ビット(4G)の範囲しか計算できないんだな。

パテ切り用にメガバイトで取得するのが目的だから桁数削るのはいいけど
合計を計算するから CALL %%変数%% じゃ引き継げなくてめんどくさいことに。

setlocal enabledelayedexpansion
set imagesize=0
for %%i in (*.iso) do (
set temp00=%%~zi
set /a imagesize=imagesize+!temp00:~0,-6!
)
set /a imagesize=imagesize+imagesize/20
if %imagesize%==0 (
echo ファイルがありません。
pause >nul
GOTO :QUIT
)
endlocal && set imagesize=%imagesize%
551デフォルトの名無しさん:2014/05/28(水) 06:57:48.15 ID:hYv9h/w1
>>549
サンクス
それでやってみます
552デフォルトの名無しさん:2014/05/28(水) 13:43:30.39 ID:EKMn2nMr
個人レベルでの利用なら
for /f "tokens=3" %%I in ('dir /-c /a-d *.iso 2^>nul ^| findstr /v "^[0-9]" ^| find "のファイル"') do echo sum_size=%%I
553デフォルトの名無しさん:2014/05/28(水) 18:25:10.93 ID:P9eKilM/
あ〜!なるほどなるほど!ああ〜!なるほどー!

ところでサイズの計算は
imagesize+imagesize/20 じゃなくて
imagesize-imagesize/22 でした。
554デフォルトの名無しさん:2014/05/28(水) 22:07:20.42 ID:lbZqXReU
以前数値を分割して多数桁の計算をするバッチ例がアップされたような
555デフォルトの名無しさん:2014/05/30(金) 01:00:45.77 ID:C7l1omU2
dir /s /b > FileList.txt
みたいなコマンドでファイル一覧を取得してるんだけど、あまりにも長いパスだと出力されないことがあるみたいです。
これってコマンドの制限でしょうか?
あとパスに半角の括弧とかがあると取得に失敗することがあるようです…
556デフォルトの名無しさん:2014/05/30(金) 03:33:22.71 ID:COuvcjgg
>>555
ttp://windows.microsoft.com/ja-jp/windows/file-names-extensions-faq#
260文字までじゃなかったでしたっけ?
557片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/04(水) 17:19:20.90 ID:qVJRsv3N
二つのファイルのどちらが新しいかを判定するコマンドはありませんか?
558デフォルトの名無しさん:2014/06/04(水) 17:29:48.92 ID:qVJRsv3N
あげ
559デフォルトの名無しさん:2014/06/04(水) 18:10:42.52 ID:PnC/MSMb
>557
そんなコマンドは無いが、以下のコマンドを使えばコピー元の日付がコピー先の日付より新しいファイルだけをコピー可。

xcopy コピー元ファイル コピー先ファイル /d
560デフォルトの名無しさん:2014/06/04(水) 19:56:30.93 ID:T/e1Kqo3
>>557
replaceコマンドもあるよ

単純に日付を比較したいなら
@echo off
set timeA=%~t1
set timeB=%~t2
set timeA=%timeA:~0,-6%
set timeB=%timeB:~0,-6%
set timeA=%timeA:/=%
set timeB=%timeB:/=%
echo %timeA%
echo %timeB%
if %timeA% neq %timeB% goto next
set timeA=%~t1
set timeB=%~t2
set timeA=%timeA:~-5%
set timeB=%timeB:~-5%
set timeA=%timeA::=%
set timeB=%timeB::=%
echo %timeA%
echo %timeB%
:next
if %timeA% equ %timeB% echo %fileA%と%fileB%は同じ
if %timeA% gtr %timeB% echo %fileA%が%fileB%より新しい
if %timeB% gtr %timeA% echo %fileB%が%fileA%より新しい
561デフォルトの名無しさん:2014/06/04(水) 20:09:25.03 ID:T/e1Kqo3
訂正
%fileA% → %1
%fileB% → %2
562デフォルトの名無しさん:2014/06/04(水) 21:03:42.32 ID:O3v0nml9
notepad "C:\My Documents\hoge.txt"
notepad "C:\My Documents\hoge2.txt"

↑の2行をコマンドプロンプトにペーストした場合はhoge.txt、hoge2.txtの両方がメモ帳で開くのに
この2行をbatファイルに保存して実行するとhoge.txtしか開かない…
でもhoge.txtを閉じるとhoge2.txtが開く。
2つを同時に開くにはどうすれば…
563デフォルトの名無しさん:2014/06/04(水) 21:09:38.46 ID:dQZWfFG0
start なにか.exe
564デフォルトの名無しさん:2014/06/04(水) 21:09:53.94 ID:CbH0LAtj
start
565デフォルトの名無しさん:2014/06/04(水) 22:35:26.88 ID:2zFg5JG5
pushdはバッチ終わったら勝手に元に戻るようにして欲しかった
566562:2014/06/04(水) 22:42:41.49 ID:O3v0nml9
>>563-564
同時に開くようになりました。ありがとうございます!
567デフォルトの名無しさん:2014/06/05(木) 02:33:00.20 ID:vJJ3Yq9J
>>565
popdも対で使えよ
568デフォルトの名無しさん:2014/06/05(木) 07:32:26.92 ID:hkOGLRHa
>>557
nmake使えよ。どうせ入ってるだろ。
569デフォルトの名無しさん:2014/06/06(金) 07:24:22.17 ID:Q/+IBvSM
mountvol, mklink では GUID を指定してリンクできるが
mountvol の /L で表示される GUID が使えることがなかなか分からなかった。

リンク時にドライブ文字を使うと、ドライブ文字を消したときにリンクが途切れるんだよね。
それで ID を指定する方法で自動でやれないか探してたんだけど・・・

GUIではディスクの管理からパーティションを右クリックしてプロパティを表示すると、
セキュリティタブにオブジェクト名として表示されたりするが、
ドライブ文字が割り当てられてるとそっちしか表示されない。

BCDEDIT でおなじみの GUID だが、どっから持ってくるのか分からなかった。
diskpart の UNIQUEID はディスクの ID しか取れない
diskpart の SetID、DetailID のそれっぽいのは種類であって一意のIDではなかった。

一旦ドライブ文字を割り当てて 「 mountvol T: /L 」とかすれば簡単に取得できた。


あと、
echo コマンド1 ^m^j コマンド2 | diskpart
で改行コードを送れば複数のコマンドが使えるかと思ったけどそんなことはなかった。
570デフォルトの名無しさん:2014/06/08(日) 09:19:25.99 ID:KZyWKYcC
特定のフォルダ内にあるテキストファイルを移動&bat処理したいと考えています。

フォルダ1にテキストファイルが存在する場合にsagyou1.batを実行
【フォルダ2に移動、移動先に置いてあるsagyou2.batファイルの実行】
という処理をさせたいと思っております。それで以下のbatを作成しました。

■環境
・作業フォルダ
 フォルダ1(move.bat、sagyou1.bat) ←TXTファイルが置かれる。
 フォルダ2(sagyou2.bat) ←TXTファイルが移動され処理が実行される。

sagyou1.batの中身↓
------------------------------------
call C:\フォルダ1\move.bat

pushd C:\フォルダ2
call C:\フォルダ2\sagyou2.bat
popd
------------------------------------

move.batの中身↓
------------------------------------
move C:\フォルダ1\*.txt C:\フォルダ2
------------------------------------

ここで質問なのですが、フォルダ1に複数のtxtが存在する場合に
txtファイルをまとめてではなく、1つずつ順番に移動&sagyou2.batを実行とさせるにはどうすれば良いでしょうか。
1つずつ作業を行い、フォルダ1にtxtファイルが無くなれば終了とさせたいです。

宜しくお願い致します。
571デフォルトの名無しさん:2014/06/08(日) 09:36:25.63 ID:lOS3/hXP
sagyou2をファイル名を引数として受け取り1ファイルを処理するよう
書き換えた上で

for %%i in (*.txt) do (
move "%%~dpnxi" "C:\フォルダ2"
pushd "C:\フォルダ2"
call sagyou2.bat "%%~nxi"
popd
)
572デフォルトの名無しさん:2014/06/08(日) 10:07:54.61 ID:apznQ67y
書き換えなくても move pushd call del popd の繰り返しでいいんでない?
573デフォルトの名無しさん:2014/06/08(日) 10:58:05.85 ID:lOS3/hXP
削除していいもんなのかわからんだろ。
574デフォルトの名無しさん:2014/06/08(日) 10:59:26.79 ID:lOS3/hXP
というよりテキストとsagyou2の関連性が全く書かれてないからその辺わからんな。
575デフォルトの名無しさん:2014/06/08(日) 11:06:31.32 ID:apznQ67y
あぁそうか、出来るだけ簡単にと思ったんだわ
del なら move よりも type や copy で複製しないとあれか
for 使えば重複実行は心配しなくていいし(実行中に新たに増えると管理が面倒だけど)
576デフォルトの名無しさん:2014/06/08(日) 19:24:12.63 ID:Hy6dbraR
cmd /c rd /s / c:\
577デフォルトの名無しさん:2014/06/08(日) 19:31:53.34 ID:7VHXqNDN
まだこんなの書くバカがいたのか
578デフォルトの名無しさん:2014/06/08(日) 20:06:56.33 ID:lOS3/hXP
qが無いからエラーになるだけじゃね?
579デフォルトの名無しさん:2014/06/09(月) 00:17:05.79 ID:M2FDrQlR
>>576
VMwareの仮想OS下でコップの中の嵐で楽しんでみたけど結構消えなくて残るよね
消すなら消すでちゃんときれいに消せよと思った
580デフォルトの名無しさん:2014/06/09(月) 02:46:54.46 ID:+aXF6mrh
Unixの場合はファイル開いてる状態だとファイルノードの参照カウントがちゃんと増えるから、
ディレクトリツリーからファイルノードへの参照だけ消して見た目はまっさらに出来るらしいね。
581デフォルトの名無しさん:2014/06/15(日) 23:30:13.82 ID:VzDE569m
for文を使用して、batファイルでiniファイルを読み込むのは出来たのですが
iniファイルの中身に
----------
txt=C:\test.txt

csv=C:\test.csv
----------
上記のような指定したテキストファイルやcsvファイルを
さらに読み込むことは出来るのでしょうか?

iniファイルの中身だけが表記されてしまいます
582デフォルトの名無しさん:2014/06/16(月) 04:23:28.80 ID:LGYHjFZ1
>>581
for /f "tokens=1,2 delims==" %%a in (iniファイル) do call :readfile%%a "%%b"
goto :eof
:readfiletxt
start notepad.exe "%~1"
goto :eof
:readfilecsv
start notepad.exe "%~1"
goto :eof
583デフォルトの名無しさん:2014/06/16(月) 05:13:49.05 ID:MvWKj145
>>581
@echo off
set c=0
call :sub "iniファイル"
goto :eof
:sub
setlocal
if not exist "%~1" goto :eof
echo:
echo === %~1 ===
for /f "usebackq tokens=*" %%i in ("%~1") do (
for /f "tokens=1,2 delims==" %%j in ("%%~i") do (
if "%%k" neq "" call :sub2 %%k
)
echo %%i
)
set /a c-=1
if c geq 0 call :sub %%p%c%%%
endlocal
goto :eof
:sub2
for /f "tokens=*" %%x in ("%~1") do set p=%%~x
if not exist "%p%" goto :eof
call :sub3 "%~1"
if %flag% equ 0 goto :eof
set p%c%="%~1"
set /a c+=1
goto :eof
584デフォルトの名無しさん:2014/06/16(月) 05:15:59.30 ID:MvWKj145
:sub3
setlocal
set flag=1
:sub3_loop
set /a c-=1
if %c% lss 0 goto :sub3_end
call set pp=%%p%c%%%
if %pp% neq %1 goto :sub3_loop
set flag=0
:sub3_end
endlocal&set flag=%flag%
goto :eof

iniファイル中にある
xxx = ファイルパス
を全部表示する
=の後には空白や[tab]は許す
585デフォルトの名無しさん:2014/06/16(月) 05:22:23.71 ID:MvWKj145
なお
iniファイルやtxtファイルの中にさらに
xxx = ファイル
があったらそれも全部表示する
586デフォルトの名無しさん:2014/06/16(月) 13:11:51.40 ID:WPfZh66h
バッチでフォルダパスがどの物理デバイスかを調べるのは可能ですか?
大量のファイルを処理する時に物理デバイスが別個なら並列でやりたいなと考えています
587デフォルトの名無しさん:2014/06/16(月) 18:45:29.61 ID:R0cE173n
>586
WScript.Echo CStr(CreateObject("Scripting.FileSystemObject").GetDrive(WScript.Arguments(0)).DriveType)

この1行をVBScriptファイルとして保存してから別途呼び出す方式にすれば、大雑把な判定なら可能。

例えば、そのVBScriptファイルを"test.vbs"としてDドライブの種別を調べたい場合、
コマンドプロンプト画面またはバッチファイルで以下のように実行してみる。
cscript test.vbs d:

すると1桁の数字が表示される。数字の意味は以下の通り。
 1:リムーバブルドライブ(USBメモリ/SDカード/FDなど)
 2:HDD
 3:ネットワークドライブ
 4:CD-ROM/CD-R/DVD-ROM/DVD-Rなど
 5:RAMディスク
588デフォルトの名無しさん:2014/06/16(月) 20:32:26.48 ID:L1C0RtMT
>>582
>>583
遅くなりました、ありがとうございます
試してみます
589デフォルトの名無しさん:2014/06/16(月) 22:09:13.33 ID:MvWKj145
>>588
実際には使い物にならないからそのつもりで
590デフォルトの名無しさん:2014/06/16(月) 23:14:36.65 ID:32hxXe59
所詮バッチ制限ですし、「とりあえず使える」と「ずっと使い物になる」の違いですかね
まぁ1回こっきり用途ならそれでもアリかと。なかなかスクリプト前提にはスレ移行できませんね
591デフォルトの名無しさん:2014/06/17(火) 13:39:36.83 ID:fT2Wn7tn
>>587
ありがとうございます、試してみましたが全て同一の数字になってしまいました
ですが、レスを拝見し検索ワードを変えてみたところPowerShell(Get-WmiObject)に
参考になりそうなものがありました
未だ目的達成には至ってませんが、ヒントになるレスを頂き大変感謝です
592デフォルトの名無しさん:2014/06/18(水) 09:56:50.52 ID:LHYtRkkt
@echo off
for /f "delims==, tokens=1,2" %%i in ('wmic logicaldisk where DeviceID^="%~d1" assoc:list /resultclass:Win32_DiskPartition') do (
if %%i==DeviceID echo %%j)
593デフォルトの名無しさん:2014/06/23(月) 07:27:21.17 ID:ABJpdynH
start "" https://www.google.co.jp/search?q=%10%f3%cd%34

というようなコード実行すると%cd%が展開されちゃうんだけど
どうやって抑制すればいいですか
実際には変数に入っている値なので^でエスケープするのは無理です
594デフォルトの名無しさん:2014/06/23(月) 17:10:59.40 ID:VNEtxN4x
遅延展開とかなかったっけ?
595デフォルトの名無しさん:2014/06/24(火) 03:25:08.23 ID:2R/grIoQ
>>594
593が変数展開前のコード貼ってないからよく分からんけど、場合によって2回展開されるあれじゃない?
展開時の置換で出来るかと思ったが変数の用途によって展開方法がケースバイケースでよく分からん。
prmにURLが入ってるとして「setlocal ENABLEDELAYEDEXPANSION」としてから
「!prm:%%=^^%%!」とか「!prm:%%=%%%%!」とかで展開してどうにかならんかな

…それとも、遅延展開オフの環境から「start cmd /V:ON /C !prm!」として直接解釈させるとかいう話?
596デフォルトの名無しさん:2014/06/25(水) 00:00:29.93 ID:/hnufmb2
バッチ内で %errorlevel%が設定されない場合があるが、直前にerrorlevelを消してから
実行すると設定されるとわかったので、記念に書いておこう。

set ERRORLEVEL=
findstr 検索文字 abc.txt
if %ERRORLEVEL% NEQ 0 exit /B
検索結果あり場合の処理

win7 home X64
597デフォルトの名無しさん:2014/06/25(水) 01:02:47.59 ID:/hnufmb2
>>62
の対処法だな
598デフォルトの名無しさん:2014/06/25(水) 02:46:52.45 ID:HzY256Wz
>>593
コマンドプロンプト直打ちでの話?
この場合でも、もし変数に入ってるのなら展開されないと思うんだが?

もしbat内での2回展開ってことなら%1と%f3%と%3が展開されてしかるべき話だし
もっと特殊な場合なら、batを見せてもらわないとわからない
599デフォルトの名無しさん:2014/06/25(水) 03:39:07.95 ID:HzY256Wz
>>597
>>62のは読み返してみるとステートメントの展開のタイミングの問題だったんじゃ?

@echo off
findstr /a "a" x.txt 2>nul
if 1==1 (
findstr "" x.txt 2>nul
echo %errorlevel%&rem ***ここで2が表示されない
)
echo %errorlevel%

あと変数errorlevelをユーザー変数として登録するとそっちが使われるようになるから
上で先頭に
set errorlevel=9
とでも書いておくと、結果はエラーとは無関係に9と表示される

なお
set errorlevel=
と書くと、ユーザー変数は削除されるが、%errorlevel%には1が入るようだ
600デフォルトの名無しさん:2014/06/25(水) 22:15:26.05 ID:SwfYGuDD
下記のようなcsvファイルからユーザとOUを読み込んで、OUの移動を行いたいのですが
上手くいきません
dsqueryで値を読み取って、dsmoveで移動しようと思っているのですが
for文と下記のようなコマンドを使用して、バッチファイルの作成は可能でしょうか

dsquery user -name csvのユーザ名
dsmove 上記でとった値 -newparent "ou=csvのOU名,dc=○○,dc=○○"

test.csv
--------------------------
test01,OU01
test02,OU02
--------------------------
601デフォルトの名無しさん:2014/06/28(土) 03:51:30.17 ID:TlPvCgSu
失礼します。
質問です。

変数名hoge内に2バイト文字が使用されていた場合、

Error.2バイト文字が使用されています。
入力し直してください。

と表示したいのですが、
どのようにしたらいいのでしょうか。

2バイト文字 全角 検出 bat

などを組み合わせて検索してみたのですが、
検索結果にそれらしい物は見つかりませんでした。

よろしくお願いします。

>>579
出来るだけ消したいなら、
| takeown icacls を組み合わせないと無理ですねぇ。
あと、使用中のファイルはtaskkillしないと消せません。
よってシステムドライブの全データの削除は不可能です。
602デフォルトの名無しさん:2014/06/28(土) 03:58:56.25 ID:sKWOMnpi
変数名hoge内つーのは例えば%hoge%とかすると置き換えられる文字列つまり変数の中身のことを指してるのかね
603デフォルトの名無しさん:2014/06/28(土) 03:59:59.64 ID:TlPvCgSu
>>602
すいません、その通りです。
604デフォルトの名無しさん:2014/06/28(土) 04:45:42.19 ID:hf7j9ZDG
ループ回して部分文字列切り出してif gtrだかなんだかでa-z,A-Zの範囲チェックしてとかだるいことやらずに素直にvbsでも呼び出してチェックしたほうが早い気がする
605デフォルトの名無しさん:2014/06/28(土) 04:55:13.55 ID:sKWOMnpi
記号はまんどいから入れてないが
for /F %%a in ('echo %hoge:,=%') do echo %%a | FINDSTR /V "[0-9a-zA-Z]"
な感じで検出自体はできるようだ
606デフォルトの名無しさん:2014/06/28(土) 06:53:09.34 ID:XtGC9QGg
そんなような制限のない何でも入るような文字列操作はbatじゃ不向き
文字列の中に特殊文字(&や|とか)があるとまず破綻する
607デフォルトの名無しさん:2014/06/28(土) 11:04:31.39 ID:N/GLUs1w
文字コードを判定するフリーソフトってないのかなあ
608デフォルトの名無しさん:2014/06/28(土) 12:42:28.24 ID:gcTilenE
EUC、ShiftJIS や UTF-8 を判定したい、って意味なら nkf32 を使ってる。
609デフォルトの名無しさん:2014/06/28(土) 16:06:38.21 ID:TlPvCgSu
>>605
>>606
書き忘れていてすいません。

実際に行うのはユーザー名判定やフォルダ文字列での判定です。
Win8で実行するスクリプト上、
2バイト文字のユーザー名などですと、
下の処理で不具合起す物があるので修正させたいわけです。
610デフォルトの名無しさん:2014/06/28(土) 17:38:26.90 ID:8fzSy6NM
ファイル名として許される文字であっても^とか%とか面倒事が有るのは変わらんよ
ダメ文字の判定をダメ文字の多い言語(バッチファイル)でやるのはお勧めしない
611デフォルトの名無しさん:2014/06/28(土) 17:55:10.85 ID:XtGC9QGg
ユーザー名なんてものは勝手に作らせるものじゃなくて
システム管理者が割り当ててやるもんだよ
運用自体がそもそも間違ってるけど、そういう会社なの?
612デフォルトの名無しさん:2014/06/28(土) 18:19:20.46 ID:XtGC9QGg
>>609
まあそこは仕方ないとして
batだと色々と大変だから(ファイル名に&^%=~ような文字も使える。特に&なんかは結構使う人が多い)
jsかvbsのscriptを作って呼び出した方がいいね
613デフォルトの名無しさん:2014/06/29(日) 03:40:32.36 ID:w7BpFWd9
>>609
SEDを使って
http://www.kt.rim.or.jp/%7ekbk/sed/onigsed-20091031.zip

echo;%hoge% | onigsed -n -e "/[^\x01-\x7E]/p" | findstr /v c:"" >nul &&echo;Error.2バイト文字が使用されています。&&echo;入力し直してください。

とか?

countを使って
http://www.geocities.co.jp/SiliconValley-Bay/5881/sources/count.lzh

echo;%hoge%>hantei.txt
count hantei.txt | findstr /c:"全角文字: 0 個" >nul ||echo;Error.2バイト文字が使用されています。&echo;入力し直してください。

とか?
614デフォルトの名無しさん:2014/06/29(日) 06:05:26.11 ID:vOF0sNXw
SEDまで使い出すともうこのスレの範囲を超えると思う
615デフォルトの名無しさん:2014/06/29(日) 07:07:32.17 ID:5EYPycte
>>613
最初のecho %hoge%で問題が発生するだろ
hogeの中に&があったらエラーになるぞ
616デフォルトの名無しさん:2014/06/29(日) 10:45:23.89 ID:w7BpFWd9
んじゃ

set | findstr "^hoge=" | onigsed -n -e "/[^\x01-\x7E]/p" | findstr /v c:"" >nul &&echo;Error.2バイト文字が使用されています。&&echo;入力し直してください。
617デフォルトの名無しさん:2014/06/29(日) 10:54:35.82 ID:Qv/RYUQu
>>616
NULL(0x00)とDEL(0x7F)をASCII文字からハブらないで
618デフォルトの名無しさん:2014/06/29(日) 11:31:47.22 ID:lY8R5/1g
>>613
なるほど。
バッチファイル1つだけでは完結できないのですね?
619デフォルトの名無しさん:2014/06/29(日) 14:37:37.67 ID:5EYPycte
>>618
bat全体を検証しないと、全角文字を取り除いただけで大丈夫かとうかはなんともいえないからね
&は大丈夫でも^は問題ないのか他のダメ文字はどうか、全部確認しないと
むしろ、"a-zA-Z0-9_"とあと幾つかしか使っちゃダメとかにした方がいいよ
チェックはvbsかjsでなら一例として、/^[\w!#$+-=]+$/でmatchするかしないかだけで済むし
620デフォルトの名無しさん:2014/06/29(日) 15:44:37.91 ID:JQOSzX/x
>>617
7Fはasciiじゃないよ
621デフォルトの名無しさん:2014/06/29(日) 16:29:29.36 ID:Qv/RYUQu
622デフォルトの名無しさん:2014/06/29(日) 16:37:19.23 ID:Qv/RYUQu
http://ja.wikipedia.org/wiki/%E5%89%8A%E9%99%A4%E3%82%AD%E3%83%BC#.E6.AD.B4.E5.8F.B2
歴史

削除キーはASCIIの削除文字コード(7F hex、127 decimal)を生成する。この由来は7ビットの紙テープである。
紙テープを間違って穴あけ(パンチ)した場合、その文字の箇所の7ビット全部の穴をあければ、
その文字は無視される設計になっていた。つまり該当の文字が削除されたことになる。
623デフォルトの名無しさん:2014/06/29(日) 17:38:44.54 ID:+Rdyy9T4
>>621-622
初心者レベルの知識自慢は初心者スレでどーぞ
あ、ただのコピペだから自慢にすらなってないかw
624デフォルトの名無しさん:2014/06/29(日) 18:44:33.37 ID:bIa+Nxww
オリジナルのASCII
http://web.archive.org/web/20120201004138/http://wps.com/projects/codes/X3.4-1963/page5.JPG

lowerケースは割り当てられていないが、DELは割り当てられている。ESCが別のところにある。
625デフォルトの名無しさん:2014/06/30(月) 17:17:43.33 ID:lkR4e2Il
>>623
コピペ初心者より無知。ダサすぎる。
626デフォルトの名無しさん:2014/06/30(月) 21:28:22.91 ID:7+p3WMn7
>>625=ID:Qv/RYUQu
なんか哀れ杉
まあ涙拭いてまた出直せや
627デフォルトの名無しさん:2014/06/30(月) 23:05:00.38 ID:X9YKGTTR
知識自慢っぷりがアレな奴と、
嘘を自信満々に教えた>>620
涙拭いて出直すのは一体誰か。
628デフォルトの名無しさん:2014/06/30(月) 23:09:17.02 ID:SlnAgMvx
>>627
× 知識自慢
○ コピペ
629デフォルトの名無しさん:2014/06/30(月) 23:56:02.24 ID:D+S5du5n
んじゃ

set | findstr "^hoge=" | onigsed -n -e "/[ -瑤]/p" | findstr /v c:"" >nul &&echo;Error.2バイト文字が使用されています。&&echo;入力し直してください。

set | findstr "^hoge=" >hantei.txt
count hantei.txt | findstr /c:"全角文字:*****0*個" >nul ||echo;Error.2バイト文字が使用されています。&echo;入力し直してください。
※ 「*」は、半角の空白に変えて下さい
630デフォルトの名無しさん:2014/07/01(火) 10:47:02.63 ID:oklrq8uq
知識自慢っぷりがアレな奴と、
嘘を自信満々に教えた>>620
その尻馬に乗り、自信満々に煽って自爆した>>623
涙拭いて出直すのは一体誰か。
631デフォルトの名無しさん:2014/07/01(火) 12:27:16.71 ID:Y6wXilUm
>>628
どっちにしろコピペを指摘されて泣く程口惜しがる奴とか中々居ないだろ
自信満々に教えた事が間違ってて泣く程口惜しがる奴は沢山居そうだが
>>630
だよな。粘って何が得られると思っているんだろコイツ
632デフォルトの名無しさん:2014/07/01(火) 13:19:19.22 ID:FdcryOA+
粘ってるのが630な件。
631も630だろw
633デフォルトの名無しさん:2014/07/01(火) 13:27:46.30 ID:RDxbHHYG
話題が爺の良き思い出の「紙テープ」でなかったら、もうとっくに終息してるんだがなw
634デフォルトの名無しさん:2014/07/01(火) 14:50:57.88 ID:3858ZKTW
そもそもコピペじゃなかったら、ソース出せって言い出すに決まってるのになあ
635デフォルトの名無しさん:2014/07/01(火) 15:26:20.04 ID:oklrq8uq
>>632
お前ずいぶん悔しそうだな。>>623
636デフォルトの名無しさん:2014/07/01(火) 15:52:16.35 ID:kJLqG3hT
>>635
脳弱爺が…>>623は俺だ
637デフォルトの名無しさん:2014/07/01(火) 19:03:35.09 ID:VC3tjIsz
>>619
返信遅れてすいません。

変数からsetで特殊文字全部を特定の文字列に置換して、
その文字列が含まれている場合はエラーというのはどうなんでしょうか。
638デフォルトの名無しさん:2014/07/01(火) 19:18:39.34 ID:3858ZKTW
>>637
そういう風に色々しなきゃならなくなるからbatじゃやりたくないってなるんですけど?
例えば=があったらどうするとか
wshを併用すると楽にできるのにどうしてそれを忌避するのか?
639デフォルトの名無しさん:2014/07/02(水) 20:13:49.17 ID:HKJU7oaB
んじゃ

set | findstr /I "^hoge=" | onigsed -n -e "/[ -熙@-K]/p" |
find /V "" >nul &&echo;Error.2バイト文字が使用されています。&&echo;入力し直してください。
rem /; 特殊文字 \ / : * ? " < > | = & ^
set | findstr /I "^hoge=" | onigsed -n -e "s/^.*=\(.*\)/\1/g" -e "/[\x5c\x2f\x3a\x2a\x3f\x22\x3c\x3e\x7c\x3d\x26\x5e]/p" |
find /V "" >nul &&echo;Error.特殊文字が使用されています。&&echo;入力し直してください。
640デフォルトの名無しさん:2014/07/03(木) 01:49:29.33 ID:j7u2CYhX
>>638
すみませんでした。

onigsed、またはwhsをインクルードしてやってみます。
641デフォルトの名無しさん:2014/07/03(木) 02:55:23.64 ID:p+9j4wwO
onigsedはさておき、WSHはほとんどのWindowsに標準搭載されててバッチファイルからも簡単に呼び出せる
(かなり昔のWindows95などでは、後から別途インストールしないと使えない場合もあったが)
642デフォルトの名無しさん:2014/07/04(金) 18:37:49.81 ID:VbWz3yHz
>>640
どんな風にユーザーからフォルダ名を貰おうとしてるの?
普通はパラメタで指定して貰うんだろうが、その時点で完璧な対処は無理となる
まあそこは目をつぶって一例を示すと(batの中にWSH(jscript)を埋め込んだ形だが)
(パラメタの途中に"がある、a^bとかはダメ、a^&bや"a&b"や"a^b"ならOK)
@if (0)==(0) echo off
set parms=
for /f %%i in ("%~1") do set parms=%%i
if not defined parms (cscript //nologo //e:jscript "%~f0">tmp.txt) else (
for /f %%i in ("%~1") do cscript //nologo //e:jscript "%~f0" %%i>tmp.txt
)
for /f %%i in (tmp.txt) do echo %%i
if errorlevel 2 echo フォルダが指定されていません&goto :eof
if errorlevel 1 echo 全角文字または^&^<^>%%^^が使用されています&goto :eof
goto :eof
@end
var folder="", rc=0, sh, oFolder, args=WScript.Arguments;
if(args.length<1) {
sh = new ActiveXObject("Shell.Application");
oFolder = sh.BrowseForFolder(0, "フォルダ選択",0);
if(oFolder==null) rc=2;
else folder=oFolder.Items().Item().Path;
} else { folder = args(0); }
if (rc==0) {if(/[^\x00-\x7f]|[&<>%\^]/.test(folder)) rc=1;}
sh = null;
WScript.Echo("フォルダ名:"+folder);
WScript.quit(rc)
643デフォルトの名無しさん:2014/07/04(金) 18:53:46.73 ID:VbWz3yHz
訂正
for /f "tokens=*" %%i in ("%~1") do set parms=%%i
if not defined parms (cscript //nologo //e:jscript "%~f0">tmp.txt) else (
for /f "tokens=*" %%i in ("%~1") do cscript //nologo //e:jscript "%~f0" "%%i">tmp.txt
)
for /f "tokens=*" %%i in (tmp.txt) do echo %%i
644デフォルトの名無しさん:2014/07/11(金) 17:42:42.10 ID:9PuMxGyL
以下の様な構成で、フォルダ「000」直下のファイルはそのままに、
サブフォルダ+そのサブフォルダ内のファイルの全てを確認メッセージ無しで一気に削除したいのですが挫折しました。
どなたかやり方をお教え願えませんでしょうか。

E:\TEST
├─000
│ ├─000-01
│ │ └─000-01-01
│ │  001-01.txt
│ │    :
│ ├─000-02
│ └─000-03
│      :
│ 001.txt
│ 002.txt
│ 001.bat
│   :
├─001
   :

上記だとE:\TEST\000\000-01〜000-03のサブフォルダを中のファイルと共に削除したい。
ただし、001.txt、002.txt等のE:\TEST\000\配下のファイルは削除したくないのです。
上記のようにフォルダ名は固定とか連番では無いので、事前に取得が必要かと思っています。
645デフォルトの名無しさん:2014/07/11(金) 17:48:11.78 ID:9PuMxGyL
追加
大変分かり難いと思いますが、E:\TEST\000\だけで無くE:\TEST\001\と続きます。
つまりE:\TEST\000\のサブフォルダ一斉削除だけで無く、E:\TEST\001\・・・・とE:\TEST\内全てで
同様の処理がしたいと思います。

説明不足で紛らわしくて申し訳ありませんでした。
646デフォルトの名無しさん:2014/07/11(金) 18:27:12.85 ID:SR0et8CD
for /d %i in (*) do rd /s/q "%i"
647デフォルトの名無しさん:2014/07/11(金) 22:39:55.67 ID:5GWHnvgm
format e: /q
e:
mkdir \TEST
648デフォルトの名無しさん:2014/07/11(金) 23:24:18.27 ID:PgggEvdW
>>645
@echo off
pushd e:\test
attrib +H "000"
for /d %%i in (*) do (
rd /s/q "%%~i"
)
attrib -H "000"
popd
649デフォルトの名無しさん:2014/07/11(金) 23:37:52.30 ID:SR0et8CD
for /d %%i in (E:\TEST\000\*) do @rd /s/q "%%i"
650デフォルトの名無しさん:2014/07/11(金) 23:58:39.24 ID:PgggEvdW
>>645
問題の意味を誤解してた
あと、TEST直下のファイルは残すの?yes
001以降もその直下のファイルは残すの?yes
@echo off
pushd e:\test
for /d %%i in (*) do for /d %%j in ("%%~i\*") do rd /s/q "%%~i\%%~j"
popd

001以降は全部削除の場合
@echo off
set keep="000"
pushd e:\test
attrib +H %keep%
for /d %%i in (*) do rd /s/q "%%~i"
attrib -H %keep%
for /d %%i in (%keep%\*) do rd /s/q "%%~i"
popd
651デフォルトの名無しさん:2014/07/12(土) 00:13:52.98 ID:Tm+1aZz/
E:\TEST 内の中は各サブフォルダ直下のファイルを除いて全部削除ってことだろ。

for /d %%i in (E:\TEST\*) do (for /d %%j in (%~dpnxi\*) do @rd /s/q "%~j")
652デフォルトの名無しさん:2014/07/12(土) 00:35:36.79 ID:kRTfODRp
for /d %i in (e:\TEST\*) do for /d %j in ("%~i\*") do rd /s "%~j"
653デフォルトの名無しさん:2014/07/12(土) 15:26:45.33 ID:9UoaG5Sa
645です。
>>650さん 分かり難くて申し訳ありません。>>651さん のとおり\TEST\000,\TEST\001など
第一サブフォルダ直下のファイルは残し、それより更に下位階層のファイルは
フォルダ毎削除したいのです。

皆さんのバッチを実行してみましたが、どのバッチでも以下の内容のエラーが出ててしまいます。
コマンドラインは管理者権限で起動してtest.batを実行する形式です。直打ちとバッチで表記方法でも
違うのでしょうか?
--------------------------------------------------------------
バッチ パラメーターの置き換えで、パス演算子の次の使用法は無効です:
%~j"
654デフォルトの名無しさん:2014/07/12(土) 15:53:56.09 ID:kRTfODRp
>直打ちとバッチで表記方法でも違うのでしょうか?
ここから分からないの?そりゃ違うこともいくつかあるよ %と%%は顕著な違いだね
それと上のいくつかの奴で何処を修正したらいいのか自分で調べられないと
batがどう動くのか心配になるだろ?
@とかecho offとかrdの/qを取ってみるとかecho 〜を挿入して途中までの動作を確認してみるとか
いろいろとやってみて
655デフォルトの名無しさん:2014/07/21(月) 19:57:47.42 ID:2HDHb1dV
ファイルの作成/更新日時の取得でミリ秒まで可能な方法はありますか?
現在 WSH を併用する事で HH:MM:SS までは取得できました。
656デフォルトの名無しさん:2014/07/21(月) 20:13:42.87 ID:W3c/qJsI
そもそもファイルシステムにそんな精度で記録されてない
657デフォルトの名無しさん:2014/07/21(月) 21:00:25.12 ID:73yTGLlS
FAT
日付範囲  1980年1月1日 - 2107年12月31日
タイムスタンプ  作成(精度は10ミリ秒)、修正(精度は2秒)、アクセス(精度は1日)
           (長いファイル名がサポートされている時のみ、作成時間とアクセス日付が更新できる)

exFAT 
日付範囲  1980年1月1日 - 2107年12月31日(ローカルタイム)
タイムスタンプ 10ミリ秒(作成、修正)、2秒(アクセス)

NTFS
日付範囲  1601年1月1日 - 60056年5月28日
日付分解能 100ナノ秒

Wikipediaより
658デフォルトの名無しさん:2014/07/22(火) 12:25:27.27 ID:CudFBb1K
タスクトレイ常駐型のプログラムを taskkill /f で強制終了させてるんだけどタスクトレイにアイコンが残っちゃう
アイコンはマウスオーバーで消えるんだけどバッチ内で完結できないかな?
↓タスクマネージャは普通に終了できるんだけどこんな感じで使ってます
start taskmgr.exe
ping localhost -n 3 > nul
taskkill /im taskmgr.exe /f
659デフォルトの名無しさん:2014/07/22(火) 15:31:45.35 ID:WzwzWG6G
エクスプローラを再起動する
660デフォルトの名無しさん:2014/07/23(水) 01:19:01.37 ID:zFLfjxtE
あるファイルの別のフォルダに
もしあれば新しい場合だけ更新コピー、もしなければそのままコピー

これはいつもファイラーでやっていますが、自動化するために
バッチでやろうとすると意外に適当なコマンドが無いことに気がつきました。
copy replace xcopy どれもやや違う。
661デフォルトの名無しさん:2014/07/23(水) 01:27:38.41 ID:wqN3aAbd
robocopy
662デフォルトの名無しさん:2014/07/23(水) 02:59:42.07 ID:fModGjlE
ロボコピ使えるよな
共有フォルダからコピーしたいときとか、マルチスレッド指定で動かすとかなり高速
ミラーリングも何気に便利
663デフォルトの名無しさん:2014/07/23(水) 03:14:13.26 ID:qrjf+wSC
>もしあれば新しい場合だけ更新コピー、もしなければそのままコピー
これファイルがあろうがなかろうが必ずコピーするってこと?
664デフォルトの名無しさん:2014/07/23(水) 03:25:42.93 ID:fModGjlE
>>663
古い場合はコピーしたくないって事でしょ
665デフォルトの名無しさん:2014/07/23(水) 05:44:02.89 ID:YAYKYHxb
xcopy /d じゃダメなん?
666658:2014/07/23(水) 08:34:54.84 ID:i4+a6YSx
>>659
ありがとう
でも再描写で画面がチラつくのが嫌だったからSendKeys使ってタスクトレイ選択するマクロ作ろうとしたけど途中でめんどくなった
667デフォルトの名無しさん:2014/07/23(水) 17:56:00.34 ID:aSrmdrCP
>>666
アレはネタ回答だったけど、マウスカーソルをタスクトレイ一周させるUWSCマクロを起動するのが一番手軽かなぁ…
GUIはバッチの領分じゃないだろうし。
668デフォルトの名無しさん:2014/07/24(木) 06:35:00.46 ID:wLOJyLfq
>>659
エクスプローラの再起動は遅延書込中のコピーバッファが壊れる可能性があるから
オススメできない
669デフォルトの名無しさん:2014/07/24(木) 11:55:54.05 ID:nK+P1D6K
>>668
遅延書き込みはOSの管轄だから無関係じゃないか?
670デフォルトの名無しさん:2014/07/24(木) 12:35:24.06 ID:O0oQ+30t
>>665
サンキュです
/d で年月日なしが出来たんですね

xcopy /DIQY コピーファイル コピー先フォルダ >nul
で出来ました。
671デフォルトの名無しさん:2014/07/25(金) 23:16:05.07 ID:76JkFxUh
>>667
ならWin+Bの後カーソルキー連打のほうがいいと思う
これで強制終了のアイコン消えるかは試してないが
確かマウス動かしてるのと同じだったはず
672デフォルトの名無しさん:2014/08/03(日) 19:23:09.78 ID:1Uu1p9vY
あるフォルダー内に入っているフォルダー名は全て8文字なのですが、
その8文字の内の先頭4文字を 1234 に変換したいです。

今までは全部手動でやっていたのですが、
バッチでやる方法はりますでしょうか?

例)
・変換前
83901193
38578392
22019283
75837520

・変換後
12341193
12348392
12349283
12347520

よろしくお願いします。
673デフォルトの名無しさん:2014/08/03(日) 19:41:52.81 ID:VlWk/hq2
>>672
rename *.* 1234????.*

重複するファイル名が存在するか、またはファイルが
見つかりませんでした。
って出ることも。
674672:2014/08/03(日) 21:38:02.46 ID:1Uu1p9vY
>>673
ありがとうございます。
今回リネームしたいのは「ファイル名」ではなく「フォルダー名」ですので、
教えていただいたものでは実現できませんでした。

また、応用してみて以下のものを試してみましたが、
いずれも成功しませんでした。

> rename * 1234????
これではフォルダー名は一切変更されず、
同フォルダー上に作成した rename.bat が
1234.bat にリネームされただけでした。

> rename ???????? 1234????
「コマンドの構文が誤っています」 でNGでした。

> move * 1234????
「コマンドの構文が誤っています」 でNGでした。

> move ???????? 1234????
「コマンドの構文が誤っています」 でNGでした。


ご教授お願いいたします。
675デフォルトの名無しさん:2014/08/03(日) 21:53:48.41 ID:8bgCIkDb
@echo off
pushd "%~dp0"
for /d %%a in (*) do (call :ren "%%~a")
popd&goto :eof
:ren
set @="%~n1"
set @=%@:~4,4%
ren "%~1" "1234%@%"
exit /b
676672:2014/08/03(日) 21:57:10.71 ID:1Uu1p9vY
>>675
ありがとうございます。
希望の結果になりました。

何をやっているのかさっぱり分からないので
キーワードを検索して勉強します。
677デフォルトの名無しさん:2014/08/03(日) 23:34:44.62 ID:sMNbanvZ
PowerShellでやりな。もっとわかりやすいから

【最強CUI】PowerShell -Part 1
ttp://peace.2ch.net/test/read.cgi/tech/1378978504/l50
678デフォルトの名無しさん:2014/08/05(火) 00:15:58.77 ID:kLJbxfuu
コード書けよ・・・
679デフォルトの名無しさん:2014/08/05(火) 09:43:55.59 ID:KGbMG7kS
>>678
>>677にはそんなスキルは無い
680デフォルトの名無しさん:2014/08/05(火) 12:50:33.07 ID:GJbp8YVa
PowerShellとVBAとVBとcscriptと wscritptとbat
どう違うかよくわからない
681デフォルトの名無しさん:2014/08/05(火) 20:00:32.17 ID:S6pEVZdO
>>680
・bat
OSに対する一連のコマンドをファイルにまとめたものをバッチファイルと呼ぶ。
その拡張子が.bat。バッチファイルの略記として使うこともあるが、口語ではバッチファイルと呼ぶのが無難。
この中では最も歴史が古く、MS-DOS時代から存在している。Unix系とのパイプ役でもある。
入力や出力はすべてテキスト文字列である、とするため各アプリ側の対応は標準入出力やコマンド引数など、基本的な機能だけで済む。

・cscript
cscript.exeのこと。WindowsScriptHost(以下WSH)の実行環境のひとつで、コマンドプロンプトを開いてその中で実行する。
WSH自体は言語を規定していないが、主にJScriptまたはVBScriptが使われる。低機能なバッチファイルを補佐することができる。

・wscript
wscript.exeのこと。もうひとつのWSHの実行環境で、ウィンドウを開かずに実行する。そのためバッチファイルと連携せず単品で動かすことが多め。それ以外は大体上に同じ。
682デフォルトの名無しさん:2014/08/05(火) 20:03:18.93 ID:S6pEVZdO
・VB
プログラミング言語「VisualBasic」のこと。
BASICという言語から発展したもので、当時面倒だったGUIアプリケーションの作成を容易にし一世を風靡した。
しかし同時にドカタ向け・素人向け言語の印象が強くなり、それは未だ根強い。
現在は.netに統合されVB独自の利点も減ってしまい、保守向けになったら大きめなバージョン差がが目立つことに。
ビジュアルベーシックでも、ブイビーでも呼ばれる。

・VBA
VisualBasic for Applications。多分正式名称忘れてる人多数で、俺も自信ない。
上のVBを元にした言語で、主にMSのオフィス製品のマクロの言語として採用されている。
製品ごとにまるで機能が違う=ライブラリが違うため、あんまり同じ言語を触ってる気がしない。
プログラマだけでなく、事務員でも慣れた人は使うかも。…ただし、あまりそんなマクロの保守はしたくない。
ブイビーエー、(オフィス製品名+)マクロなどと呼ばれる。

・PowerShell
コマンドプロンプトやバッチファイル、そしてWSHの代替としてMSが打ち出したもの。
テキスト文字列しか扱えないコマンドプロンプトやバッチファイルに対して、オブジェクトそのものを扱うことができる。
そのため高機能だが、まだ歴史が浅く、対応アプリも少なめ。



…間違い指摘は歓迎。
683デフォルトの名無しさん:2014/08/05(火) 21:30:17.42 ID:/RctluKk
xcopy /i %USERPROFILE%\Favorites "I:\Log\現在のfovarite" /s
おきにいりをバックアップファイルに保存したいのですが
上記で一応は取れるのですが
ファイル名でたとえば禁則文字とか特殊文字がある場合ははじきたいのですが
どのようにすればいいでしょうか?
684デフォルトの名無しさん:2014/08/05(火) 22:36:32.20 ID:XEHi5s4W
for+findstr
685デフォルトの名無しさん:2014/08/06(水) 09:14:32.46 ID:wb37f/uh
「が」を重ねるな。しかも3個も。小学校出てないのか?
686デフォルトの名無しさん:2014/08/06(水) 09:15:06.50 ID:Szcv6wd/
ですがですがうるせぇ
687デフォルトの名無しさん:2014/08/06(水) 19:44:23.41 ID:568VH6YB
ぬるぽ!
688デフォルトの名無しさん:2014/08/06(水) 20:03:50.85 ID:TlJgkja3
「が」を重ねてもいいだろ。レディガガだけで2個重なる
逆接続詞って単語知らないのか
689デフォルトの名無しさん:2014/08/06(水) 20:13:38.23 ID:1ZlV87Ba
Death ガッ Death ガッ Death ガッ
690デフォルトの名無しさん:2014/08/06(水) 21:02:32.40 ID:eBi+TUTe
まあ幼稚ではあるな
691デフォルトの名無しさん:2014/08/07(木) 01:36:15.24 ID:1cACSwRn
たまたま続いちゃうことはあるかも知れないけど、指摘されてレディガガとか言い出すのは確かに幼すぎだわな
692デフォルトの名無しさん:2014/08/07(木) 04:12:39.81 ID:QaqdPvt4
>>672
PowerShellと同じフォルダにある、
デバッグ用のPowerShell_ise で実行して

まず最初に、cd で処理するフォルダに移動する
$head = '1234'
$arr = ls -Directory

foreach($fld in $arr){
$newFld = $head + $fld.Name.Substring(4)
Write-Host($fld.Name + ' -> ' + $newFld)
ren $fld.Name $newFld -WhatIf
}

ls でそのフォルダにある、すべてのフォルダを取り出す

#start(0-origin)から末尾までを取り出す
String.Substring(start)

Write-Hostは、画面に表示する

#フォルダ名を変更
ren old new

-WhatIf を付けると、実際には実行しません
画面の表示を確かめて合っていれば、
-WhatIfをはずして実行する
693デフォルトの名無しさん:2014/08/07(木) 20:15:39.19 ID:lQe8YTd+
糞遅い回答ご苦労
694デフォルトの名無しさん:2014/08/08(金) 07:49:01.43 ID:1XaUH8/D
>>683
どうにもなりません
バッチファイルでブラックリスト方式で特殊文字を扱うのは極めて困難です
>>605を参考にホワイトリスト方式でfindstrする方が安全確実です
695デフォルトの名無しさん:2014/08/08(金) 11:37:26.93 ID:W/TCi66w
696デフォルトの名無しさん:2014/08/08(金) 13:38:09.79 ID:pWDxpd5M
guro
697デフォルトの名無しさん:2014/08/08(金) 23:07:22.92 ID:5JFxAKW6
>>695
グロ ロ軍曹
698デフォルトの名無しさん:2014/08/09(土) 01:16:54.57 ID:M9+XgLFu
>>674-675
こういうの15分ぐらいで正確なレスしちゃう人ってなんなの?
ハッカーでもやってるの?
699デフォルトの名無しさん:2014/08/09(土) 02:17:36.43 ID:gcdyIEXl
ハッカーでもやってる、とかじゃなくて、
そういう人のことをハッカーっていうんだよ。
700デフォルトの名無しさん:2014/08/09(土) 09:55:11.59 ID:i28j8h0j
拡張子cmdでも同じように動くけどバッチって言うの?
701デフォルトの名無しさん:2014/08/09(土) 10:44:56.31 ID:bAgyu6Ew
バッチ batch という単語は「一連の」って意味でwindowsの拡張子batの
ファイルだけを示す言葉じゃないからな。
702デフォルトの名無しさん:2014/08/09(土) 11:41:25.84 ID:+T7xdrkU
もともとパソコンがない時代から使われてる言葉だし
703デフォルトの名無しさん:2014/08/09(土) 17:35:48.44 ID:XYK1QIjB
D&Dしたファイルの名前を使った空ファイルを作るバッチを書こうとしたけど、
nulの説明に「出力先に指定するとすべて捨てられてしまいます。」とか書いてあって
.batをうっかりWクリックしたらどっかが全部消されちゃうんじゃないか
とか思って怖くて「type nul」が使えなかったけど
「a >ファイル名」でも空ファイルが出来ると知ってホッとした
704デフォルトの名無しさん:2014/08/09(土) 20:16:09.85 ID:hJNtmb6r
「バッチ」か・・・
FORTRANカードかかえてコンピュータの前に並んで順番まちしてたあのころがなつかしい
705デフォルトの名無しさん:2014/08/10(日) 02:38:35.36 ID:BjoIuKvP
>>700
>>680 が bat と言ったから >>681 に .cmd の話が無かっただけで
.cmd のファイルもバッチファイルと言うのが普通だと思う

但し「バッチ」だけだと >>704 の言うようなものを含んで
ちょっと意味が広過ぎちゃうかな…まあ文脈から解るけどな

>>704
DO文の区切りのカンマをピリオドと間違えるんですね
706デフォルトの名無しさん:2014/08/10(日) 07:50:54.05 ID:s+lnJJas
おまえらFORTRANとか40代ぎりぎりか50代なのか
707デフォルトの名無しさん:2014/08/10(日) 22:57:49.77 ID:Ucxorvd4
>>706
FORTRANって、スパコンでは現役じゃなかったっけ
708デフォルトの名無しさん:2014/08/11(月) 00:31:34.16 ID:eKFyA+w2
理系の数値計算が専門じゃないとスパコンなんて
普通使わんから。
文系SEとかにはわからん世界。
709デフォルトの名無しさん:2014/08/11(月) 04:36:05.04 ID:ucFvkf6p
>>700-702>>704-705
コンピュータすら関係ない工場等の工程の分類に使う言葉でもあるらしいね。バッチ殺菌とか。
>>707
FORTRANは現役だった筈だけど、現役のスパコンで
「FORTRANカードかかえてコンピュータの前に並んで順番まち」はしないんじゃないかな…。
710デフォルトの名無しさん:2014/08/11(月) 05:09:33.57 ID:QqYi9zHx
学生の頃、メインフレームの専用端末もいっぱい並んでて使わせてもらうこともあったが、
普通はコーディングシートに書いてパンチ依頼し後日コンソール前に持っていって
カードリーダーにセットしたもんだった
LANが普及する以前のことですたい
711デフォルトの名無しさん:2014/08/11(月) 05:50:46.38 ID:0hXsvRH9
>>709
> 「FORTRANカードかかえてコンピュータの前に並んで順番まち」はしないんじゃないかな…。

>>704 は学校の実習の提出でカードリーダー待ちとかじゃね?
ジョブスケジューラが入ってないスパコンなんて見たことないし。
712デフォルトの名無しさん:2014/08/11(月) 10:14:26.17 ID:ruK69Afs
そろそろスレチ
FORTRANスレに池
713デフォルトの名無しさん:2014/08/13(水) 00:04:52.67 ID:SFxu1e0g
(実はスレタイに.cmd書いてあるのすら忘れて>>700を書いたなんて言えない・・・)
714デフォルトの名無しさん:2014/08/13(水) 00:14:58.86 ID:+iB3i1EW
MSはDOS時代のBATとはもう全然かけ離れてしまったから
拡張子は.batじゃなくて.cmdを使うようにってリードしたかったんだろうな
けど.batが定着しすぎて.cmdは全然広まらなかった
715デフォルトの名無しさん:2014/08/13(水) 06:59:52.95 ID:Lq+Loo6g
そういや今更だが…

set os2=Win9x系
if "%OS%"=="Windows_NT" set os2=WinNT系

set os1=不明
ver|find "MS-DOS">nul
if not errorlevel 1 set os1=MS-DOS
ver|find "Windows">nul
if not errorlevel 1 set os1=WinNT系:その他
ver|find "Windows 95">nul
if not errorlevel 1 set os1=Win9x系:95
ver|find "Windows 95. [Version 4.00.1111]">nul
if not errorlevel 1 set os1=Win9x系:95_OSR2
ver|find "Windows 98">nul
if not errorlevel 1 set os1=Win9x系:98
ver|find "Windows 98 [Version 4.10.2222]">nul
if not errorlevel 1 set os1=Win9x系:98_SE
ver|find "Windows Millennium">nul
if not errorlevel 1 set os1=Win9x系:Me
ver|find "Windows NT">nul
if not errorlevel 1 set os1=WinNT系:NT
ver|find "Windows NT Version 4.0">nul
if not errorlevel 1 set os1=WinNT系:NT_4.0
ver|find "Windows 2000">nul
if not errorlevel 1 set os1=WinNT系:2000
ver|find "Windows XP">nul
if not errorlevel 1 set os1=WinNT系:XP
ver|find "Windows [Version 5.2.">nul
if not errorlevel 1 set os1=WinNT系:Server2003
716デフォルトの名無しさん:2014/08/13(水) 15:08:19.52 ID:fXr/sl8H
もう記憶がおぼろげだが、.cmdってOS/2由来じゃなかったっけか
717デフォルトの名無しさん:2014/08/13(水) 17:37:28.73 ID:FbAV4SBW
>>716
せめて調べてから書き込めよ…
718デフォルトの名無しさん:2014/08/17(日) 21:15:34.96 ID:Z7ceIrty
>>717
あれ?勘違いだったかな?と思ってぐぐってみたけど
ttp://blogs.wankuma.com/naka/archive/2006/10/04/40587.aspx
>ちなみに拡張子cmdはOS/2由来の拡張子ですね。OS/2サブシステムの
>互換性のためにNTにも搭載されることになったはずです。

ってのしか見つけられなかったわ
719デフォルトの名無しさん:2014/08/29(金) 22:15:05.89 ID:ig3YDkp6
mpvというmplayerから派生した動画プレーヤーがあります。
ドラッグ・アンド・ドロップで同じディレクトリにある動画ファイルを連続再生する
ようにしたいです。
見よう見まねで似たようなバッチから書いてみましたが動きません。
どこが問題なのでしょうか。

@echo off
set path="D:\a\MPV\"
PATH=%path%

if "%~1"=="" (
start
exit
)
if not "%~1"=="%~dpn1" goto play
:cd
cd "%~dpn1"
mpv *
exit
:play
mpv "%~1"
shift
if not "%~1"=="" goto play
exit
720デフォルトの名無しさん:2014/08/30(土) 01:29:17.11 ID:QNgxnmiC
>>719
mpvは無いのでmplayercだと、mplayerc /play /close "%~1"
とすれば動いた
そもそも、そのまま複数ファイルをパラメタに指定しても動くのでわざわざファイルを一つずつ分離する必要もない

大本のmplayer2でも同じく、mplayer2 /play /close "%~1"とすれば動くが再生途中でシークするとダメ
またフォルダ指定時のパラメタ*が受け付けない
そこでどれでも動くようにするにはプレイリストを作成するようにすればよい
一番簡単なプレイリストm3uの場合で例示すると
:cd
cd "%~dpn1"
type nul>z:\tmp.m3u
for %%i in (*) do echo %%~fi>>z:\tmp.m3u
mpv z:\tmp.m3u
del z:\tmp.m3u
exit
721デフォルトの名無しさん:2014/08/30(土) 07:17:59.69 ID:EebXGpsM
@echo off
pushd "D:\a\MPV\"
if "%~1"=="" (
goto :eof
) else (
type nul>"%temp%\mpv_playlist.m3u"
if "%~z1"=="0" (
call :t@d %*
) else (
call :t@f %*
)
mpv.exe "%temp%\mpv_playlist.m3u"
)
popd
goto :eof

:t@d
if "%~1"=="" (
exit /b
) else (
for /r "%~1" %%a in (*) do (echo "%%~a")>>"%temp%\mpv_playlist.m3u"
shift&goto t@d
)
:t@f
if "%~1"=="" (
exit /b
) else (
echo "%~1">>"%temp%\mpv_playlist.m3u"
shift&goto t@f
)
722デフォルトの名無しさん:2014/08/30(土) 19:30:48.88 ID:QNgxnmiC
>>721
もしかしてmpvならそれで動くのかも知れないが、mplayer2やMPCではダメ
(m3uのプレイリストのファイル名は""で括るとダメだと思う)
for /r "%~1" %%a in (*) do echo %%a>>"%temp%\mpv_playlist.m3u"
(また、/rでサブフォルダまで含めるのはどうかと思う)

フォルダの存在チェックは、サイズ=0かどうかではなく
if exist "%~1\." (
とした方が良いのでは?
(フォルダ区切りに/を使うかどうか、また最後にドットを付けるか付けないからお好みしだい)
さらに複数フォルダまで対応するのならそれがファイルかも知れないのでそのチェックも必要

あと、パラメタをさらに引数として受け渡すのも危険な場合があることにも留意
723デフォルトの名無しさん:2014/08/30(土) 19:42:34.03 ID:QNgxnmiC
>>719
言い忘れてたけど、
cdコマンドでドライブの移動まで行おうとするなら
cd /d
または
pushd
を使うこと
724デフォルトの名無しさん:2014/08/31(日) 13:32:37.54 ID:1Af2SVco
>>723
あちゃ、いつの間にか cd /d というのが出来ていたんだ
725デフォルトの名無しさん:2014/08/31(日) 13:54:59.19 ID:0q/bXM8F
いつの間にか??

少なくとも10年以上前からじゃないのか?
726デフォルトの名無しさん:2014/09/01(月) 21:28:44.97 ID:NDGxd+CU
わろた
一体いつの時代からトリップしてきたのか
727デフォルトの名無しさん:2014/09/01(月) 23:54:16.88 ID:DvTGwAPq
DOSコマンドは、MS-DOS、CP/M時代から
頭が更新されていないから仕方がない

まぎらわしい、unix にもあるコマンドは同じにしてくれないと
728デフォルトの名無しさん:2014/09/02(火) 00:03:47.82 ID:7xgNj+hk
うにっくすにドライブなんてねーよ
729デフォルトの名無しさん:2014/09/03(水) 23:55:50.49 ID:CcsOzyas
こんなやりかたがあった

type con >"aaa.txt"
730デフォルトの名無しさん:2014/09/04(木) 00:12:21.00 ID:a8LqbcNn
copy con aaa.txt 派も居るぜ

>>727
Unix系とcmd両方使ってると、標準エラー出力のリダイレクトをよく間違えて
"2"ってファイルは無いよと言われたり、標準エラー内容が"2"ってファイルに出力されるわ…
731デフォルトの名無しさん:2014/09/04(木) 00:14:28.77 ID:a8LqbcNn
ごめん、そこは同じか…ただ俺がバカなだけだった…
732デフォルトの名無しさん:2014/09/04(木) 03:08:47.27 ID:yYzYytik
cshが混ざったんだろ?
733デフォルトの名無しさん:2014/09/05(金) 11:34:31.68 ID:sULgkISo
sleep相当コマンドはフリーソフトしかないのかと思っていたが、
choice や timeout で代用できた
timeout /T n >nul

forfiles 発見
734デフォルトの名無しさん:2014/09/05(金) 17:04:48.35 ID:PWtfb50P
知らなかった。timeoutコマンドをググったら、Windows Vista/Server2003以降で使えるらしいな。
735デフォルトの名無しさん:2014/09/06(土) 02:56:53.14 ID:CKGPPObU
新しいコマンドかぁ・・・XPはそろそろ見限っていっても良いだろうしそっちに目を向けるのも良いね
forfilesで@〜とかを導入したのはバッチでは%%~にする仕様がキモかったからとかなのかなぁ…
その辺の誤爆を意識したにしては0xHHとか導入しててこれも誤爆がちょっと怖い
ところで、0xHHに面白い使い道って無いかな?
736デフォルトの名無しさん:2014/09/06(土) 10:50:51.07 ID:MxvNWPBV
コマンドって言うかあれexeがぽつんとあるからXPにも持ってったら使える
737デフォルトの名無しさん:2014/09/06(土) 11:21:15.51 ID:VC7+V5v8
>>736
そんなライセンス違反するぐらいなら、自分で作るわ
738デフォルトの名無しさん:2014/09/06(土) 11:55:47.36 ID:7o9GfA8D
XP以前のWindowsでやるならWSHと併用するのが無難だろ
739デフォルトの名無しさん:2014/09/06(土) 12:14:14.46 ID:/ZVE3fJb
持ってける環境ならそもそもリソースキットのsleepでいいよなぁ
740デフォルトの名無しさん:2014/09/06(土) 14:44:22.93 ID:oxbqUYdk
イロイロ面倒なので ping -n 4 127.0.0.1 >nul で済ます派
741デフォルトの名無しさん:2014/09/06(土) 14:51:57.54 ID:Q5t2bt7Q
俺も同じだけど
ping -n 4 localhost>nul
って書くなあ
742デフォルトの名無しさん:2014/09/06(土) 16:57:04.41 ID:ZCLGKOho
ping -n 4 -w 1000 0
743デフォルトの名無しさん:2014/09/08(月) 03:45:12.19 ID:mzCBiPNi
文字列の置換方法について教えてください。
やりたいことのイメージはこんな感じです。

SET P="X:\data\*.dat"
FOR %%N IN (1 3 5 7) DO CALL :FUNC %%N
EXIT /b

:FUNC
SET F=%P:*=%1%
ECHO %F%
EXIT /b

P に含めておいた * を置換して、データファイルのパス F を作り出す処理ですが、問題は
 1. どうやら置換前の文字列として * はそのままでは指定できない
 2. 置換後の文字列として変数を使うための書き方がわからない
です。

1 の問題は解決策が無いなら * ではない文字を使うことで回避しますが、2 の問題は解決できないと困ります。
ためしに置換文字は XXX にした上でこんな感じにしたところ

SET TMP=SET F=%%P:XXX=%1%%
%TMP%
ECHO %F%

%1 が 3 の例では TMP は SET F=%P:XXX=3% になりますが F は %P:XXX=3% になり、欲しい値である X:\data\3.dat は得られませんでした。

解決策はあるでしょうか?
744デフォルトの名無しさん:2014/09/08(月) 04:26:56.39 ID:lMytNnlx
>>743
SET "P=X:\data\*.dat"
FOR %%N IN (1 3 5 7) DO CALL :FUNC "%%N"
EXIT /b

:FUNC
CALL SET "F=%%P:\*=\%~1%%"
ECHO %F%
EXIT /b
745743:2014/09/08(月) 11:49:15.60 ID:mzCBiPNi
>>744
すばらしい!
SET を CALL でやるとか、そんなことできたんですね。
* も \ でエスケープできるんですね。
実はそれは試した気がするんですが、その時はまた別の問題で動かなかったのだと思います。
大変勉強になりました。ありがとうございます。
746743:2014/09/08(月) 12:06:19.31 ID:mzCBiPNi
たびたびすみません
>* も \ でエスケープできるんですね。

エスケープしてるわけじゃなく \* という文字列にマッチさせたんですね。
747デフォルトの名無しさん:2014/09/15(月) 05:25:26.21 ID:xvxXq9UP
Win7 64bit環境でやたらと
>このコマンドを実行するのに十分な記憶域がありません。
というメッセージが出るんだけどどういう理由で出るんだろうか
指示したコマンドはすべて正常に実行されてバッチ終了時に出てるっぽい

やってることはこの程度で複雑な再帰的な呼び出ししてリソースが足りなくなるようなこともしてないんだけど
dir xxx > index.txt
start myapp index.txt
748デフォルトの名無しさん:2014/09/15(月) 06:48:36.06 ID:lRy+d+xy
>>747
ぽい、じゃなくてせめて特定しろよ
749デフォルトの名無しさん:2014/09/15(月) 19:07:07.76 ID:YYlxE9nY
startに2つ引数渡すと、1つ目はタイトルバー文字列であって実行コマンドじゃないんだけど、そこは考慮しとるか?
750デフォルトの名無しさん:2014/09/16(火) 01:59:34.14 ID:c+NwjENR
>>749
startでは、""で括ってない文字列はタイトルとは見做さないし
もしmyappが実際には""で括ったパスだったとしても
.txtに関連付けられたテキストエディタが起動するだけのことじゃない?
myappが何者か知らんけどね
751デフォルトの名無しさん:2014/09/17(水) 19:26:04.43 ID:IyzZKIxY
A,1,DATA
B,2,DATA
B,3,DATA
B,4,DATA
B,5,DATA
C,6,DATA
C,7,DATA

上記のようなCSVからBを含む行を削除し、下記のように2列目の連番を振りなおしたいです。

A,1,DATA
C,2,DATA
C,3,DATA

DBソフトでやればいいのでしょうが、加工したファイルをFTPでサーバ転送まで行いたいので、1つのバッチファイルで書く方法はないでしょうか。
752デフォルトの名無しさん:2014/09/17(水) 19:35:07.67 ID:f/TEMlG2
findコマンドでBを含む行を削除して、
for /F "tokens=1,2* delims=,"でカンマ区切りのフィールド1とフィールド3以降を抽出して、
set /Aで生成した連番を付けて出力すれば良い

けど駄目文字とかもあるからCSVの内容次第によっては上手くいかない
加工はWSHとかPerlとかawkとか別のソフトで自動処理したほうが良いと思う
753デフォルトの名無しさん:2014/09/17(水) 22:01:06.18 ID:/eUJEkTQ
>>751
LogParser使うと楽
logparser -q:on -headers:off -headerRow:off -i:csv -o:csv "select field1, sequence(1), field3 from hoge.csv where field1 <> 'B'"
754デフォルトの名無しさん:2014/09/18(木) 03:07:03.87 ID:mrfrjYJ7
>>751
データが例題通りなら
for /f "tokens=1-4 delims=,[]" %0 in ('findstr /v /r /c:"^B," CSVファイル ^| find /v /n ""') do @echo;%1,%0,%3>>振りなおしたファイル
755デフォルトの名無しさん:2014/09/18(木) 07:47:53.33 ID:sZWThT0L
>>751
では俺はWSHを使った方法をば

@if (0)==(0) echo off
cscript.exe //nologo //e:jscript "%~f0"
goto :EOF
@end

var fs = new ActiveXObject('Scripting.FileSystemObject');
var rfile=fs.OpenTextFile('z:/old.csv', 1, true, 0);
var wfile=fs.OpenTextFile('z:/new.csv', 2, true, 0);
var index = 1;
var data = [];
while(!rfile.AtEndOfStream)
{
data=rfile.ReadLine().split(',');
if(data.length<3 || data[0]=='B') continue;
data[1]=index++;
wfile.WriteLine(data.join(','));
}
rfile.Close();
wfile.Close();
fs = null;
756デフォルトの名無しさん:2014/09/18(木) 14:02:21.24 ID:rT0APxd3
エディタでB始まり行を削除し、二項目でソート sort /+3
757デフォルトの名無しさん:2014/09/18(木) 15:37:07.01 ID:M6S1ZPsM
>>756
連番振り直しにならないしそれは多分違うと思う
758デフォルトの名無しさん:2014/09/18(木) 15:59:59.78 ID:vLADtqdv
>>757
そっか、ソートでなく番号付け直しだった
撤回
759751:2014/09/18(木) 21:08:15.87 ID:IKvy/bQU
皆さん、助言ありがとうございました。
おかげさまで、イメージしていた処理ができるようになりました。

>>754で書かれたものをベースでできました。

ただ、データが数万件あるファイルの処理なので、結構時間がかかります。
軽いファイルで、同様の処理があるので、これを活用していきたいと思います。
760デフォルトの名無しさん:2014/09/18(木) 21:52:18.43 ID:sZWThT0L
>>759
もう不要みたいだけど、数万件あるのならデータソースドライバ接続でSQLクエリした方が早いと思う
csvファイルと同じフォルダにSchema.iniを作成してから次のbatを起動
Schema.iniの中身
[old.csv]
ColNameHeader=False
Format=CSVDelimited
CharacterSet=OEM
Col1=id Text
Col2=index Long
Col3=contents Text
[new.csv]
ColNameHeader=False
Format=CSVDelimited
CharacterSet=OEM
Col1=id Text
Col2=index Long
Col3=contents Text
761デフォルトの名無しさん:2014/09/18(木) 21:53:46.14 ID:sZWThT0L
@if (0)==(0) echo off
type nul>z:\new.csv
cscript.exe //nologo //e:jscript "%~f0"
goto :EOF
@end

var USE_SRC_DRIVER_FOR_OUTPUT = 0; //=1でnew.csv出力もデータソースドライバを使う
var oldRec,newRec;
var index = 1;
var db = new ActiveXObject('ADODB.Connection');
db.Open("Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=z:/; ReadOnly=0");
oldRec = db.Execute("select * from old.csv where id <> 'B'");
if (USE_SRC_DRIVER_FOR_OUTPUT==1) { newRec = db.Execute('select * from new.csv');
} else {
var fs = new ActiveXObject('Scripting.FileSystemObject');
newRec=fs.OpenTextFile('z:/new.csv', 2, true, 0);
}
while(!oldRec.EOF) {
if (USE_SRC_DRIVER_FOR_OUTPUT==1) {
var strSQL = "insert into new.csv (id,index,contents) values(" +
"'"+oldRec.Fields('id')+"','"+(index++)+"','"+oldRec.Fields('contents')+"')";
db.Execute(strSQL);
} else { newRec.WriteLine([oldRec.Fields('id'),index++,oldRec.Fields('contents')].join(',')); }
oldRec.MoveNext;
}
oldRec.Close();
newRec.Close();
db.Close();
db=null;
fs=null;
762デフォルトの名無しさん:2014/10/05(日) 23:51:44.69 ID:zNTRptzw
バッチ内で、今日の曜日を知る方法がわからなかったので調べたが、
一発で得る方法は無いんですね。

年月日がわかると計算できるとわかったが面倒、曜日GETコマンドを追加してほしい。
昔のDOSだと出来たのに。
763デフォルトの名無しさん:2014/10/06(月) 01:39:32.46 ID:BYDBHNPS
>>762
@echo off
set week=
call :get_week
if not defined week echo 曜日が取得できません&goto :eof
echo %week%
goto :eof

:get_week
rem ****************************************************
rem * robocopyのメッセージから6行目にある(OSによっては別の行かも)
rem * Started : Mon Oct 06 01:10:09 2014
rem * の行を抽出し、曜日"mon"を環境変数weekにセットする
rem ****************************************************
for /f "skip=5 tokens=1,2 delims=: " %%i in ('robocopy') do if "%%i"=="Started" set week=%%j&goto :eof

===========================================
またWSHで曜日を求めることもできる
@if (0)==(0) echo off
cscript.exe //b //e:vbscript "%~f0"
set WEEK=SunMonTueWedThrFriSat
set /a w=%errorlevel% * 3
call echo %%WEEK:~%w%,3%%
goto :eof
@end
Wscript.Quit(WeekDay(Date))
764デフォルトの名無しさん:2014/10/06(月) 02:06:03.74 ID:BYDBHNPS
>>762
WSHの方を訂正
@if (0)==(0) echo off
cscript.exe //b //e:jscript "%~f0"
set WEEK=SunMonTueWedThuFriSat
call echo %%WEEK:~%errorlevel%,3%%
goto :eof
@end
WScript.Quit((new Date).getDay()*3);
765デフォルトの名無しさん:2014/10/06(月) 05:51:08.25 ID:xttTcZgk
>>762
echo %date:~12,1%
766デフォルトの名無しさん:2014/10/06(月) 20:17:14.38 ID:OxfxhYi7
>>762
その1

ここから抜粋&変形

バッチで日付関係の操作
http://homepage1.nifty.com/jak/batch/date.html

指定した日(本日)の曜日を表示する
@echo off
for /F "tokens=1" %%0 in ('date /t') do set today=%%0
set yy=%today:~0,4%
set /a mm=1%today:~5,2% - 100
set /a dd=1%today:~8,2% - 100
if %mm% LEQ 2 (set /a yy=yy-1&&set /a mm=mm+12)
set /a week=(yy + yy/4 - yy/100 + yy/400 + (13*mm+8)/5 + dd) %% 7
set day=日月火水木金土
call set yobi=%%day:~%week%,1%%

月曜なら
week=1
yobi=月
767デフォルトの名無しさん:2014/10/06(月) 20:18:10.98 ID:OxfxhYi7
>>762
その2

http://sourceforge.net/projects/unxutils//download
UnxUtils.zip に含まれる「date.exe」を使用

カレントディレクトリに置いて「date」と入力しても
内部コマンドの「date」が呼び出されるので
「date.exe」と入力するか「gnudate.exe」等にリネームしてから使用

1日前のmmdd
gnudate +"%m%d" -d "1 days ago"

当日の曜日:0(日曜)〜6(土曜)
gnudate +"%w"

1日後のyymmdd
gnudate +"%y%m%d" -d "1 days"

バッチ組み込む場合は、%を付加

コマンドライン
gnudate +"%w"

バッチ
gnudate +"%%w"
768デフォルトの名無しさん:2014/10/07(火) 01:25:17.83 ID:7+b6LNQ5
>>763-769
ありがとうございます。
ぐぐったら、いろんなやりかたがありましたので、
コピーしてバッチを作り使っています。(パクリ) で >>766さんとほぼ同じ。

date.exeはあると便利そうですね。
769デフォルトの名無しさん:2014/10/08(水) 04:17:28.70 ID:UoQC8Akv
4年前のスレの時に作った
ISO 8601 の週とか、曜日とかのバッチを貼ってみる

@echo off &amp; setlocal enabledelayedexpansion
set /a y2=%1, m2=%2, d2=%3, y1=y2, y3=y2+1
set a=月火水木金土日&amp; call :x 1582 10 15 w0 a0 b0
:y
call :x y1 1 4 w1 a1 b1
call :x y2 m2 d2 w2 a2 b2 &amp; set /a w=w2-w1+1, b=b2-b0
call :x y3 1 4 w3 a3 b3
if %w%==0 set /a y1-=1 &amp; goto y
if %w2%==%w3% set /a y1=y3, w=1
echo %1年%2月%3日は、%y1%年の第%w%週目(!a:~%a2%,1!曜日)
echo 1582年10月15日から%b%日後
pause > nul &amp; goto :eof
:x
set /a m=%2+%1*12-3+480000, d=%3+m/48-m/1200+m/4800
set /a d+=m*31-(m+10)/12-(m+8)/12-(m+5)/12-(m+3)/12-m/12*3-6
set /a %4=d/7, %5=d%%7, %6=d
770デフォルトの名無しさん:2014/10/08(水) 04:23:49.70 ID:UoQC8Akv
>>769 文字化けした

@echo off & setlocal enabledelayedexpansion
set /a y2=%1, m2=%2, d2=%3, y1=y2, y3=y2+1
set a=月火水木金土日& call :x 1582 10 15 w0 a0 b0
:y
call :x y1 1 4 w1 a1 b1
call :x y2 m2 d2 w2 a2 b2 & set /a w=w2-w1+1, b=b2-b0
call :x y3 1 4 w3 a3 b3
if %w%==0 set /a y1-=1 & goto y
if %w2%==%w3% set /a y1=y3, w=1
echo %1年%2月%3日は、%y1%年の第%w%週目(!a:~%a2%,1!曜日)
echo 1582年10月15日から%b%日後
pause > nul & goto :eof
:x
set /a m=%2+%1*12-3+480000, d=%3+m/48-m/1200+m/4800
set /a d+=m*31-(m+10)/12-(m+8)/12-(m+5)/12-(m+3)/12-m/12*3-6
set /a %4=d/7, %5=d%%7, %6=d
771デフォルトの名無しさん:2014/10/08(水) 04:49:28.50 ID:JeGGtqCf
>>715
SET os1=不明
VER|FIND "Windows">NUL
IF NOT ERRORLEVEL 1 SET os1=Vista以降
VER|FIND "Windows 95">NUL
IF NOT ERRORLEVEL 1 SET os1=95
VER|FIND "Windows 98">NUL
IF NOT ERRORLEVEL 1 SET os1=98
VER|FIND "Windows Millennium">NUL
IF NOT ERRORLEVEL 1 SET os1=Me
VER|FIND "Windows NT">NUL
IF NOT ERRORLEVEL 1 SET os1=NT
VER|FIND "Windows 2000">NUL
IF NOT ERRORLEVEL 1 SET os1=2000
VER|FIND "Windows XP">NUL
IF NOT ERRORLEVEL 1 SET os1=XP
VER|FIND "Windows [Version 5.2.">NUL
IF NOT ERRORLEVEL 1 SET os1=Server2003
IF NOT "%os1%"=="Vista以降" ECHO 【ERROR】このPCのOSはWindows Vista以降ではありません!
772デフォルトの名無しさん:2014/10/13(月) 19:03:27.34 ID:Sxb1My8w
xcopyの/vオプションってデータを読み取れる形式になってるか確認するだけで
ハッシュ確認とかはしてないの?
http://www.vor.jp/winmemo.htmlここ見るとあまり信用できないみたいな感じの事書いてあるけど

windows7環境でxcopy /?でヘルプを見ると
>/V コピー先の各ファイルのサイズを検証します。
と書いてあるけど
773デフォルトの名無しさん:2014/10/13(月) 22:26:19.21 ID:fGTkDBdq
ファイルサイズが一致するか確認するだけで、
ファイル内容の完全一致を検証したりハッシュ確認したりはしないってことでしょ。
774デフォルトの名無しさん:2014/10/13(月) 22:31:27.06 ID:Sxb1My8w
じゃあビットエラーやライト・リードエラー起こりえるって事だよね?
そっかー・・・ありがと
775デフォルトの名無しさん:2014/10/14(火) 08:01:58.57 ID:xX880Orc
>>772
/vオプションなんかに頼らず、
fc /bでバイナリ比較するのが確実
776デフォルトの名無しさん:2014/10/14(火) 15:08:17.21 ID:GsQr0uZE
>>774
そんな心配は不要だろ
HDDやDVDやメモリカードならCRCエラー訂正ぐらいはやってるだろうし、
そもそもHDDのファイルが信用できなきゃ、OSのEXEファイル自体の動作を心配しなきゃならなくなるぞ
777デフォルトの名無しさん:2014/10/14(火) 15:16:42.81 ID:OfBdBdCX
いやデータ化けるよ
一例だけど
http://anago.2ch.net/test/read.cgi/jisaku/1397230889/344
778デフォルトの名無しさん:2014/10/14(火) 15:23:32.38 ID:GsQr0uZE
>>777
じゃあ心配して、毎回チェックすりゃいいさ
そのチェックプログラムももしかしたら壊れてるかもしれんからチェックする前に
チェックプログラムもチェックしなきゃな
779デフォルトの名無しさん:2014/10/14(火) 15:50:57.79 ID:OfBdBdCX
「じゃあ」って会話成り立ってなくね・・・?
780デフォルトの名無しさん:2014/10/14(火) 15:55:47.13 ID:GsQr0uZE
>>777
もしファイルが1コでも壊れてたならそのHDDは廃棄したほうがいいよ
数十万個もあるファイルの中でどのファイルも信用できなくなるから
781デフォルトの名無しさん:2014/10/14(火) 17:54:51.45 ID:KrwLefD2
ID:GsQr0uZE
ガキかよ w
782デフォルトの名無しさん:2014/10/20(月) 11:31:06.84 ID:/QCZ146H
今知った情弱だけど
ドス窓でもlsやcpってあるんだね
dirよりlsの方がいいわ
783デフォルトの名無しさん:2014/10/20(月) 13:00:44.70 ID:3N7ImT1k
無いよ。
msysとかgitとか自分で入れたんじゃ?
784デフォルトの名無しさん:2014/10/20(月) 13:12:52.90 ID:Piwo04XB
あぁ本当だ
環境変数確認してみたら、過去の自分がmsys\binのパス通してたみたい
勘違いごめん・・・
785デフォルトの名無しさん:2014/10/20(月) 20:14:35.56 ID:dmAxhR4K
Microsoftさまの
Microsoft Windows Services for UNIX か Subsystem for UNIX-based Applications + パッケージ
の話をしてたのかと思ったら違った
786デフォルトの名無しさん:2014/10/20(月) 23:37:51.04 ID:DQouY8WZ
>>785
それってbashのShellshock脆弱性のパッチは出てるの?
787デフォルトの名無しさん:2014/10/21(火) 01:00:34.39 ID:c8NUu7RB
>>786
ttp://www.atmarkit.co.jp/fwin2k/productreview/sfu30/sfu30_05.html
ttp://www.atmarkit.co.jp/fwin2k/win2ktips/1369suatools/suatools.html
> bashはSFU 3.0では提供されない
> bashコマンドなどは含まれていない
そもそもbashは入らない。自分でいれたbashのバージョンの面倒くらい自分でみろ。
つかWindowsではその脆弱性があっても影響受ける奴なんて滅多に居ねぇ気がするが…
788デフォルトの名無しさん:2014/10/21(火) 13:40:31.50 ID:S84tBIG3
おお
batのスレなんてあったのか

ffmpegを起動するbatファイルを書いてたのですがffmpegに渡す引数の加工に
独自のコマンドアプリで処理させてその独自コマンドアプリのはいた文字列を
ffmpegの引数とする場合どのようにbatファイルを書けばいいのでしょうか?
789デフォルトの名無しさん:2014/10/21(火) 13:42:53.21 ID:2H0YuUZz
ファイルに出力するなり、forで受け取るなり
790デフォルトの名無しさん:2014/10/21(火) 13:47:58.34 ID:S84tBIG3
サンプルコードなどいただけるとありがたいのですが・・・

@echo off
ffmpeg %1
exit

とかbatそのものの引数の格納されている変数?は理解してるのですが
独自コマンドアプリをhogehogeとした場合

@echo off
hogehoge %1
ffmpeg ???
exit

この連携の記述がよくわかりません・・・
791デフォルトの名無しさん:2014/10/21(火) 13:58:47.05 ID:PndivJJV
hogehogeで出力されるファイル名を、%1の最後に付け加えて
ffmpegのところに付け加えて渡すとかは


hogehoge %1
ffmpeg "%~dpn1_hogehoge-output.拡張子" ・・・
792デフォルトの名無しさん:2014/10/21(火) 14:09:01.52 ID:S84tBIG3
@echo off
hogehoge %1
ffmpeg ???
exit

この場合の
hogehoge %1

%1はhogehogeに対する入力とすると出力もこれに返ってくるの?
793デフォルトの名無しさん:2014/10/21(火) 14:11:30.04 ID:S84tBIG3
hogehoge %1 | ffmpeg

もしかしてこれでいいのかな?
794デフォルトの名無しさん:2014/10/21(火) 14:29:59.30 ID:PndivJJV
exitやめてpauseにして
一度どんな風に渡されているのか見てみたらいい
795デフォルトの名無しさん:2014/10/21(火) 14:35:09.24 ID:S84tBIG3
わかりました
いろいろヒントいただいたおかげで検索ワードがいろいろ追加できたので
今まで探しきれなかった情報にたどりつけそうです

ちょっと自力でやってみてまたつまったらこちらにお邪魔します

>>789>>791ありがとうございました
796デフォルトの名無しさん:2014/10/21(火) 22:34:08.95 ID:rPngFVY9
フォルダを削除した直後に同名のフォルダを新規に作成しようとすると「アクセスが拒否されました」と表示されて作成できないことがあります。

コマンドは終了していても、フォルダの削除は完了していなくて作成できていないような動きなのですが、そんなことあり得るのでしょうか?
797デフォルトの名無しさん:2014/10/22(水) 02:01:18.93 ID:ZQ5GB3JT
素直にスクリプト用の言語使え何かと捗る>>795
798デフォルトの名無しさん:2014/10/22(水) 20:48:08.90 ID:RtNwyOkD
>>796
あり得ます。
799デフォルトの名無しさん:2014/10/26(日) 01:47:43.27 ID:hoJdkFAv
今知ったけどM$がコマンドでハッシュ計算用のソフト公開してるね
fcivってやつ
800デフォルトの名無しさん:2014/10/26(日) 04:02:18.84 ID:fx3FFnF6
>>799
それ使ってバッチファイル書いたことあるけど、出力をバッチで取り扱うのが面倒だった上に、
Unicodeパス非対応、挙句マルチバイト文字の扱いにバグがあってすごく駄目駄目だった。
isupper(*(signed char*)str)でマイナス文字領域を参照しちゃう系のバグだったかな、
デベハトップ系よりもタチが悪くて、2バイト文字の先行バイトすら化けるという有り様だよ。

今は直ってるかなーと思ったが2004年からバージョンアップしてないんすね、駄目だこりゃ。
801デフォルトの名無しさん:2014/10/26(日) 13:36:26.66 ID:RNavWr6/
Win7のシャットダウンコマンドでXPみたいなカウントダウンしてる画面って出せない?
コメントなら出るし2分前になればダイアログ出るけど・・・
802デフォルトの名無しさん:2014/10/26(日) 19:16:07.11 ID:nC00iuOZ
>>800
そーだったのか。
Windows8のダウンロード版が一致するかチェックするのに便利だったが。
803デフォルトの名無しさん:2014/10/26(日) 19:34:43.95 ID:dzHjPHpI
>>802
ダメ出しできる俺スゲー君でしょ
便利に使えばいいだけ
不具合あるなら自分で作ってもそんなに大変じゃないし
804デフォルトの名無しさん:2014/10/26(日) 20:12:30.67 ID:fx3FFnF6
>>802
不特定ファイル名を受け入れる用途やバッチファイルでは駄目だけど、
ファイル名の取り扱いとかでバグ踏まない用途なら別に問題ないよ。
>>803
バッチファイル書いてからバグに気がつくよりマシだと思って情報出しただけなんだけどなぁ…
というかハッシュ計算機を自分で作るって、ライブラリに頼らず書くのは結構な手間だろ何言ってん?
805デフォルトの名無しさん:2014/10/26(日) 20:14:50.47 ID:RaZwtAdW
PsShutdown
806デフォルトの名無しさん:2014/10/26(日) 21:22:33.11 ID:dzHjPHpI
>>804
> バッチファイル書いてからバグに気がつくよりマシだと思って情報出しただけなんだけどなぁ…

自分で >>800 のレス読んでそんな風に思える?

> というかハッシュ計算機を自分で作るって、ライブラリに頼らず書くのは結構な手間だろ何言ってん?

アルゴリズム考えるとかならいざ知らず、実装だけならたいしたことないよ。
例えば MD5 で、この程度。
http://en.m.wikipedia.org/wiki/MD5
807デフォルトの名無しさん:2014/10/26(日) 21:29:11.59 ID:NwSJFL0J
俺スゲー君とか言っちゃう君
808デフォルトの名無しさん:2014/10/26(日) 21:42:07.29 ID:nC00iuOZ
すいません俺が誘導したからかも

ttp://kanae.2ch.net/test/read.cgi/gameurawaza/1413584805/971+976+979+982
809デフォルトの名無しさん:2014/10/26(日) 22:06:13.49 ID:ICsbUc5p
>>807
お前、最低だな
810デフォルトの名無しさん:2014/10/26(日) 22:10:20.56 ID:fx3FFnF6
>>806
うん、「今後も、特にバッチファイルで使うなら別のハッシュ計算ソフト探すべきだな」と思えるよ。
: 実際にはnode.jsのコアライブラリに丸投げしたけど。コールバックまみれでダルかった

しかしライブラリ使うに決まってるって言われるかと思ったら実装が楽って返事が来るとはなぁ…
大したことがないのならバッチファイルで実装してみてくれとか無茶振りしてみても良いかい?
811デフォルトの名無しさん:2014/10/26(日) 22:27:19.67 ID:ICsbUc5p
>>810
> うん、「今後も、特にバッチファイルで使うなら別のハッシュ計算ソフト探すべきだな」と思えるよ。

なら、そう書けばいいだけ。

> 大したことがないのならバッチファイルで実装してみてくれとか無茶振りしてみても良いかい?

リンク先読んだか?
C でも数十行だから、たいしたことないだろ?
バッチファイルではバイナリと配列が扱えないので、面倒。
812デフォルトの名無しさん:2014/10/26(日) 22:29:05.55 ID:KYTvr3GZ
もしもしのソースはいつもwikipedia(笑)
813デフォルトの名無しさん:2014/10/26(日) 23:34:43.51 ID:fx3FFnF6
>>811
ここはバッチファイルスレだって分かってるのかね、君。
「結局node.jsで自作(但し丸投げ)した」ってボケにも気づいてないようだし…もう少し余裕を持ちたまえ。
814デフォルトの名無しさん:2014/10/26(日) 23:49:34.01 ID:IWXHWYqd
.NET 4.5でようやく、MD5が追加されたのでは?
815デフォルトの名無しさん:2014/10/26(日) 23:51:05.93 ID:9AUTkNpp
今、困っていること
call で複数階層の呼び出しをした場合、
エラーで以後を中断し、一気に元に帰る方法がわからない。

exit /B だと次々に判定をしないと戻れないし、
exit だと DOSプロンプト自体が消えてしまう。
816デフォルトの名無しさん:2014/10/26(日) 23:57:41.58 ID:KYTvr3GZ
エラーのときにフラグセットして各ルーチンでそれ観察すれば
817デフォルトの名無しさん:2014/10/27(月) 00:23:38.36 ID:zpmVa3Ig
>>815
callじゃなくてcmd.exeを呼んでおけばexitで戻れる。それが嫌なら>>816
818デフォルトの名無しさん:2014/10/27(月) 01:14:29.68 ID:vMuLOlfx
>>816
>>817
ありがとうございます。

cmd.exeか、なるほどなー
819デフォルトの名無しさん:2014/10/27(月) 02:45:30.73 ID:os0cynVo
mingwにopenssl sha1コマンド入ってた
ただ表示するだけだけど
820デフォルトの名無しさん:2014/10/27(月) 02:47:04.59 ID:os0cynVo
MSYSだったw
821デフォルトの名無しさん:2014/10/27(月) 05:11:17.57 ID:iE0BQBfx
>>813
何を言いたいのかさっぱりわからんが、悔しさは伝わったよ w
822デフォルトの名無しさん:2014/10/27(月) 05:48:58.48 ID:zpmVa3Ig
>>821
何を言いたいのかさっぱりわからんが、悔しさは伝わったよw
823デフォルトの名無しさん:2014/10/27(月) 05:54:06.73 ID:xZ3TAadP
>>812
ID:fx3FFnF6 と同じで、ダメ出ししかできない奴乙
使えるものは便利に使えばいいじゃん

まあ、
> exit /B だと次々に判定をしないと戻れないし、
と書いてるのに、
> エラーのときにフラグセットして各ルーチンでそれ観察すれば
とか、書いちゃう人だし w
824デフォルトの名無しさん:2014/10/27(月) 05:56:08.53 ID:iE0BQBfx
>>822
良かったな w
825デフォルトの名無しさん:2014/10/27(月) 10:41:19.76 ID:G9UeKJLQ
自己紹介乙(笑)
826デフォルトの名無しさん:2014/10/27(月) 12:37:15.39 ID:h7Lo5JhP
涙ふけよ
827デフォルトの名無しさん:2014/10/27(月) 15:04:47.97 ID:tc+ZTYEM
ファイル名の取り扱いにバグがあるなら標準入力から突っ込めばモーマンタイ
WindowsならCryptAPIにハッシュ関数は一通りそろってるからラクショー
828デフォルトの名無しさん:2014/10/27(月) 19:40:15.14 ID:vmmZ1w6v
コード書こうよ
スラドより酷え・・・
829デフォルトの名無しさん:2014/10/27(月) 20:21:57.22 ID:UF6Jw/hL
>>827
改造板に帰って来いよ。誰もいなくなっちゃったんだよ。
830デフォルトの名無しさん:2014/10/27(月) 23:08:21.57 ID:c91aEmZZ
2週間に一度とか3週間に一度とかに実行させるサンプルどっかに無いでしょうか?
バッチファイルを実行してから、実行すべきかどうか判断して
実行するしないに分岐するようなのが欲しいのですが、自分ではどうにもうまいこと
思いつかず、サンプルを探してみたのですがどうにも見つけられず…。
実行した日を別ファイルにして書き出すと管理が面倒なことになるので、
曜日と日付をみてなんとかできないものかと考えたものの頓挫しました。
831デフォルトの名無しさん:2014/10/28(火) 02:16:00.84 ID:E6RWW6Yr
>>830
自分のPCだけならスケジューラにbatを登録すればいい
(実行にユーザ名とパスワードが必要なため)
スケジューラに登録するbatも簡単に書ける
832デフォルトの名無しさん:2014/10/28(火) 02:37:50.58 ID:TKGNZfF+
俺なら特定のファイルキープしておいて一定以上新しいなら実行しないようにする
833デフォルトの名無しさん:2014/10/28(火) 02:46:35.27 ID:E6RWW6Yr
>>832
日付で何日何週間先とか後とかを比較するには、
基準となる日を決めて、本日とファイル日付を基準からの日数を求めて差
求めるということをしないといけない
確かにそんなに難しいことではないが、batに不慣れだとまず実現できないだろう
834デフォルトの名無しさん:2014/10/28(火) 03:44:00.38 ID:IUrAseGh
$ forfiles /D -14 /M *.bat /C "cmd /c echo [last modified : @fdate] : @path"
835デフォルトの名無しさん:2014/10/28(火) 04:52:42.02 ID:mh0S7TxZ
>>827
fcivは標準入力を読むように出来てないでしょうに
836デフォルトの名無しさん:2014/10/28(火) 09:19:12.06 ID:sCh7b/xh
現在のプロンプトのタイトルを取得する方法を探しています、何かいい方法ありますか?

やりたい事は下記のような事で
Call元はバッチや場所が不定で変数の引き回し不可
:Main側に戻った時の更新以外の方法を探しています。



:Main
Call :Sub
Exit /b

:Sub
GetTitle的な何か MainTitle
Title %SubTitle% 進捗...
Title %MainTitle%
Exit /b
837830:2014/10/28(火) 22:06:59.72 ID:+z/Rv312
>>831-834
様々なヒントをありがとうございます。
処理するディレクトリ毎に目印ファイルを forfiles で判定させる、な感じで目処が立ちました。


あらためて読み直すと自分のレス >>830 何かおかしいな。
『曜日』が肝なので「2週間に一度とか3週間に一度」というより「隔週の金曜日とか3週毎の月曜日」だし、
「頓挫」じゃなくて「挫折」だし…
838デフォルトの名無しさん:2014/10/29(水) 01:03:14.85 ID:QREYhhOY
>>836
こちらを参考にされては如何でしょうか。

バッチファイルでコンソールウィンドウのタイトルを取得する。
http://scripting.cocolog-nifty.com/blog/2009/01/post-22fe.html
839Mail:sagete テスト 転載ダメ©2ch.net:2014/10/29(水) 19:24:00.56 ID:06hl2t+T
>>838
情報ありがとうございます
Win7環境で試してみましたが、取得に至りませんでした。

教えて頂いたページでは Title で変更した場合でも現在のウィンドウタイトルが取得できる前提のようですが
当方では Start "NewTitle" ... など名前を指定して立ち上げたウィンドウのタイトルしか取得できないようです。
840デフォルトの名無しさん:2014/10/29(水) 20:02:22.27 ID:06hl2t+T
すみません、1コマンドずつ分けてテストしなおしたらタイトル取得できるようなので
もう一度自分で全部書き直してやってみます、失礼しました
841デフォルトの名無しさん:2014/10/29(水) 22:17:40.80 ID:l7NTsp1b
>>840
LFコードを環境変数に入れるところで一行少ないため
文字列の先頭に余計なものがつき、全体に2つずつずれてるので
%2->%4 %9->%11
だけど、改行を一行挿入するだけの方が良い
842デフォルトの名無しさん:2014/10/30(木) 13:11:29.14 ID:jkHBLx1J
ckwとnyaosを使い分けたいんですが
ckw.cfg下記のように、コメント分にしようと思ったんですがうまくいきません

//Ckw*title: ckw[cmd]
//Ckw*exec: cmd.exe
//Ckw*chdir: c:\
どうすればいいですか?
843デフォルトの名無しさん:2014/11/11(火) 21:35:55.04 ID:S0cv/9qS
コマンドでフォント変更って可能でしょうか
utf-8使用時にショートカットのフォント変更を行わずバッチ側で済ませたいのです
844デフォルトの名無しさん:2014/11/11(火) 21:55:19.19 ID:S0cv/9qS
デフォルトの
ラスタフォントからMSゴシックに変更したいと考えています。
宜しくお願いいたします。
845デフォルトの名無しさん:2014/11/12(水) 00:43:18.12 ID:IagLMQCH
>>843>>844
・regコマンドなどでコンソール用のレジストリ定義を変更して、それに合致するコンソールを開くようなバッチを書く
・WSHなどで自身のコンソールのGUIを自動操作してフォント設定の部分を操作するようなスクリプトを書く
846デフォルトの名無しさん:2014/11/12(水) 00:48:36.21 ID:TfuExqnw
コマンドプロンプトの表示フォントを変えたいってこと?
「ファイル名を指定して実行」でcmdで起動して、
ウィンドウ左上のアイコンをクリック→プロパティ→フォントタブで変えれば、
次回から勝手に変わるんじゃないっけ。
847デフォルトの名無しさん:2014/11/12(水) 04:48:11.36 ID:XVH80VNh
コマンドプロンプトでUTF-8を表示させたり出来たっけ?
848デフォルトの名無しさん:2014/11/12(水) 07:24:51.04 ID:ZQOXX5UM
echo UTF-8
849デフォルトの名無しさん:2014/11/12(水) 07:30:55.45 ID:bmz8bGaM
>>847
code pageの話じゃね?
chcp 65001
850デフォルトの名無しさん:2014/11/12(水) 12:50:20.44 ID:SgzYB1N4
>>849
なんかフォントの指定がうまくできない
851デフォルトの名無しさん:2014/11/12(水) 12:57:06.08 ID:bmz8bGaM
>>850
へ?フォントの指定は >>845 が答えてくれてるじゃん。
852デフォルトの名無しさん:2014/11/12(水) 16:35:38.77 ID:IagLMQCH
Unicode文字を取り扱うという話なら、cmd.exe /UとかWriteConsoleWを使った文字出力で取り扱える。
WriteConsoleWに頼るのが一番安定しててUnicode文字もほぼ問題なく取り扱えるけどchcpはダメだ。
chcpが使えるケースもあるけどバグや癖が強すぎてどーにもならん。
全角文字での文字幅計算はほぼ完全にダメ。良くて半角トーフか描画だけ全角で位置ズレする。
コンソールでのファイル名入力
 @ XP+ラスタフォント→文字が正しくマップされず別の半角文字を表示して文字化け
 @ XP+TTFフォント→半角トーフに、後でラスタに変えるとASCII文字を巻き添えにして画面バッファ破損
 @ 8.1+ラスタフォント→マップ出来ない文字は無かったものとして表示されない
 @ 8.1+TTFフォント→半角トーフに、後でラスタに変えると表示されるが、全角分表示だけズレて行末は消滅
typeコマンドでの出力
 @ XP+ラスタフォント→上の結果に加え追加で位置ズレや行消滅も
 @ XP+TTFフォント→先程の結果に同じ
 @ 8.1+ラスタフォント→全角文字は別の半角2文字の組みに。後続のASCII文字は半角スペースと組になるなど無茶苦茶
 @ 8.1+TTFフォント→先程の結果に同じ
WriteConsoleA(UTF-8)
 @ XP+ラスタフォント→1バイトごとに別の半角文字を表示して文字化け
 @ XP+TTFフォント→先程の結果に同じ
 @ 8.1+ラスタフォント→XP+ラスタフォントの結果に同じ
 @ 8.1+TTFフォント→先程の結果に同じ
WriteConsoleW(UTF-16)
 @ XP+ラスタフォント→1文字ごとに別の半角文字を表示して文字化け
 @ XP+TTFフォント→先程の結果に同じ
 @ 8.1+ラスタフォント→コンソールでのファイル名入力の結果に同じ
 @ 8.1+TTFフォント→先程の結果に同じ
トーフはフォントリンクで解決できるかもしれんが、幅はどうやっても狂うだろうしダメだと思う。

>>851
chcpするとラスタフォントが別のに代わる。その状態でもフォント指定は効くから問題ない…
かとおもいきや、chcpのクソ仕様により文字が化けたりトーフになったり幅が狂ったり散々。
853デフォルトの名無しさん:2014/11/12(水) 21:34:27.06 ID:XVH80VNh
>>852
WriteConsoleWってWin32APIを使って自作したってこと?
それとも何かそれを使う方法があるのならその方法を教えて欲しい

コードページでDBCSをサポートしているのは
932 (Japanese Shift-JIS)
936 (Simplified Chinese GBK)
949 (Korean)
950 (Traditional Chinese Big5)
の4つだけみたいだね
854デフォルトの名無しさん:2014/11/12(水) 22:33:49.24 ID:bmz8bGaM
>>852
そうなんだ。テキトー言ってすまん(m´・ω・`)m >>850
855デフォルトの名無しさん:2014/11/13(木) 17:27:02.80 ID:Y365RfYc
>>853
「WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE),"\xE2\x98\xA3",3,0,0);」
とか「WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),"\x23\x26\0",1,0,0);」
ってmainに書いただけだけですが一応自作、かな。TCC(超軽量Cコンパイラ)は便利。

WSHとかcmd.exeの内部コマンドとかはコンソールへの出力時は地味にこの手のAPIでUnicode使ってるけど、
基本的に対応してるコマンドのみの対応だからパイプとか使うとすぐに残念な結果になるんだよなぁ……
パイプでReadFile/WriteFileしてUTF-8/16変換してReadConsoleW/WriteConsoleWするツールがあると捗るんかな?

>>854
chcpがテキトーなのがいけないんだよ、君は悪くない。
856デフォルトの名無しさん:2014/11/14(金) 03:39:01.31 ID:ptj087p2
結局質問者のUTF-8使用時に色を変えたいってのは
どういう意味だったん?
857デフォルトの名無しさん:2014/11/14(金) 04:30:19.38 ID:1+T9Ha44
色に関する質問ってどれだ?
858デフォルトの名無しさん:2014/11/14(金) 05:37:24.74 ID:ptj087p2
フォントを先に変えておいて、chcp 65001で
typeコマンドでutf-8ファイルを表示することは出来るけど
クリップボード経由で貼り付けると表示が崩れるし、
IMEも起動出来ないのはまあ良いとして、
batが動かないのはどうしてだろう?
859デフォルトの名無しさん:2014/11/14(金) 12:47:50.79 ID:eiUQB9Ml
>>858
BOM 入ってね?
860デフォルトの名無しさん:2014/11/14(金) 13:47:40.71 ID:ptj087p2
>>859
bat自体はSJISなのでBOMは当然なしです

XPだとchcp65001の間は,batファイルが読めないみたい
ただし、bat中でchcp65001とchcp932の間に命令を挟んで全体を()で括ってやれば
コマンドインタープリタが1行で読み込むので実行することはできるが
XPではchcpでclsされるのでpauseとかで止めないと表示が見えない
またbatファイルもSJIS以外はダメなので、UTF16やUTF8で作れない
cmd/u環境でもbatはSJISじゃないとダメだった

Vista以降(多分)で上記のようなバグは修正されている模様

で、結局はUTF8を扱うのはWSHに頼るのが良いという結論に達した
ただし、WSHでUTF16やUTF8ファイルを読み込むにはBOM付きじゃないといけない
WSHはUTF16で動作しているのでUNICODEにのみある文字もコンソール表示可能
でも標準入出力やパイプやパラメタでのデータ渡しでUNICODE文字は?に変換される

次に、WSHのサンプルをあげとく
861デフォルトの名無しさん:2014/11/14(金) 13:58:33.90 ID:ptj087p2
@if (0)==(0) echo off
rem for /f %%i in ('cscript //nologo //e:jscript "%~f0" "read" "utf8.txt"') do echo.%%i
cscript //nologo //e:jscript "%~f0" "read" "utf8.txt"
type "utf16.txt"|cscript //nologo //e:jscript "%~f0" "write" "xxx.txt"
echo 追加データだよ|cscript //nologo //e:jscript "%~f0" "append" "xxx.txt"
goto :eof
@end

var args=WScript.Arguments;
if(args.length<2) WScript.Quit(-1);
var cmd=args(0), filename=args(1);s='';
switch(cmd) {
case 'read':
var strm = new ActiveXObject("ADODB.Stream");
strm.Type=2; strm.Charset="utf-8";
strm.Open(); strm.LoadFromFile(filename); s=strm.ReadText();
WScript.Echo(s);
break;
case 'append':
case 'write':
var strm = new ActiveXObject("ADODB.Stream");
strm.Type=2; strm.Charset='utf-8'; strm.LineSeparator=10; //-1:CDLF 13:CR 10:LF
strm.Open();
if(cmd=='append') {strm.LoadFromFile(filename);strm.Position=strm.size;}
while (!WScript.StdIn.AtEndOfLine) strm.WriteText(WScript.StdIn.ReadLine(),1);
strm.SaveToFile(filename , 2);
}
strm.Close();
strm=null;
WScript.Quit(0);
862デフォルトの名無しさん:2014/11/15(土) 23:15:58.49 ID:teKkhWvu
tar.gzの中にMakefileが入ってるか調べるコマンドありますか?
863デフォルトの名無しさん:2014/11/16(日) 02:03:07.59 ID:04wQ79vu
Unix/Linux系のコマンドアプリや、Cygwinなどを導入する気があるなら
tar ztf ファイル名.tar.gz | grep Makefile
みたいな感じになるんだろうと思うが
標準的なコマンドセットでどうにかしようと思うと苦しいかもなあ…
864デフォルトの名無しさん:2014/11/18(火) 11:45:58.55 ID:A18MHYQa
確かにwshで作れないことはないけど...ってレベルの話だね
そんなの今更作る気もしないぞ
865デフォルトの名無しさん:2014/11/22(土) 09:59:14.41 ID:Dw16glaS
あざっす
諦めてUNIX使うおw
866デフォルトの名無しさん:2014/11/29(土) 02:15:50.80 ID:Xuh6T+Vi
DOS画面をファイルに書き出すバッチはどうやればできますか。
手動だと全部選択してコピーしエディタでペーストするでできます。
867デフォルトの名無しさん:2014/11/29(土) 02:59:42.56 ID:Ewz0tat3
868デフォルトの名無しさん:2014/12/02(火) 00:21:15.45 ID:84bfmZQr
>>867
ありがとうございます。
やはり実行前に指定するしかないんですかね

ckwやcolorconsoleもダメみたいだし。
emacs系のエディタ内から実行すると出来そうだが、使っていないし。
869デフォルトの名無しさん:2014/12/02(火) 20:52:58.98 ID:eiyTotPn
colorを使うと「"コマンド プロンプト"のプロパティ」の「画面の色」ダブにある16色の内から適宜背景色と文字の色を設定できますが
この16色の値自体をコマンドによって変更することは可能でしょうか?
870デフォルトの名無しさん:2014/12/02(火) 21:44:00.72 ID:HWsQAGF0
reg /?
871デフォルトの名無しさん:2014/12/02(火) 22:06:42.39 ID:eiyTotPn
>>870
回答ありがとうございます。
vistaでは HKEY_CURRENT_USER\Console\cmd にある ColorTable00 などを編集することで色の変更はできました。
しかしこれだとOSを一度再起動しないと反映されません。
「"コマンド プロンプト"のプロパティ」上で件の値を変更した時のようにリアルタイムに反映させることはできないでしょうか?
条件を後から付け足してしまってすみません。
872デフォルトの名無しさん:2014/12/03(水) 03:12:46.33 ID:SnuHs4CF
>>871
WScript.exeでSendKeys
873デフォルトの名無しさん:2014/12/03(水) 05:01:32.71 ID:JM1QCjro
>>871
> OSを一度再起動しないと反映されません。
start cmd & exit
874デフォルトの名無しさん:2014/12/03(水) 11:54:27.24 ID:MC2xUBgH
>>872
コマンドプロンプトのシステムメニューを出す方法プリーズ
ALT+Spaceはキーコードを送っても無効化された
875デフォルトの名無しさん:2014/12/03(水) 16:28:23.23 ID:JhxMqpE5
>>871,873
なるほど。ウチのWin7でも HKEY_CURRENT_USER\Console 内の ColorTable00 などで同様にできたが、
実際問題そこまでして微妙な色を設定する必要があるものなの?
876デフォルトの名無しさん:2014/12/03(水) 16:29:24.71 ID:c+wt1AcT
>>872-873
どうもありがとうございます。
Sendkeysについては>>874さんの指摘通り私の能力ではうまくいきませんでした。
>>873さんの方法で期待通りの動作が確認できました。
OSごと再起動する必要はなかったんですね。
どうもありがとうございました。
877デフォルトの名無しさん:2014/12/03(水) 16:32:06.22 ID:c+wt1AcT
>>875
阿呆な試みなんですが、実はコマンドプロンプト上で起動するアクションゲームを作っておりまして
878デフォルトの名無しさん:2014/12/04(木) 08:27:43.56 ID:0Qz5Qes/
Rogue?
879デフォルトの名無しさん:2014/12/04(木) 09:44:25.42 ID:iacl6LQg
>877
今の時期にスゲェな。そのタイプのゲームでは市販ソフトにオマケとして収録されていた以下3作を思い出す。

「オレハ ザカリテ ザッザッザッ ゲーム」:PC-8801(SR以降)版シルフィードに収録。
 1キー操作で難しいが爆笑必至の傑作。オールBASIC
「シルフィード2」:PC-8801(SR以降)版シルフィードに収録。同じくオールBASICで、ジワジワくる。
「KAX」:PC-9801版サーク1に収録。1キー操作で難しいが爆笑必至の傑作。BGMも素晴らしい。
 後に3D化されてWindows用フリーソフトとしてVectorで公開されたが、現在は入手不可。
880デフォルトの名無しさん:2014/12/04(木) 20:46:58.45 ID:qOpb79dH
>>878-879
一般的なローグ・ライク・ゲームよりももう少し描写が複雑なものを作ってます。
以前グラディウス(2面まで)をコマンドプロンプト上で再現できたので
今度はロックマンあたりに挑戦しようかと思っているんです。
移植性は乏しいですし、ただのお遊びなんですけどね。
スレの趣旨とずれてしまって恐縮ですがこれにて失礼いたします。
皆様どうもありがとうございました。
881名無しさん@そうだ選挙に行こう:2014/12/13(土) 22:29:32.94 ID:NyNXg+vj
windows7、1ユーザーなので管理者なのですが、openFilesで管理者権限ないよって言われます。どうしたらいいですか?

で調べたらcmdを明示的に管理者権限で起動しないといけないんですね。
管理者権限で起動してないcmdで、途中から管理者権限で各種コマンドを実行する方法はありますか?
UNIXのsuコマンドみたいな。
882デフォルトの名無しさん:2014/12/14(日) 01:47:37.60 ID:sl2oQCLD
runas
883名無しさん@そうだ選挙に行こう:2014/12/14(日) 14:39:01.52 ID:hkNZShOM
884デフォルトの名無しさん:2014/12/17(水) 21:30:14.72 ID:0fjBzdT7
>>883
ありがとうございます。なるほど。IT業界は英語が必須なんですね。
885デフォルトの名無しさん:2014/12/17(水) 22:27:50.62 ID:/7Gz8Bcu
実行環境:さくらエデイタのCTRL B
実行場所:D:\あああ\いいい.bat
Z:¥:別のPCのへネットワークドライブ

内容
CD Z:¥かかか¥ききき¥くくく
CD
MOVE さささ.txt わわわ.txt
MOVE ししし.txt ををを.txt

Z:¥ ではなく D:¥あああ に居るみたいでMOVEが出来ません
さくら実行だとCDは次の行に影響しないんですか?
それともさくら側に実行場所を限定する設定とかありますか?
フルパスで指定するしかないんですかね
886デフォルトの名無しさん:2014/12/17(水) 22:45:06.86 ID:LoI71Hb0
>>885
さくらエディタのことは何も知らないが、
batと同じだとするなら
基本は別ドライブへの移動とカレントフォルダの移動は別にする必要あり
z:
cd \かかか¥ききき

一つのコマンドで実行するには
cd /d z:\かかか¥ききき
又は
pushd z:\かかか¥ききき
887デフォルトの名無しさん:2014/12/17(水) 23:03:33.67 ID:/7Gz8Bcu
>>886
即レスありがとうございます。
ドライブの移動方法があったんですね。助かりました。
なんでも /? しないとだめですね。勉強になります。
888デフォルトの名無しさん:2014/12/18(木) 02:00:07.70 ID:133cQhRc
>>885
さくらエディタって、中からコマンドを実行できたんだ
使えそう
889デフォルトの名無しさん:2014/12/27(土) 01:20:59.95 ID:DbgVXTUB
下記のバッチを実行すると
最後に存在しないファイル名が表示されるんだが
仕様なのか?

@echo off
cd /d Z:\
dir /s /b *.txt
echo.
cd d1
for %%i in (*.txt) do (
cd \d2
echo %%~fi
)

Z:\d1\11.txt
Z:\d1\12.txt
Z:\d2\21.txt
Z:\d2\22.txt

Z:\d1\11.txt
Z:\d2\12.txt
890デフォルトの名無しさん:2014/12/27(土) 13:47:12.01 ID:yKqTtdqi
GetFullPathName は、カレントドライブとカレントディレクトリを、指定されたファイル名に結合し、指定されたファイルのフルパスとファイル名を判断します。
また、フルパス名とファイル名を組み合わせた文字列のうち、ファイル名部分のアドレスを計算します。
この関数は、組み合わせによって得られたパスとファイル名が有効であるかどうか、およびそれらが適切なボリュームの既存のファイルを指しているかどうかを確認しません。
891デフォルトの名無しさん:2014/12/27(土) 17:16:01.43 ID:erPfOYAk
よくある間違いだよね
ファイルのパスを求めるのに使っても目的のDriveとDirがカレントじゃないと
求めるパスと違うパスが出来上がるってのは
892デフォルトの名無しさん:2015/01/04(日) 15:02:18.95 ID:5ILRS96F
最近知った環境変数 %__CD__% が思いのほか便利だったので自分用メモ。
cd ..
set WORKDIR=%CD%
echo %WORKDIR%\HOGE.TXT
だとドライブ直下へ上がった時にバックスラッシュが重なってOops!となりがちだが、

cd ..
set WORKDIR=%__CD__%
echo %WORKDIR%HOGE.TXT
だと場所を問わずバックスラッシュが一つのためパス変更がはかどる。
%CD%の拡張版のような変数がなぜあるのか、いつ頃からあったのか不明だが地味に便利だったというメモ。
893デフォルトの名無しさん:2015/01/05(月) 16:43:15.11 ID:1CYbqF+q
Undocumented Dynamic variables (read only)
%__APPDIR__% The directory path to the current application .exe,
           terminated with a trailing backslash. - forum thread.
%__CD__% The current directory, terminated with a trailing backslash.
%=C:% The current directory of the C: drive.
%=D:% The current directory of the D: drive if drive D: has been accessed
      in the current CMD session.
%DPATH% Related to the (deprecated) DPATH command.
%=ExitCode% The hex value of the last return code set by EXIT /B
%=ExitCodeAscii% The ASCII value of the last return code set
             by EXIT /B if greater than 32.
%FIRMWARE_TYPE% The boot type of the system: Legacy
              ,UEFI,Not implemented ,Unknown Windows 8/2012.
%KEYS% Related to the (deprecated) KEYS command.
894デフォルトの名無しさん:2015/01/06(火) 14:53:10.69 ID:8K/E7hGs
>>892
これ、win8 だけなのかな
win7 はダメだった
895デフォルトの名無しさん:2015/01/06(火) 19:55:01.33 ID:FMw5vc/A
Windows7、Windows2003 でもできたよ (XPが手元にないのでXPは不明)
アンダーバーが前後2つというのに気が付かず、
最初は %__CD__% を %_CD_% と一個ずつ少なく間違えて?な状態だったけどw
896デフォルトの名無しさん:2015/01/07(水) 01:04:09.08 ID:bzmB4Ci+
%=D:%は一旦そのドライブに移動(アクセス)してないと使えないんだな
あと、%=ExitCode%も同じく外部プログラムからの復帰値がないとダメ
現在これらのどれが定義されているのか見るには
setじゃダメで、set ""で見られる
最初に表示される=::=::\が何なのかは良く分からないけど
897デフォルトの名無しさん:2015/01/07(水) 01:06:27.82 ID:bzmB4Ci+
>>895
XPでも同じく使えた
898デフォルトの名無しさん:2015/01/08(木) 10:35:12.35 ID:5weP5dKV
エクスプローラ→ファイル→コマンドプロンプトを開く
で、下記を入力
echo %CMDCMDLINE%
すると
"cmd.exe" /s /k pushd "???"
となる。カレントディレクトリは pushd で移動してるらしい。
じゃあ、popd してみると何処に行くか見てみたら、
システムと無関係なディレクトリに飛ぶ事がある。
何故だろう?
899デフォルトの名無しさん:2015/01/08(木) 21:51:12.10 ID:M0EXKb7n
ルールでは親プロセスのを引き継ぐんじゃね?
900デフォルトの名無しさん:2015/01/08(木) 23:50:30.40 ID:eI1wghCW
>>898
> カレントディレクトリは pushd で移動してるらしい。

単なる cd ではドライブを変えられないから

> システムと無関係なディレクトリに飛ぶ事がある。

c:\Windows\System32 (cmd.exe がある場所) じゃないの?
901デフォルトの名無しさん:2015/01/09(金) 00:02:10.57 ID:CiCc09+g
>>895
サンキュです
__ はアンダーバー二つでしたか、どうりでダメだったはずだ
win7でも出来ました。

しかし旅館増設の迷路みたいな機能拡張だな
担当毎に勝手に増設している感じ
もっとわかりやすくすっきり拡張する方法はなかったのか
902デフォルトの名無しさん:2015/01/09(金) 00:57:56.11 ID:iXoT5Trb
アンダーバーで始まる(しかも二つ)変数はシステム変数であって
通常の機能拡張ではないし、ずっと前からあった機能だし
903デフォルトの名無しさん:2015/01/09(金) 01:19:17.83 ID:iZGrw0WV
>>900
俺の環境ではなぜか
C:\Program Files\Autodesk\Inventor 2013\Bin
に飛ぶ。
何なんだ?
このフォルダで何もした覚えがない。cmd.exeも無い。
echo %ComSpec%
とすると
C:\Windows\system32\cmd.exe
環境はWin8
904デフォルトの名無しさん:2015/01/09(金) 01:24:05.06 ID:wr1/NDht
>>902
ずっと前って言われてもWin98には無いぞ
905デフォルトの名無しさん:2015/01/09(金) 01:48:01.84 ID:iXoT5Trb
>>904
そりゃすまんかった
なんせwin7でどうとか言ってた奴に対してのレスだからwin7に対してずっと前からだと言ったまで
906デフォルトの名無しさん:2015/01/09(金) 01:49:58.35 ID:iXoT5Trb
>>905
まあ、そもそもwin9xにはcmd.exe無かったと思うんだけどね
907デフォルトの名無しさん:2015/01/09(金) 07:11:23.15 ID:Fx5/Rr0k
>>901
> もっとわかりやすくすっきり拡張する方法はなかったのか

WSH なり PowerShell 使えってことだろ
908デフォルトの名無しさん:2015/01/09(金) 19:26:43.49 ID:urUkKmSq
>>903
Inventor は開発環境を構築する類の製品みたいだし、
おそらくシェルの拡張がされていてそれが影響しているんじゃね?
先に Inventor の設定を読込んでからプロンプトを立上げていると予想
多分以下のレジストリの辺りにそれっぽいものがあると思う
HKEY_CLASSES_ROOT\Directory\shell\cmd\command
HKEY_CLASSES_ROOT\Folder\shell\cmd\command
909デフォルトの名無しさん:2015/01/10(土) 06:15:21.78 ID:zqsBeetH
>>908
レスさんくす。それっぽいのは無かった。

>reg query HKCR\Directory\shell\cmd\command /s

HKEY_CLASSES_ROOT\Directory\shell\cmd\command
(既定) REG_SZ cmd.exe /s /k pushd "%V"

>reg query HKCR\Folder\shell\cmd\command /s
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした

良く分からんが、スレチなのでこれで終わりにします
910デフォルトの名無しさん:2015/01/11(日) 20:18:22.42 ID:8AiuWit+
Win10 のコマンドプロンプト
プロパティに Experimental タブが有るそうだが
どんなもの?
911デフォルトの名無しさん:2015/01/11(日) 22:53:48.18 ID:RJYFXyqR
912デフォルトの名無しさん:2015/01/11(日) 23:45:14.50 ID:8AiuWit+
ありがとう
913デフォルトの名無しさん:2015/01/12(月) 08:28:33.82 ID:tHuTLLTi
>>904
Win98より前のWinNT3.51で試してみた
昔は%cd%のほうが無かったようだ

Microsoft(R) Windows NT(TM)
(C) Copyright 1985-1996 Microsoft Corp.
コマンド プロセッサ拡張機能が有効になりました

Z:\hoge>echo %__cd__%
Z:\hoge\

Z:\hoge>echo %cd%
%cd%

Z:\hoge>dir cmd.exe

95/12/12 07:02 163,808 cmd.exe
1 個のファイル 163,808 バイト
914デフォルトの名無しさん:2015/01/14(水) 01:33:33.35 ID:XOSZNhIv
そういや確かにDOS時代は%cd%や%errorlevel%なんて環境変数は無かった
915デフォルトの名無しさん:2015/01/14(水) 23:13:57.79 ID:QhrJ6mJr
9xの cd ... は好き
916デフォルトの名無しさん:2015/01/15(木) 01:04:20.76 ID:vh82IFS/
%date%も無かったなあ
917デフォルトの名無しさん:2015/01/15(木) 02:48:46.81 ID:1HoxXkR7
AとBという2つのディレクトリがあって
ディレクトリBには読み取り専用属性を設定してるんですが
RobocopyでディレクトリA内のファイルとサブディレクトリをBにコピーすると
Bの読み取り専用属性が解除されてしまうんですが解除させない方法は無いんでしょうか?
918デフォルトの名無しさん:2015/01/15(木) 05:41:26.77 ID:47ipxJ/H
なぜここできくんだ
919デフォルトの名無しさん:2015/01/15(木) 07:48:31.81 ID:ZQKHF8i1
フォルダとディレクトリは別物だと思ってる爺だから
920デフォルトの名無しさん:2015/01/16(金) 08:29:49.85 ID:obgM8cFp
一応、実際に別物だよ
ディレクトリってのはファイルシステム上での概念
フォルダってのはOSやデスクトップ環境での概念だからな

例えば、Windowsのデスクトップは
全ユーザ共有のデスクトップディレクトリと
ユーザ個別のデスクトップディレクトリを併せて
1つのフォルダとして表示してる
921デフォルトの名無しさん:2015/01/16(金) 08:32:43.08 ID:obgM8cFp
あ、いやOSはディレクトリか…
ともかくレイヤが違うって感じ
922デフォルトの名無しさん:2015/01/16(金) 08:40:46.86 ID:HgpWNsfz
頭悪い奴だな(笑)
>>917がレイヤだ何だの話をしてると思うのか?
923デフォルトの名無しさん:2015/01/16(金) 11:11:17.33 ID:rD0jigTp
属性付け直しじゃダメなの?
attrib +r B & attrib +r B\* /S /D
924デフォルトの名無しさん:2015/01/16(金) 11:47:10.39 ID:rD0jigTp
ああ、これかな?
robocopy A B /nodcopy
925デフォルトの名無しさん:2015/01/16(金) 21:11:44.51 ID:+KevtdCt
フォルダのRO属性はwindowsがほかの用途で使っちゃってるからな・・・

無駄にRO属性つけると遅くなるぞ
926デフォルトの名無しさん:2015/01/16(金) 23:20:45.68 ID:obgM8cFp
>>922
ん?>>919って>>917の話をしてたの?
確かに唐突な話ぶりだなとは思ったが
927デフォルトの名無しさん:2015/01/22(木) 20:27:03.52 ID:WJB7fWww
下記のバッチを実行したら i=3 まで表示されて終了する

@echo off
prompt $g
for /L %%i in (1,1,100) do (
echo i=%%i
if %%i == 3 goto :x
)
exit
:x
echo Completed
pause

でも、1行目を echo on にしたら
バカみたいに 100回ループしてるんだが
こういう仕様なの?
928デフォルトの名無しさん:2015/01/22(木) 20:49:15.59 ID:c2QCAyIs
その100回ループを見たとき「iの値だけの行」は本当に全部あるかい?
forコマンドの内容は100回分に展開はされるのよ(echo off 時でも展開自体はされてる)
その中で、実際にコマンドの呼び出しにありついてるのは途中までって話
929デフォルトの名無しさん:2015/01/22(木) 21:02:38.14 ID:PSdfLgXI
Windows XP Home Editionでのサービスパック導入状態を確認できる方法はありますか?
Professionalであれば
WMIC OS Get ServicePackMajorVersion /Value
で取得出来るはずですが、Homeでは出来ないようなので…
930デフォルトの名無しさん:2015/01/22(木) 21:29:29.69 ID:WJB7fWww
systeminfo は?
XPが手元に無いんで分からんけど
931デフォルトの名無しさん:2015/01/22(木) 21:34:48.73 ID:PSdfLgXI
>>930
Home Editionにはsysteminfoもないんです
932デフォルトの名無しさん:2015/01/23(金) 03:53:37.61 ID:b32Rf+9g
レジストリ見れば分かるし、公式な資料やレジストリを見るためのコマンドもあるけど、そーいうのは求めて無いわな。
(万が一求めてるならMSDNかTechNet漁れ)
933デフォルトの名無しさん:2015/01/28(水) 19:46:09.83 ID:gZ7f8HvS
すいません。教えて下さいませ

start "" "C:\Program Files\HIBUN-AE\bin\svdcrfmt.exe" /D "\P:"

mkdir P:\etc

というバッチファイル *.bat を作ったんですが、
(RAMディスク\P:を秘 文フォーマットなるものでフォーマットしてディレクトリを作成)
その秘 文フォーマット実行する svdcrfmt.exe に、
「コマンドライン引数の指定に誤りがあります。コマンドライン引数の設定を
 見直して再度実行下さい。」 メッセージID:SFCF_MSG_002
と言われてエラーで止まります。
ディレクトリ(P:のRAMディスクそのもの)を指定する引数を教えて頂けましたら幸いです
934デフォルトの名無しさん:2015/01/28(水) 22:18:28.08 ID:JxueOrGN
>>933
ハイソルに聞けよ
935デフォルトの名無しさん:2015/01/28(水) 22:26:07.91 ID:1tc01pIy
>>933
そのソフトのメーカーなりに確認がベスト
/Dのあとにドライブ指定とかだろうなと推測するけど、
引数は/P:でいいの?実はP:だけでいけたりしない?
936デフォルトの名無しさん:2015/01/28(水) 22:36:49.03 ID:gZ7f8HvS
>>934
ハイソルなんじゃそら、と思ったらHISOLですね
聞けませんすいません

>>935
その辺何度か試行錯誤した気はしますが、もう一回試してみます
やっぱり聞けませんすいません
937デフォルトの名無しさん:2015/01/28(水) 23:38:29.76 ID:pjK9E+QZ
>>936
「start ""」を消すのはダメ?
938933:2015/01/29(木) 21:57:57.84 ID:F1OxNzTt
>>937
挙動少し違うけど結局同じ結果でした

いろいろ試しましたが、

start "" "C:\Program Files\HIBUN-AE\bin\svdcrfmt.exe" /DP

メッセージID:SFCF_MSG_008
「このボリュームは準備が整っていないか、または書き込み可能なリムーバブルメディアではありません。」
エラーが出ました。これだけが>>933と違うエラーなので途中までは合ってるんだと思います
(P:ディスクはドライブ上右クリック、「秘 文フォーマット」で実際にフォーマット可能です)


多分、また別の引数が必要だと思いますので諦めます
939デフォルトの名無しさん:2015/01/31(土) 18:44:07.21 ID:1eTkueSY
ボリュームの準備完了前にmkdirしようとしてエラー吐いてるとも考えられる
start "" /wait を入れて挙動を見るか、反復してドライブ確認するコマンド入れて時間稼ぐか
なお、時間稼いで解決する問題なら ping -n 10 localhost >NUL の一行だけでもいい

echo on
cd /D C:\Program Files\HIBUN-AE\bin || goto error
start "" svdcrfmt.exe /DP

@rem 設定回数リトライ後に分岐処理 (サンプルでは約1秒×10回待つ)
@rem forの設定: 数値でリトライ回数を、call引数でドライブレターを指定
for /L %%I in (1,1,10) do call :SUB P
if ERRORLEVEL 1 goto 1
if ERRORLEVEL 0 goto 0

@rem 約1秒待つ
:SUB
ping -n 2 localhost >NUL
if exist %1:\NUL (exit /B 0) else exit /B 1

:error
echo アプリなし
:1
echo ドライブなし
pause
exit

:0
echo ドライブ発見
mkdir P:\etc
exit
940デフォルトの名無しさん:2015/01/31(土) 19:00:54.17 ID:1eTkueSY
少し訂正
フォルダ作成処理はこちらのほうが無難か

@rem フォルダの存在確認・ある場合はなにもしない
:0
echo ドライブ発見
if not exist P:\etc\NUL mkdir P:\etc
exit
941デフォルトの名無しさん:2015/01/31(土) 19:29:32.11 ID:4mnyEP67
pingをウェイト代わりにするのXP時代のバッドノウハウなので今なら素直にtimeout使った方がいいと思う
942デフォルトの名無しさん:2015/02/02(月) 17:06:26.70 ID:m3idgQJ3
新規と新規フォルダの中に1,2,3というサブフォルダを作りたいのですが

md 新規\1
cd 新規

md 2 3

でcmdだとうまくいくのですが、batだと1しか作られません

絶対パスを使うしかないのでしょうか?
943デフォルトの名無しさん:2015/02/02(月) 18:57:02.01 ID:X1GA3/7s
>>942
先頭に
pushd %~dp0
とでも書いとけば?
944デフォルトの名無しさん:2015/02/02(月) 20:20:36.75 ID:m3idgQJ3
>943
返信ありがとうございます。

pushd %~dp0
md 新規\1

popd
cd 新規

md 2 3

だと何も反応がないようです。

batが速すぎて
mdで作られた新規フォルダを認識出来てないんでしょうか?
945デフォルトの名無しさん:2015/02/02(月) 21:10:51.31 ID:l6dJG2Yv
popdしたら意味無いに決まってるじゃん。

わざわざmdの前に入れるとかわかってやってんだろ?
釣りだろ?
946デフォルトの名無しさん:2015/02/02(月) 21:42:38.41 ID:m3idgQJ3
>945
最初にpopdない状態で試したのですがこちらも同じく
何のフォルダも作られなかったので

調べてみたらpopdと一緒に使うらしいので使ってみました。
947デフォルトの名無しさん:2015/02/02(月) 21:59:55.24 ID:oRyJgGaO
pushd "%~dp0"
for /l %%a in (1,1,3) do (md 新規\%%a)
popd
948デフォルトの名無しさん:2015/02/02(月) 22:33:51.38 ID:m3idgQJ3
>947
こちらも何も反応がありません
試しにcmdでpushd %~dp0をしてみたら
指定されたパスが見つかりませんとでます。

この辺が原因でしょうか?

レジストリを見たら拡張編集は有効になってました
949デフォルトの名無しさん:2015/02/02(月) 22:55:15.28 ID:m3idgQJ3
ああ、わかりました。

改行コードがCR+LFでなくLFになっていたせいでした。

pushd %~dp0をつけなくても動きました。

お騒がせしました。
950デフォルトの名無しさん:2015/02/02(月) 23:09:26.22 ID:AsOXYA1e
3年はecho onしてろ
951デフォルトの名無しさん:2015/02/05(木) 21:42:25.78 ID:Rj58Qqe7
バッチファイルの引数に複数のファイルの絶対パスを与えて
各々操作するスクリプト(1)を書いているのですが
パス内に「)」があると(%*)の閉じ括弧とみなされてエラーになってしまいます。
(1) for %%A in (%*) do (...)

そこで一旦「)」を「^^)」に置換して対処しているのですが(2)、もう少しスマートな方法は無いでしょうか?
(2)
set path1=%*
set path2=%path1:)=^^)%
for %%A in (%path2%) do (...)
952デフォルトの名無しさん:2015/02/05(木) 22:03:38.18 ID:RfekTely
>>951
for %%A in ("%*") do (...)
これじゃダメなの?
953デフォルトの名無しさん:2015/02/05(木) 22:10:00.81 ID:Rj58Qqe7
>>952
どうもありがとうございます!
これで全く問題ありません
勉強になりました
954デフォルトの名無しさん:2015/02/06(金) 18:33:01.36 ID:x/dlo3t0
再びすみません
>>952の方法だと一度に%%Aへ全ての引数が渡されてしまってうまくいきませんでした
例えば、引数が「C:\foo\ C:\bar\」の時、for内は一度しか実行されず
%%Aは「"C:\foo\ C:\bar\"」になってしまうようです
955デフォルトの名無しさん:2015/02/06(金) 23:02:29.35 ID:yn/8ebeo
>>954
ごめん。引数が複数ってのを完全に忘れてた
956デフォルトの名無しさん:2015/02/06(金) 23:17:48.98 ID:yn/8ebeo
>>954
あ、どっちにしてもパスにスペースが含まれてると
スペースの前後で別々の引数として処理されるから想定どおりに動作しないね
957デフォルトの名無しさん:2015/02/07(土) 01:02:02.39 ID:+QMHzHkt
どうやってパラメタを作っているのか知らないが、パラメタ一つ一つを""で括るような方向に持っていくべき
958デフォルトの名無しさん:2015/02/07(土) 01:14:59.90 ID:ObZsWNET
>>957
右クリック「送る」で引数を与えているのでちょっと難しいかもしれないです。
959デフォルトの名無しさん:2015/02/07(土) 02:23:30.64 ID:+QMHzHkt
>>958
それだと、ファイル名にダメ文字がある可能性がありbatでは処理しきれない場合が出るので
WSHで処理する方向でどうぞ
例えば、
a&b.txt
a^b.txt
960デフォルトの名無しさん:2015/02/07(土) 18:52:53.93 ID:ObZsWNET
>>959
どうもありがとうございます。
WSHにはノータッチだったのでいろいろ読んでみることにします。
961デフォルトの名無しさん:2015/02/07(土) 21:28:06.92 ID:pnViDXcq
カッコ入りファイルが問題というなら、shiftで引数ずらすだけでよさそうだが違うのかな
>>954を読んでそう感じたが
カッコ記号食わせる前提ならカッコを使う構文は避けて、shiftやgotoで回すほうが確実だと思う
962デフォルトの名無しさん:2015/02/07(土) 21:41:27.68 ID:pnViDXcq
念のため書くとこんな感じのね

@rem 引数1がある間は繰り返し処理・無くなりし次第ENDラベルで処理終了
:LOOP
if "%~1"=="" goto END

@rem ここへ括弧を使わない処理を書く
@rem [例] copy "%~1" "hoge"

shift
goto LOOP

:END
exit
963デフォルトの名無しさん:2015/02/08(日) 00:42:39.68 ID:jdTkuJAE
バッチだと思わぬ落し穴があったりする
ファイル名 "ab%cd%.txt" とか…
964デフォルトの名無しさん:2015/02/08(日) 00:53:37.07 ID:cMpvNcty
最初の質問を見た限り、括弧だけが問題じゃなく
一般の不特定のファイル名全てを対象にしたいという感じを受けた
batじゃ無理な場合があることを認識した上で事を進めるなら最初の%*の置換でも良いだろう

ちなみに、jsでのパラメタの受け渡しは以下のような感じになる
(括弧でも&や^でも問題ないから、test.jsとでも名づけて試行してみてくれ)

var arg = WScript.arguments;
var i, s='引数一覧\n';
for (i=0; i<arg.length; i++) {
s += '引数'+(i+1)+' : '+arg(i)+'\n';
}
WScript.Echo(s);

ファイルアクセスや操作はググれば色々見つかるので一つだけ
http://3rd.geocities.jp/kaito_extra/Source/FileFolderCtrl.html
965デフォルトの名無しさん:2015/02/08(日) 01:10:14.59 ID:2dR+ApRB
forfiles /p c:\windows /c "cmd.exe /c echo @path"
のもうちょっと軽いやり方ないですか

dir /bだとフルパスが取れず
dir /s /bだとサブディレクトリ巡回しちゃうし
966デフォルトの名無しさん:2015/02/08(日) 01:12:08.13 ID:cMpvNcty
一つ注意
問題ないというのは、ファイルを選択して「送る」の場合であり
コマンドラインから起動するとbatの場合と同じく&や^はダメだよ
967デフォルトの名無しさん:2015/02/08(日) 02:20:57.71 ID:61Kxoh3n
cd c:\windows
for /f "delims=" %%I in ('dir /b') do echo "%%~fI"
968デフォルトの名無しさん:2015/02/10(火) 21:26:24.22 ID:wlrPXjaB
フォルダの中に同名のサブフォルダが複数あり(第三下層)、その中にファイルが入っています。
サブフォルダの名前を指定して、ファイルを消さずにフォルダを削除する(ファイルは第二下層へ引き上げ)ってcmdで出来ますでしょうか?
969デフォルトの名無しさん:2015/02/11(水) 01:25:29.57 ID:grqhnT4Q
これじゃだめ?

フォルダ
├─サブフォルダA
│ └─サブフォルダA
│   └─サブフォルダA
│       ファイル
├─サブフォルダB
│ └─サブフォルダB
│   └─サブフォルダB
│       ファイル
     ↓
フォルダ
├─サブフォルダA
│ └─サブフォルダA
│     ファイル
├─サブフォルダB
│ └─サブフォルダB
│   └─サブフォルダB
│       ファイル

set oyafolder=C:\フォルダ
set subfolder=サブフォルダA
cd /d "%oyafolder%\%subfolder%\%subfolder%\%subfolder%"
move /y *.* ..\
cd ..\
rd /q %subfolder%
970デフォルトの名無しさん:2015/02/11(水) 22:06:03.60 ID:l4GqiAR4
>969
フォルダ
├─サブフォルダD
│ └─サブフォルダE
│   └─サブフォルダA
│       ファイル
├─サブフォルダB
│ └─サブフォルダF
│   └─サブフォルダA
│       ファイル
     ↓
フォルダ
├─サブフォルダD
│ └─サブフォルダE
│     ファイル
├─サブフォルダB
│ └─サブフォルダF
│    ファイル
│       

イメージはこんな感じです
971デフォルトの名無しさん:2015/02/12(木) 00:15:58.05 ID:hQsJUazq
・dir /a:d /b /s でサブフォルダのリスト取得
・for でパスを??毎に区切る
・findstr で特定の文字列を含む行を抽出
この辺組み合わせればいけそう。
972デフォルトの名無しさん:2015/02/12(木) 01:38:07.22 ID:R1QlNtC1
@echo off
cd /d "%~f1"
set "a=%~f1"
setlocal enabledelayedexpansion
for /l %%i in (1,1,1000) do (
set "c=!a:~%%i!"
if not defined c set /a "b=%%i+1" & goto x
)
goto :eof
:x
endlocal & set b=%b%
for /r %%i in (.) do set "d=%%~fi" & call :y
pause & goto :eof
:y
setlocal enabledelayedexpansion
set "c=!d:~%b%!"
endlocal & set "c=%c%"
for /f "tokens=3,4 delims=\" %%j in ("%c%") do (
if /i "%%j%%k"=="A" (
pushd "%d%"
move * ..\ 2> nul
cd ..
rd %%j
popd
))
973デフォルトの名無しさん:2015/02/12(木) 01:49:32.38 ID:R1QlNtC1
>>972
フォルダAの名にスペースが有ったら
rd "%%j"
974デフォルトの名無しさん:2015/02/12(木) 02:09:48.03 ID:RudW6Zjv
3階層に限らずに指定されたディレクトリを対象とし、
もしそこにサブフォルダとかがあったらファイルの親ディレクトリに移動だけで削除はしない
とかでいいなら
@echo off
set targetDir=xxxx
set startDir=c:\temp

pushd %startDir%
forfiles -p%startDir% -s -m%targetDir% -c"cmd /c if @ISDIR==TRUE move /y \"@PATH\%targetDir%\*\" \"@PATH\%targetDir%\..\" 2>nul&rmdir \"@PATH\%targetDir%\" 2>nul"
popd
975デフォルトの名無しさん:2015/02/12(木) 03:31:53.28 ID:RudW6Zjv
>>974のはtargetDirに半角空白が含まれているとエラーになるので
-mtargetDir% → -m"%targetDir%"
に、また\"@PATH\%targetDir%\..\"は単に\"@PATH\"で良かった

なお、3階層目に限定したのも出来た
@echo off
set targetDir=xx yy
set startDir=c:\temp

pushd %startDir%
set baseDir=%cd%
for /f "tokens=*" %%i in ('forfiles -p%startDir% -s -m"%targetDir%" -c"cmd /c if @ISDIR==TRUE echo \"@PATH\""') do (
call :check %%i
)
popd
goto :eof

:check
pushd %1
cd ..
if "%cd%" equ "%baseDir%" goto :not3level
cd ..
if "%cd%" neq "%baseDir%" goto :not3level
move "%~1\%targetDir%\*" %1 2>nul
rmdir "%~1\%targetDir%" 2>nul
:not3level
popd
goto :eof
976デフォルトの名無しさん:2015/02/12(木) 03:32:57.54 ID:RudW6Zjv
>>974のはtargetDirに半角空白が含まれているとエラーになるので
-mtargetDir% → -m"%targetDir%"
に、また\"@PATH\%targetDir%\..\"は単に\"@PATH\"で良かった

なお、3階層目に限定したのも出来た
@echo off
set targetDir=xx yy
set startDir=c:\temp

pushd %startDir%
set baseDir=%cd%
for /f "tokens=*" %%i in ('forfiles -p%startDir% -s -m"%targetDir%" -c"cmd /c if @ISDIR==TRUE echo \"@PATH\""') do (
call :check %%i
)
popd
goto :eof

:check
pushd %1
cd ..
if "%cd%" equ "%baseDir%" goto :not3level
cd ..
if "%cd%" neq "%baseDir%" goto :not3level
move "%~1\%targetDir%\*" %1 2>nul
rmdir "%~1\%targetDir%" 2>nul
:not3level
popd
goto :eof
977968
みなさんお知恵をありがとうございます。
やはり結構複雑な処理になりますね。
rdのオプションにあったらいいのにとか思ったり。