【.cmd】 バッチファイルスクリプト %10 【.bat】
うんちっち
@echo ^>^>1乙
wshもここでええのんか?
お前ら、wsh使ってますか? Part8
C:\Users\user\desktop の時にdesktopだけを表示したいのですがよい方法はありませんか
「set /p hizuke=日付を入力して下さい:」 とやると 「日付を入力して下さい:」 と出ますが、この時に 「日付を入力して下さい:2013/07/22」 のように今日の日付をデフォルト値として表示出来ないでしょうか? 思いつきで 「set /p hizuke=日付を入力して下さい:<echo %date%」 とかやってみましたがもちろんダメでした…
set /p hizuke="日付を入力して下さい:%date%"
空入力でデフォルト値 set hizuke=%date% set /p hizuke=日付を入力して下さい:%hizuke%
10 :
7 :2013/07/23(火) NY:AN:NY.AN
ありがとうございます。 ただ言い忘れていましたが、表示したデフォルト値をキーボードで変更できるようにしたいのです。 例えば2013/07/22と表示されたら最後の2を消して5にしたりといった具合にです。
schtasksで長いタスク名を確認する方法はありますでしょうか? 例えば schtasks /create /tn "メモ帳を起動してやるぞ!こんちくしょう!" /tr c:\windows\system32\notepad.exe /sc daily /st 23:00:00 と入力して「メモ帳を起動してやるぞ!こんちくしょう!」というタスク名のタスクを作成します。 すると、 schtasks /query と入力して先ほど作ったタスクを表示させるとタスク名が途切れて表示されてしまいます。 これでは途切れていない正しいタスク名がわからず、タスクを削除する時などにタスク名を指定できません。 タスクスケジューラでもPowerShellでもいいので途切れていない正しいタスク名を確認する方法を 知っている方がいましたら教えて下さい。
ありません
>>11 へー最近はそんなことになってるんだねえ
XPだとタスク名は欠けることなく全部出る
何かオプションスイッチがあるんでないのかなあ
まあ回避手段としては、タスクの実体は(XPの場合だと)tasksフォルダ内のファイル(xxx.job)なんで直接ファイル名を漁るとかかな
for /f "tokens=* delims=" %%i in ('dir /b "%systemroot%\tasks\*.job"') do echo %%~ni
14 :
13 :2013/07/24(水) NY:AN:NY.AN
ヘルプ見たら schtasks /query /fo list または schtasks /query /fo csv で表示できるんでないかな
15 :
11 :2013/07/24(水) NY:AN:NY.AN
>>13-14 /foオプションで出せるんですね。知りませんでした…
"%systemroot%\tasks"フォルダに保存されるというのも初めて知りました。
これはこれで使い道が色々ありそうなので覚えておきます。
助かりました。どうもありがとうございます。
(実は家のPCはXP-Homeでschtasks無いので試すのは明日会社でですが…(笑))
3つの.exe ファイルが有るんですが、1つを実行するBATファイルを作りたいです どうすればいいですか?
if
18 :
15 :2013/07/25(木) NY:AN:NY.AN
今日会社のPC(Win7)で/foオプション使ってうまくいきました。 しかしWin7だとタスクのファイルは"%systemroot%\system32\tasks"フォルダに作成されるようです。 OSの種類によってパスが変わるなんてめんどうな仕様ですよね…(泣)
仕様なんだからしようがない
20 :
デフォルトの名無しさん :2013/07/26(金) NY:AN:NY.AN BE:1441685344-2BP(0)
僕のpcにあるテキストファイルを全てusbにコピーしたいです。 すぐにコピーしてペーストすれば使えるbatのコマンドを教えてください!
@echo off echo pcにあるテキストファイルを全てusbにコピーしました!!! exit /b 0
ありがとう!
>>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
>>20 テキストファイルかどうか、テキストエディタで開いてみないとわからない
>>23 DELコマンドじゃなくて、COPYコマンドだ。COPYコマンドなら、どこに送るかかかなければならない
もうねます
誤ってDELコマンドでファイルを削除した場合、 undeleteという英語版のソフトウェアで復旧できるかもしれない どれがいいのかしらない
MOVEコマンドで、ひどいめにあったことがある。MOVEコマンドは、要注意
ワイルドカードの指定が短いファイル名の方にも効いてしまう問題って Win7あたりで解消したんだっけ?
30 :
デフォルトの名無しさん :2013/07/27(土) NY:AN:NY.AN BE:4054739459-2BP(0)
ではpc内のデータをすべて削除する場合はどうしたら?
iso2bin.exe isoをbin 形式に変換するファイルを見つけたんですが 使い方は、 コマンドプロンプト → cd c:\場所 → iso2bin track03.bin track01.iso コマンドプロンプを呼び出さず簡略化したいんですけどどうすればいいですか? D&D しても無理みたいです・・・orz
バッチファイル経由でD&D する
>>29 仕様は解消したりしないよ
自分が短いファイル名を作るからだろ。自業自得ってもんだ。
作らなきゃいいんだよ。
34 :
17 :2013/07/28(日) NY:AN:NY.AN
ちょっと記述が間違ってたので一応訂正しときます。 Win7ではSchtasksで作成したタスクはファイルとして作成されないようです。 "%systemroot%\tasks"フォルダも "%systemroot%\system32\tasks"フォルダも見ましたが自分が作成したタスクは見当たりません。 "dir /s/b C:\*.job"ってコマンド叩いても出てきません。 コマンドで"Schtasks /query"を叩くともちろん出てきます そういう仕様に変わったのかな?まあ"Schtasks /query"で確認できるので困りませんが。
forコマンドで文字列置換はできないのでしょうか? 下記の<望む結果>を得たいのですが 下のコマンドでも駄目でした。 for /f %i in ('type test.txt') do echo %i:*:=% <test.txtの内容> ID:100 名称:あああ 価格:5000 ID:200 名称:いいい 価格:8000 <望む結果> 100 あああ 5000 200 いいい 8000
for /f "delims=: tokens=2" %i in ('type test.txt') do echo %i
38 :
36 :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が展開されるようにしたいのですが、何か良い方法はないでしょうか?
ファイルを指定する所にこんなの "file:%~1"
>>40 ありがとうございました!
おかげさまでうまく行きました!
バッチファイルから文字列をエコーしてファイルに流し込んで スクリプトを作成・実行ということをしているのですが、 リダイレクト先のファイル行頭にスペースができてしまいます。 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") ↑このスペース(□で表記)をなくしたいのです。 実用上は問題ありませんが、回避が可能であればご教示願いたいです。 お分かりの方居りましたらよろしくお願いいたします。
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 こう? というか、そんな書き方できたんだ……
>>44 さんできました!
echo;Set regEx = New RegExp>>%~n0.vbs
として解決しました。ありがとうございます。
リダイレクト方法はいくつかあるようですね。
本来ならカッコで囲んでひとまとめにするがシンプルなのでしょう。
(
echo;ほげ
echo;ほげ
)>"%~n0.txt
この方法は今回はバッチの前後の関係から制約があるため、このような方法でやってました。
お答えいただきまして、素早い対応ありがとうございました。
46 :
43 :2013/08/04(日) NY:AN:NY.AN
>>44 さんへ
質問時に書き込んだ方法ですが、まるっきりの自己流だったようです。
参考にしたサイトを見直してみたら、全然違ってました。昔の記憶をたよりに適当に書いてたようです。
混乱させてすみませんでした。
ちなみにこのサイトです。
「全般/ファイルディスクリプタとリダイレクト - CMD.EXE TIPs」
URLが長いので上のキーワードで検索してください。有名どころですが一応。では失礼します。
>>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があるように
解釈されてリダイレクトされてたんだろう
> つまり
>>44 はechoの直後にセミコロンとスペースが続いてからSetがあるように
>>43 と間違えた
echo.>hoge.txt とか echo;>hoge.txt ってやったら空改行が出力されるのと同じ原理なのかな
>%~n0.vbs echo;Set fso = CreateObject("Scripting.FileSystemObject") だな
いつからかコマンドプロンプトで日本語が■■■って表示されるようになっちゃったんですけど どうやって直せばいいんですか? ググって出てくるコードページを変えたりフォントを変えるのを試しても戻りませんでした XPです
>>51 cmd.exeを再インストールするか諦めてCygwinとか使えばいいんじゃ?
後はWin再インスコ
>>51 レジストリ
HKEY_CURRENT_USER\Console
を削除してみろ
念のためバックアップしてからね
= を含む文字列を = を含む文字列で置換するのに良い方法無いでしょうか? 事前にIF使った総当りで入れ替えておく方法は何とかできたのですが 下記の記述方で使えそうなエスケープなどあればと思いまして。 :: A=B を B=A に置換 set test=%test:A=B=B=A%
>>53 遅くなりましたが
この方法で復活しました
ありがとうございました!
BをCに蛙 AをBに蛙 CをAに蛙
>>56 つまり、ループ内で遅延展開を用いた入れ替えをやれってことっすね!
>>54 vbsでregexpしちゃいなよ
頭が遅延してんの?
power shellの話ははどこで話せばよいの? ざっと見たけどスレがないみたいなんだけど…
Windows PowerShell Part4
Javaみたいなコンパイルに失敗したらecho %errorlevel%で1って出力されるような言語で わざとエラーがでるコードTest.javaを用意して batファイルに javac Test.java echo %errorlevel% って書いてコマンドプロンプトから実行しても%errorlevel%が表示されません batファイルを実行した後に、手入力でecho %errorlevel%て打つと1って表示されます どうやってbatファイルからエラーレベルを出力できますか?
うそでしょう
echo %erorlevel% とか
>>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
続きの処理を記述
>>65 呼び出し元プロセスの環境変数は普通変えれんぞ。
というかタスク作ってしまったら何も情報伝わらないし、その方法意味あるんか?
なんとなく、
〜(
javac Test.java
echo %errorlevel%
)
ってなってるとか、Typoがあるとか、そういうのの方が怪しい気がする。
一番確実な対処はIF ERRORLEVEL 1とかの擬似環境変数ではない組み込み機能使って判定する方法だと思う。
>>66 寝ぼけてたね
確かに意味が無いな
これはインストーラなどでPATH環境変数が変化した場合に有効な手段だった
68 :
67 :2013/08/29(木) NY:AN:NY.AN
寝ぼけてたけど、間違ったのは 動作確認のために、コントロールパネルのシステムからユーザー環境変数を追加設定してやってたため ↓ この場合環境変数の設定値が反映されるにはcmd.exeを起動しなおさないと反映されないので
>>68 なるほど・・・現在の環境ではなくユーザの環境を読ませる一手間か
start /Iもatもユーザの環境を読み直さないし、runasはスマートカードかパスワード入力が必要になってしまうんだな
タスクはrunasと同等だし環境読み直すのも理解できるけど、エクスプローラからcmd起動したときとかはどういう挙動してんだろうコレ?
すいませんsetlocal EnableDelayedExpansionで取得できました いまいちどうして取れたかわかりませんが
今時なぜコマンドプロンプトなんですか? powerShellを使わない理由はなぜでしょうか?
>>71 コマンドプロンプトで足りるような用途にまで
PowerShellを使わなきゃならん理由は何だ?
まさか、自慢話を始めようとしてるのではないだろうな?
>>73 66で指摘されてるようなやり方してたんじゃね。
「すいませんsetlocal EnableDelayedExpansion(して、%errorlevel%を!errorlevel!にしたら)で取得できました」
だと普通によくあるミス。
>>74 すいません書き忘れてました
そづえす%から!にも書き換えてます
findstrで実行結果にファイル名を出さない方法はありますでしょうか? findstr "あああ" "C:\test.txt" とファイルを完全に指定すれば実行結果は あああいいい いあああいい いいあああい のようになって、ファイル名は出ずに一致した行の内容だけが表示されます。 しかし findstr "あああ" "C:\*.txt" のようにワイルドカード指定にすると実行結果には C:\test.txt: あああいいい C:\test.txt: いあああいい C:\test.txt: いいあああい のように一致した行の内容だけでなく、その行が含まれているファイル名まで表示されてしまいます。 これをファイル名は出さないように出来ないでしょうか?
for %i in ("C:\*.txt") do @findstr "あああ" "%i"
>>70 %〜%はその文字列を含むコマンドの実行前に展開されます。
何らかの書き方が原因で、javacの実行からエラーレベル取得までが1つ(1行)のコマンドとして解釈されてしまったのでしょう。
()で括るとかもその一つ。&で繋ぐのもそれに含まれるっけ?
type "C:\*.txt" | findstr "あああ"
call echo %%errorlevel%%
82 :
76 :2013/08/30(金) NY:AN:NY.AN
>>77 、
>>80 ありがとうございます!
どちらでも出来そうですね。
来週会社で試してみますね。
83 :
76 :2013/08/31(土) NY:AN:NY.AN
>>78 すみません、見落としてました。
このコマンドは知りませんでした。
forfiles /m "C:\*.txt" | findstr "あああ"
とすれば処理できそうですね。
ただPCがWinXPなのでこのコマンド自体がありません…
でも勉強になりました。
findstrで一文字違いまで検索結果に含めたい時スマートな記述無いでしょうか? 「いちごぱんつ」を検索して「いちのぱんつ」とか「いちごぱんだ」とかも同時に拾いたいのです
ない いちごぱんつ *ちごぱんつ い?ごぱんつ いち?ぱんつ いちご?んつ いちごぱ?つ いちごぱん*
findstrは複数文字列のOR検索するのに、 パイプを使わない表記方法(二重引用符で囲んでスペース区切り) があるのがUNIX系のgrepコマンドより便利だよね
おお、それでOR検索してくれるのか 一行で済むならおkですありがとう
echo %test%
>>85 > *ちごぱんつ
これ正規表現として構文エラーだろw
まあこれに限らずどれも正規表現じゃなくてワイルドカードとして記述してるみたいだが
findstrじゃワイルドカードは使えないだろwww
dir /s /b "C:\windows" >> ".\a.txt" で更新中の.\a.txtを findstr "hoge" ".\a.txt" で検索してもエラーが起こることは絶対にないですよね?
command.comじゃないんだからw
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
テキストファイルが1つあり、そのファイルの奇数行目の内容だけを表示することって可能でしょうか?
>>92 それいうとfor /Dに限らずforデフォルト動作もそうだし、
dir /Sは再帰だからfor /Dと動作違う気がするんだが、
まぁそれはそれとして置いとこう。
Aの欠点
・単純にコマンドが長い
・パイプ動作なのでcmd /U環境でないとUnicode文字が使えない
・/Sだとフルパスで冗長だし/-Sだと相対パス的に美味しくない
>>93 可能だけど、処理が複雑化する予定があるなら別の言語を併用したほうが良い
エスケープ周りで破綻してから再移植とかくっそダルいよ
>>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
>>92 for /r root %i in (.)
>>94 えらく詳しいのー感心感心
隠しはどうする?
>>95 空行はどうする?
find /n /v "" data.txt
で行番号を振って、奇数行だけ
>>96 すげぇ上から目線で重箱つついてるが、そんなんで人生大丈夫か?
>隠しはどうする?
隠しを列挙したいってケースより普通にfor /Dで済むケースのほうが多いから基本問題なし
そうしなきゃ駄目な時は諦めて、欠点を潰すか無視をしてfor /Fを使えばいい
一々全部の欠点例外を潰した万能定型文で…みたいな事はアホらしいからやりたくない
妥協が許されないならハナから汎用言語でも使っとかないと只の苦行だわ
>空行はどうする?
それも使えない文字の一例にすぎないだろ
行番号を消す処理も必要になるし、その手の対策の積み重ねも複雑化を招く
98 :
92 :2013/09/09(月) 21:15:46.13
>>94-95 ご回答ありがとうございます。
なるほど、Aは色々短所が目立ちますね。
実行速度も比較するのが馬鹿らしくなるほど@>>>>>>>>Aでした。
ちなみに
>>93 も私ですw
これも前途多難な感じなので他の方法を考えます。
なんか話が高度になってきたのでこの辺で…
set の文字列置換で文字列中に含まれる=自体を置換(削除)したいのですがどうしたらよいでしょうか? set a=abc=def set a=%a:==% とやるとエラーになりますんで…
100 :
54 :2013/09/11(水) 17:10:40.49
お、俺じゃないからね!
>>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%
for /f "delims== tokens=1,2" %i in ("%a%") do set b=%i%j
103 :
101 :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 取り敢えずそれで良いとしても、EOL指定とか空行とか非置換行とかメタ文字とか…
最終的には別言語併用出来るようにしたほうが楽な可能性があるって事は留意しておいても良いと思う。
ある実行中のバッチファイル自身の名前は %0 で得ることが出来ますが、 実行中のバッチファイルを呼出したバッチファイルの名前を知る方法はありますか? 具体的にやりたいのは shebang の再現です。 例えば以下のように始まる perl スクリプトの拡張子を bat にしておきます。 #!/usr/local/bin/perl ここに perl スクリプトの内容 そして #!.bat という名前のこんな感じのバッチファイルをパスが通った適当なところに置いておきます。 %* ほにゃらら & exit /b こうすることでおおざっぱにではありますが schebang っぽくできると思うのですが、 このほにゃららのところをどうすればよいか思い付きません。
男は黙って D:/Perl/bin/perl.exe ほにゃらら.pl いっそのことCygwinでも入れちゃえば
>>107 Cygwin も Msys も導入済みです。
だからそれらを使わないときでもそれに挙動を合わせたいというのが動機のひとつです。
また、 Perl を例に挙げましたが実際に使う言語処理系は他のものがメインです。
処理系起動時のオプションでないと切替えられない要素があるのですが、
個別に拡張子を割当てるのが煩雑になるというのが関連付けと PATHEXT を使わない理由です。
バッチファイルでやりたいのでバッチファイルスレで質問してるつもりなんですが、
他の方法を使わない理由をいちいち全部挙げてからでないと回答が出ないもんなんですか?
全部挙げてもでないかもよ
プログラム類ってのは目的を達成するための手段にすぎないのだから、特定の手段に拘るだけ無駄というか。 ダメ文字の件とか色々あるし、ドンピシャなテクニックが見つからない・思いつかないなら素直に手を変えるべき。 ハッカー文化的なものだが、バッチファイルってのは手軽な分、そういう手段は問わない傾向がより強い印象。
111 :
108 :2013/09/14(土) 11:44:58.17
ちょっと煽り気味でしたね。 すいません。 一応 C/C++ や JScript もそこそこ使えるつもりですが、呼出し元のプロセスが cmd.exe であることはわかっても、 あるバッチファイルを呼出したバッチファイルが何かということを調べる方法は見付かりませんでした。 そんなわけで「バッチファイルの機能」でどうにかなる可能性の方がまだ高いだろうと考えました。 要するに手段に拘っているわけではなく、色々と検討した結果としてバッチファイルに望みがあると思っているのです。
112 :
デフォルトの名無しさん :2013/09/14(土) 12:28:33.75
呼出し元から特定の引数渡すとかあるだろうになあ
113 :
108 :2013/09/14(土) 12:31:13.55
>>112 要件は
>>106 で述べた通りです。
可能であれば shebang 風 (完全に互換とまでは言わずとも) にしたいのです。
1.bat call 2.bat "%~0" 2.bat echo 呼び出し元:%~1 exit /b
116 :
108 :2013/09/14(土) 14:04:49.20
>>108 wshでWMI介して親プロセスのコマンドラインを取得
互換性ほしいなら他にないと思う
昔のtlist.exeはppidを出してたから、これ使えばいいよ
120 :
108 :2013/09/14(土) 15:17:15.13
既に
>>111 で述べましたが、それらの方法で得られるのはあくまでも cmd.exe を呼出したプロセスであり、
cmd.exe 内で実行されたバッチファイルの呼出し元ではありません。
>>120 stackoverflow.com/questions/10087812/batch-bat-get-the-name-of-the-first-script-not-the-current-one
shebang実装にはwshしか無い
pastebin.com/jwAQnTef
122 :
108 :2013/09/14(土) 17:05:15.57
>>121 すばらしい。
このスレ的にはアレですが、解決策ありがとうございます。
おいおい
>>108 > バッチファイルでやりたいのでバッチファイルスレで質問してるつもりなんですが、
> 他の方法を使わない理由をいちいち全部挙げてからでないと回答が出ないもんなんですか?
こんなこといってたくせにそれかよ
124 :
108 :2013/09/14(土) 23:13:28.98
>>123 出来ない理由を覆されたので問題ないです。
>>121 バイナリのインストールを必要としない方法ではほぼWSHしか無いが、WMI呼べるならなんでも良いだろう。
一時ファイルにスクリプト吐いてdebugコマンドで必要な実行可能バイナリ生成して実行、とかも不可能ではない。
>>123 111で反省してたように見えたのに、なんつうかデフォでそういう人なんかね?
126 :
デフォルトの名無しさん :2013/09/15(日) 05:59:54.41
自分で考えようともしない馬鹿だからどーせすぐ死ぬだろ
debugって32bitだけじゃないの
>>127 debugは16bit時代の遺物だからなぁ…
テキスト化したCOMファイル…もダメか。
まだ手はあると思うけど、出てこない。
現在ログインしているユーザーのユーザーフォルダを表すパスって ~ ですよね? cd ~ でそのユーザーのユーザーフォルダにいけると思ったんですができませんでした
cd %USERPROFILE%
>>130 /dオプション付けた方が安全だよ
pushdならオプション不要だけど
cd /d %USERPROFILE%
pushd %USERPROFILE%
>>129 節子それUnix/Linuxの話や
cmd.exeでは上の通り環境変数を参照するのが良いかと
%homepath%とかもある、俺は何となく字面的にこっちが好きだから使ってるだけだが
@rem = '--*-Perl-*-- @perl -x -S %0 %* @goto :eof @rem ';
コマンド実行時の標準出力を意図通りに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をそれぞれ一行ずつ表示する形になるだけで、目的は果たせませんでした。 それぞれのパス部分のみを一行に並べて表示する方法をお分かりの方居りましたらよろしくお願いいたします。
>>134 for /Fを使ってSourceとDestを環境変数に突っ込んで後で出力する。
set /Pのプロンプト文字列(改行されない)を使うって手もあったと思うが、そこまで拘るならバッチ以外も想定したい所。
136 :
134 :2013/09/16(月) 20:03:51.75
>>135 さん、レスありがとうございます。
for /Fコマンドで環境変数にSourceとDestをそれぞれ設定後に出力、という手順でできるんですね。
forコマンドは使ったことないので、ヘルプで調べながら挑戦してみます。
回答いただきありがとうございました。
いいってことよ
start X start Y start Z のように複数のショートカットをまとめて起動するbatファイルを作成したのですが これらを一斉にアクティブ、最小化、閉じるなど管理する方法はないでしょうか 起動しているものはインターネットブラウザなどです
>>138 終了や強制終了は出来るけど、それ以上の操作をしたいならWSHとかもしくは操作自動化マクロとか使ったほうが良さげ。
そもそもGUIはコマンドプロンプトで操作するものじゃないし。
>>139 開いた複数のウインドウをすべて終了できるのでしたら十分です
素人質問で申し訳ないですが、どのように記述するとよいでしょうか
連投すいません
いろいろ調べてみましたがどうやら検討違いな質問だったようです
ですがWSHを使うという情報が手に入っただけで大きな成果でした
>>139 さんありがとうございました
最小化 start shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257} 閉じる taskkill /im X & taskkill /im Y & taskkill /im Z
「for /F」って「for /f」でも動くと思うんだけど 前者の書き方をする人が圧倒的に多いよね。なんでだろ?
圧倒的かどうかは知らんが /? 見ると大文字だし コマンドによってはスイッチの大文字と小文字の区別があるものもあったりしたような コマンドではなく cuiアプリだったかも知れんが。 あと、スイッチをわかりやすくする為とかじゃないの? 俺はラベルと環境変数名だけ大文字にしてる。
>>144 for /? での表示が /F になってるからでしょ。
オプション文字はたまに大文字/小文字区別することあるから...
リロードせずに書いたら、被ってた... orz
まあどのコマンドもヘルプ見るとオプションは大文字だけど 大抵は小文字でも動くし小文字で書く人も多い。 でもforに限ってはなぜか大文字で書く人が多めな感じはするね。
>>144 そのオプションの大文字小文字の区別有無は知らないけど、
forコマンドの%%1文字変数は大文字小文字が区別されるから(震え声)
強調だろ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でつまづいてる?) どうしたらいいでしょう?
for () だと変数は逐次更新はされないから、やるなら do call :sub %%A みたいに使わないとダメなんじゃないっけ
>>151 >パラメータは変数のように部分抽出できない為?
できない為。
>3行目と4行目が正しく実行されませんでした。
%環境変数%の展開はコマンドを読んだ時点で行われる。
「for %%i in (*) do ([改行]〜中略〜[改行])[改行])」というコマンドを解釈した時点で「%B:~54%」が展開されてしまう。
setlocalコマンドかネストしたcmd.exeで遅延展開を有効にして%環境変数%の代わりに!環境変数!形式を利用するか、
callで飛んで処理したりコマンド自体にcallを付ける等で環境変数の展開が毎回行われるようにしなければならない。
%B:~54% 54てなんだ?間違ってるんじゃないのか? 日付の書式はどうなっている?[0925] とかの4文字なら %B:~14,-2% for %%i in (*) do (set A=%%i for /f "delims=" %%A in (%%i) do ( set B=%%A call :sub )) exit /b :sub >> ..\result\res_%A% echo %B:~14,-2% だがこっちのほうが簡潔だし、日付の書式の文字数が一定しない9月25日とかでも対応出来る for %%i in (*) do ( for /f "tokens=3 delims=[]" %%A in (%%i) do >>..\result\res_%%i echo %%A )
155 :
151 :2013/09/25(水) 12:25:58.64
>>153 ありがとうございました。
callで:subに飛ばして解決できました。
>>154 54は固定長でROBOCOPYのログなんでファイル名までがそんくらいだったんです。
ありがとうございました。
コマンド1 引数 コマンド2 引数 って書いてもコマンド2が実行されません コマンド1 引数 & コマンド2 引数 って書くとコマンド2は実行されますが コマンドの量が多くなると可読性が失われるので困ってます アドバイスお願いします
具体的に書けよ。 どう考えても書いたコマンドに問題があるとしか思えん。
もしコマンド1がbatとかならcallで呼ぶ
ipconfigコマンドを実行するとネットワークカードのIPアドレスを表示出来ますが LANケーブルを抜いた状態だと例え固定IPを設定していてもIPアドレスが表示されません。 LANケーブルが抜けていてもIPアドレスを表示できるコマンドはないでしょうか?
詳細忘れたけどnetshで見れなかったっけ
161 :
159 :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
っていうのを入れないとただの文字として扱われてたからいるよね。
なんていうか、
<イレル 「考えすぎでしょうか」
人がすんなりできる事をいちいち詰まってドツボに嵌る人生なんだなって。
すまん、よく分からんのだが %の展開を2回するのを遅延展開というのか?
>>163 2回というか、2重?
遅延展開は %%変数%% でも !変数! でもいいらしい。
「!」が使えるのはNT系だけど、いまどき 9x で新規バッチなんて作らないだろうし。
ちなみに今 call と %%変数%% でやってみたらできました。
%%変数%% を使う場合でも
> setlocal enabledelayedexpansion
ってのを入れないといけなかったんですね。
> %%変数%% を使う場合でも > > setlocal enabledelayedexpansion > ってのを入れないといけなかったんですね。 そんなことはない あと全角キモいからやめろ
>>165 でも、エラーになるんですけど。ちなみにWindows7です。
call 使わなかったら %変数% っていう文字として処理されるし。
call %%hoge%% のパターンは遅延展開とは言わん
>>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」になるよ。
ただ、プロンプトではパース時に展開されてそれっきりで二段展開すらされない。
プロンプトとバッチファイルでパース動作が違ったりとか、
状況によってクセのあるパースや展開されたりとか、
ダメ文字やエスケープの不備とか…バッチやシェルスクリプトのこういう所は嫌いというか苦手だわ…
>>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行目どういう意味?
遅延展開は見えないが %多段展開は echo on で見えるだろ
171 :
162 :2013/10/08(火) 22:22:17.12
>>169 >>168 さんのは動きました。
すいません。
もしかしたら別のところで引っかかってたのかも。
ファイル名の後ろにつなげようとして %%~nS とか使ったときに、
変更前のファイル名のほうでやっちゃってエラーが出たりしたので、それと混同したのかも。
「!」の方はそれだけだと文字扱いでしたが。
「<イレル」は校正のやり方
今ちょっと微妙にマイナーなライトノベル作家のスレに常駐してるので。
ちょっとしたジョーク。
>>171 アチコチの情報を漁るのも良いけど、ヘルプをまずちゃんと読んだほうが良い
体系的な知識が得られるので
それから、コマンドヘルプも活用できる
今回の遅延環境変数(!)の話なら
set /?
>>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あたりも為になる。
>>173 解説ご苦労様と言いたい所ですが169さんは質問者じゃないと思いますよーwww
>>174 ・・・ああ、色々盛大に勘違いしてたorz
>>168 call echo %^A%
ってやればプロンプト入力でもいける
とあるファイルの、フルパスでなく、属する直上のフォルダ名を取得する方法を教えてくだちい
for %%A in ("%~1\..") do echo %%~nxA pause
おおすごい! \..の部分で階層一つ上げてるってわけですかね? サンキュウベリーマッチョ!
for %%A in ("%~dp1\.") do echo %%~nxA pause
set rtn = %errorlevel% exit rtn ↑のようなコードを見たことあるんだけど、2行目は「exit %rtn%」になるんじゃないの?
なことはない
今試したけど、それ無効(errorlevel値に影響しない)になってると思われる batのerrorlevelは別にexitで値を返さなくても返されるので まあ意図したようには動作するけど dir z: (存在しないドライブ名) set abc=9 exit abc と exit %abc% で試せば分かると思う
184 :
181 :2013/10/23(水) 02:02:48.29
>>183 試してみたらやはり「exit %abc%」の書き方が正解みたいですね。
自分が見たサンプルはたまたまうまくいってただけっぽい…
勉強になりました。ありがとうございます。
いや、だからexitに数値指定なしだとbatでのerrorlevel値がそのまま帰るんだよ 多分exitは数値じゃなかったらパラメタは無効にするんだと思う だから set rtn = %errorlevel% exit rtn この2行と exit とは等価となってる
等価って書いたけど間違っているかも知れない exitだけだと 受け側がbat以外のプログラムだったら復帰値として errorlevel値が帰らないかもしれない(未確認)
cleanmgr /c c: /sageset:1 cleanmgr /c d: /sageset:2 これをbatファイルから実行しても1行目しか実行されません CドライブとDドライブのディスクノクリーンアップが出来ればOKなんですが 何か良い方法ありませんか?
バッチファイルはその行の処理が終了しないと次の行に行かないので この場合Cのクリーンアップが終了するまでDのクリーンアップは起動しない。 そしてcleanmgrは複数同時起動しないのでCとDのクリーンアップを同時に行うのは無理。 ちなみにわかってるとは思うけどsagesetはオプション設定で実際のクリーンアップはsagerunね。
設定用バッチファイル cleanmgr /c c: /sageset:1 cleanmgr /c d: /sageset:2 実行用バッチファイル cleanmgr /sagerun:1 cleanmgr /sagerun:2 こういうふうに分けて書いてたんです 設定は1度きりしか行わないのでc. batとd.batに分けて実行することにします PCから離れている間にディスクノクリーンアップを行いたいので、 実行はCとDの二つのドライブをコマンドプロンプトから一回の呼び出しで行うにはどうしたらいいでしょうか?
バッチの問題じゃなくてソフトの問題だってレスしてくれてるじゃないの。諦めよう
わかりました
試してないけど、終了してないから2回目が起動できないのなら終了させちゃえば良いのでは? cleanmgr /c c: /sageset:1 taskkill /f /fi "imagename eq cleanmgr.exe" cleanmgr /c d: /sageset:2
>>192 それtaskkillが実行される時はcleanmgrが終了した時だから意味なくない?
Windowsのコマンドラインで、文字列の最後尾に0x00のNULL文字を追加した文字列を 任意の変数にセットする方法を教えて下さい abcd0x00 abcdの後に0x00が1つの合計5文字
バッチファイルでバイナリ文字列扱うとか無謀すぎると思う 変態という名の神々が戯れにやる類の仕事ではなかろうか
常識ある組織なら、然るべきスクリプト言語を使わせるだろう。 「Windows標準でないからNG」とか喚くような所なら、さっさと辞めるが吉。
Windows標準ならWindows Script Hostがある
>>194 未検証だけどバイナリエディタで0x00の1バイトファイル作っておいて、
typeコマンドで当該ファイルを変数に流し込めばいけるかも
>>198 「バイナリエディタはWindows標準でないから使用はNG」とw
真面目にやるならdebugコマンドだが、最近のWindowsには付属してないんだよなぁ・・・
>>201 16ビットのエミュレーション機能が消えて同時に消えたとか聞いた気が。
ちゃんと調べたりしたわけじゃないんで間違ってたらすまん。
スクリプトは使用したくないのであれば下記のバッチファイルを使用する。 @echo off empty.exe * ファイル(F) --> 名前を付けて保存(A)をクリックする。 ファイル名(N) で 必ず ダブルコーテーション でファイル名をくくってください。 バッチファイルは "メモリ開放.bat" ってあるんですけど、「必ず ダブルコーテーション でファイル名をくくってください」 ってのは何で?他のサイトだと普通にempty.batとかで保存していいみたいなんだけど
拡張子が.bat.txtにならないようにだろ ていうかそのサイトで聞け
メモリ開放!
206 :
名無しののVBS :2013/11/09(土) 05:27:27.39
””って拡張子修正用と言ってたような気がする
vimのコマンド作って便利になった
<"C:\TEST1.bat"の内容> C:\TEST2.bat notepad <"C:\TEST2.bat"の内容> mspaint 上記2つのファイルがある時にコマンドプロンプトから"C:\TEST1.bat"と入力してエンター押すと ペイントは起動するのですが、メモ帳が起動しません。 メモ帳も起動させたい場合はどのように記述すればよいのでしょうか?
>>208 batからbatを起動すると制御が起動したbatに移動し元には戻ってこない(ジャンプってこと)
mspaintが終了するまでnotepadを起動しなくて良いのなら
call test2.bat
同時に起動するなら
start test2.bat
>>209 制御が戻ってこないとは知りませんでした…
callでバッチリうまくいきました。
ありがとうございます!
callとcmd /c、startとcmd /kはどう違うの?
メインメモリの空き容量が・・・
気にしない
シェルスクリプトのスレ誘導してくれ
>>218 まずvlcに直接喰わせたときに、そのファイルはちゃんと出力されるのか?
話はそれからだ
220 :
218 :2013/12/05(木) 10:45:55.06
今更ながらコピーしたのをサクラでペーストし、後ろの半角スペースを削除したら正常に出力されるようになりました
教えてください 既定のzipの関連付けは確か >assoc .zip .zip=CompressedFolder だったと思うんだが、いつの間にか >assoc .zip 拡張子 .zip のファイルの関連付けが見つかりません になってしまっていた。しかし、 >start a.zip で圧縮(zip)フォルダが起動する。 なぜだ?
てめえの既定など知らんわ そもそも関連付けはマシーンではなくペルソナにメガ進化している
.zip=CompressedFolder はWindows8の既定
.cabや.lzhも同じような… assocは何の意味があるのか
コマンドでビープ音を出すことは出来ますか? 可能ならスピーカーがミュートになっていても音を出したいのですが 無理ならスピーカーからでも良いので何らかの音が出せれば良いです。
>225 例:コマンドプロンプト画面で以下のように打ち込むと、Cドライブのルートフォルダに"Beep1.bat"ができる。 それを実行するとビープ音が一回鳴る。 (※「^G」と表記した箇所では、実際には[Ctrl]+[G]を押す事。これによりアスキーコード7が入力される) echo @echo ^G > C:\testBeep.bat
227 :
226 :2013/12/07(土) 15:26:39.33
例として挙げたファイル名をうっかり書き間違えた。orz とにかく"C:\testBeep.bat"なら"C:\testBeep.bat"を実行すればOKって事で アスキーコード7は元々ビープ音を鳴らす為の制御コードだが、PCによっては ヘッドホンを繋いでるとヘッドホンからしか聴こえない場合もあるから注意。 こればかりは実際どうしようもない。
Windows7以降はビープ鳴らせないんじゃなかったっけ
コマンドプロンプトでCtrl+Gじゃなくて普通にキーボードから「^G」って打ってエンター押したら いきなりIEが立ち上がってGoogleで"undefined"を検索した状態になってすげえびっくりした。 なんなんだこりゃ?
私のWindows7(Pro)64bitでは、ちゃんと
>>226 の方法でビープ音が鳴るよ。
[Ctrl]+[G]を2回続けた場合はビープ音も2回鳴る。
すみません、スクリプト初心者で色々と試行錯誤の上、ちょっとハマってしまったので教えて頂けないでしょうか。 やりたいことは以下の処理が出来るバッチファイル(check.bat)を作りたいのです。
232 :
231 :2013/12/08(日) 05:55:24.55
(1)A)のコマンドを実行し、その結果に「kdb106.dll」という文字列があれば(2)の処理に進む、無ければ何もせずバッチ処理終了 ↓ (2)B)のコマンドを実行し、その結果に「PCAT_106KEY」という文字列があれば(3)の処理に進む、無ければ何もせずバッチ処理終了 ↓ (3)「check.bat」と同じディレクトリにある「update.bat」を実行し、処理終了。 ※「update.bat」はちゃんと動くものが用意されています
(1)set a = A | findstr kdb106.dll if %errlvl% (2)set b = B | 略 (3)update.bat こんな感じだけど記述は適当です 何にハマったのか気になります どこまで出来たのか気になります たぶん何もしてなくて丸投げなんだろう と思いますがいかがですか
(cmd && cmd)ってbatで出来たっけshellだけだっけ
235 :
231 :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で特定の文字列があるかどうかをやりたいのですが、
うまく変数に入ってくれないのです。すみません。。。
236 :
231 :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文をどう使えばいいでしょうか?たびたびすみません。
>>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
ノーヒット処理
訂正 パイプ渡しでへたに空白は入れない方が余計なミスを発生させない(後には空白を入れてもいい) reg query xxx| findstr "str" あと実行結果をコンソールに表示したくない場合出力をnulデバイスにリダイレクトする findstr "xxx" >nul 又は findstr "xxx" 1>nul 標準出力だけでなくエラー出力も表示させたくない場合は findstr "xxx" >nul 2>&1
あと、そもそも環境変数に複数行データを格納することは出来ない
240 :
231 :2013/12/08(日) 08:35:19.32
>>237 さん
情報ありがとうございます!!
errorlevelで判別し、分岐処理させることが出来ました。
これでうまく作れそうです。
本当にありがとうございました!!
241 :
231 :2013/12/08(日) 08:40:10.36
>>230 ビープとはビープスピーカー(PC本体に付いてる奴)を鳴らすってことであって
音声出力のスピーカーから鳴る奴は違う。
>>228 >>242 マザボにビープスピーカーが無い場合、XP以前でもサウンドスピーカーで代用ビープが鳴ってなかったか?
代用ビープってなんかワロタw 昔飲んだ代用コーヒーを思い出した…
ファイルのタイムスタンプの時間の変更方法を教えてください。 日付ですと、以下のように一旦変数に入れて戻すことで可能ですが、時間の場合この方法は使いづらいのです。 set NOWDATE=%DATE% date 2000-01-01 copy /B "hoge.txt" + date %NOWDATE% 外部ツールを使わない方法を模索しております。よろしくお願いいたします。
scriptかpowershell
247 :
245 :2013/12/10(火) 23:15:11.36
>>246 スクリプトですね、調べてやってみたいと思います。
レスありがとうございました。
内部ツール生成は? 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
非常に基礎的なことだと思うのですが・・・ <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ファイルも出力されません。 ちょっとわかる方いらっしゃいましたらアドバイス頂けないでしょうか?
シャットダウン中ってプロセスの起動制限無かったっけ? startの代わりにcallじゃいかんのか?
251 :
249 :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が吐かれていないのと
納得出来ないんです。
うーん、、、複雑だなぁ。
>>251 念のために確認するけど
a.txtとかb.txtって実際にはフルパス指定してる?
それか、先頭に
pushd %~dp0
を書いてみれば?
253 :
252 :2013/12/14(土) 15:54:57.38
上のレスは無視してくれ カレントはscriptの位置になってるようだ アクセス権の問題かとも思ったけどSYSTEMはフルになってるし(まあ念のために確認してみて) でもscriptフォルダに余計なファイルを書くことはお勧めできないので 別に用意してそっちに書くようにすてはどうか? ちなみにlogoff scriptでexeを起動するなんてことは 俺はやっているしログファイルも作成してるんで出来ないことはないはず
254 :
252 :2013/12/14(土) 15:57:28.16
↑ logoff scriptはshutdown scriptと読み替えてくれ
a→b→a としたいなら、 bに exit /B を付けてaに処理が戻るようにしてみては。
exit /? を参照ね。 終了コードを付加することで、戻ったバッチ側で判定して分岐なんかの処理もできる。
257 :
249 :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の権限はフルでした。
258 :
249 :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
で、
>>249 が動かない理由は解決した?
もしかしてフルパスで↓だと終わらないぞ
start /wait "c:\b.bat"
>>249 状況から見てb.batが見つからないからエラーが出て止まってるだけだろ
試しにa.bat内のsart /wait c.bat
に変えて通常実行してみりゃ、
'c.bat'がみつかりません。とかのメッセージボックスが出て止まったままになるしさ
vol c: | findstr /C:シリアル番号 で出てきたシリアル番号だけを抜き出して表示したいのですが どうすりゃ良いか教えてください
for /F "tokens=3" %i in ('vol c: ^| findstr /C:シリアル番号') do @echo %i
263 :
249 :2013/12/15(日) 04:16:05.52
>>259-260 アドバイスありがとうございます!!
よくよく見てみたらおかしかったです。
batでプログラムを作っているのですが、 start... start... で別のプログラムをいくつか同時起動してそれらが全てが自動終了したときに 次の処理に進みたいのですが、こんな判定ってできますか?
どっかに動作中を示すファイル作っておいて定期的に存在のチェック って方法をやってるけど、そういう用途のコマンドとかコンソールアプリあるなら俺も知りたいな まぁ、そこまでやるなら...って話はもちろんわかるけども。
notepad | notepad | more
横だけどこれってどういう仕組みなの? パイプが出力を次のコマンドに渡すやつだってことはわかるけど、 notepadは何も渡さないとして、なんでmoreで止まるの?
こんな感じかな、 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
待つんじゃなくて、終わったプロセスに呼んでもらったほうがイインジャネ? 2回実行されたら次へ進むって。
それだと終了した複数プロセスから同時に呼ばれたらどうする?
>>262 ありがとう
ついでにこれも教えてください
「ABC-DEF」の「-」をなくして「ABCDEF」と表示させたいです。
>>268 x exist
o not exist
>>265 .batでやってるなら晒してよw
>>269 出来た?見タイヨー見たいなー見たいねー。
>>274 使う処理をcallで色々呼びまくってて
もはやどことどこが使われてるか分からないほどだから無理
後実際には、sleepをユニークな名前でコピーしてサブプロセス終了時に殺す方法をとってる
なるほど、さくっと想像できない。それほどまでにあれなのか。ありがとう。 まあ、ちょろっとやっつけでやったものってのは得てして肥大化してよくわからなくなるよな。
>>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
>>272 for /F "tokens=3,4 delims=- " %i in ('vol c: ^| findstr /C:シリアル番号') do @echo %i%j
複雑な処理するなら
>>273 みたく一旦変数に入れてゴニョゴニョしたほうがいいけどな。
for /F "skip=1 tokens=3,4 delims=- " %i in ('vol c:') do @echo %i%j
start /b を併用してるバッチで find "1" "1.txt" | find "1">"2.txt" これだと頻繁に ファイルにアクセスできない ってバッチ全体が中断してしまうんだけど find "1" "1.txt" | find "1" 1>"2.txt" 2>nul これだと中断される事がなくなったのは たまたまで関係ないのか理由あっての事なのか誰か分かる人います? 検証してる途中なんだけどどこで止まってるか検討がつかない (echo onやログを採ろうとすると速度がおそくなるせいなのかエラーが出ない)
284 :
283 :2013/12/19(木) 13:07:11.57
あれから再びエラーでとまったから無視してください
あほなことやってるw
>>283 find "キーワードA" "入力ファイル" | find "キーワードB" > "出力ファイル"
これならまだ分かるが、
find "キーワードA" "入力ファイル" | find "キーワードA" > "出力ファイル"
何故こんな事をしたんだ?さっぱり意味が分からん。
>start /b を併用してるバッチで そんなもん使うもんじゃねーw
横から聞くけど何をやりたいの? バックグラウンドで走らせるほどfindに時間がかかるの?
283自体にしても時間掛かる処理の合間にfind走らすとかは幾らでも考えられるし、そこ拘る所じゃなくね? 287のレス見るとstart /b自体使いどころ無いって言いたげに見えるから他の定番があるのかと思ったんだが。
291 :
283 :2013/12/21(土) 11:14:47.60
無駄話のタネになってしまって申し訳ない
>>286 挙げたのはサンプルだから適当に書いただけで実際は後者しかやらない
findを重ねてるのは単純にそれしか絞込みの方法を知らない為、お勧めがあれば知りたい
start /b を使ってるのは
>>290 の言う様に時間のかかる処理をしてるから
数万から十数万行の複数個あるログから特定のデータを取り出して
判定やらなにやらした結果を書き出すため複数コアに分担作業をさせている
分担が等分だと終了タイミングがずれ遊びの時間が増えるから
不等分且つ終わり際を細かくしてる関係上ウィンドウがポコポコ出てくるのを避けたい為
巨大なテキストファイルをメモ帳で開いてCtrl+Hで出てくるダイアログで置換を行うとものすごく時間がかかってしまいます。 コマンド、もしくはWindowsの標準機能でもっと高速に行うことって出来るのでしょうか?
>>292 ここに来たってことはもしかしてもしかするとコマンドでの回答をお求めですね!
ずばり ? でしょう!または help !千里の道も一歩から。
WSHもそれなりに時間かかるし grep置換出来るツールでやるのが一番早いがな。
296 :
デフォルトの名無しさん :2013/12/23(月) 14:30:19.14
メモ帳で作業するのやめたら?
どうしてもツールを入れたくないなら ファイルを小さく分割するのがお手軽かもしれない
それ、手間が増えるだけじゃねぇの
A 松 B 竹 C 梅 という内容の「ランク.txt」がある時、 findstr "B" "ランク.txt" を実行すると B 竹 と表示されますが、これを変数に入れることって出来ますか? set rank=findstr "B" "ランク.txt" とかやってもダメでした。
環境変数ってそういうものじゃない レジストリとかシステム設定に書き込むような使い方 やりたいことがわからないけど ファイルに突っ込むか 標準入力を受け付ける別のコマンドに渡すか どっちかになると思う findstr "B" "ランク.txt" > workfile.log findstr "B" "ランク.txt" | coolcommand.exe
標準出力に出るならとりあえずforで良いんでは
cmd.exeはforでunixのshellのバッククオートのような事ができる for /?でヘルプ
303 :
デフォルトの名無しさん :2013/12/24(火) 02:52:10.89
どしても.batでやりたいと言うなら止めはしないが かなり使いにくいからスクリプト言語にできるのならスクリプトでやることをおすすめします
for /f "usebackq delims=" %%A in (`findstr "B" "ランク.txt"`) do set rank=%%A echo %rank% for /f "usebackq tokens=1,2" %%A in (`findstr "B" "ランク.txt"`) do (set rank=%%A set ranq=%%B ) echo %rank% echo %ranq%
305 :
299 :2013/12/24(火) 21:22:41.02
>>300 出来ればバッチファイル1つのみで実現したいのです。
>>301-302 for/?を見ましたが難しいコマンドですね…
>>304 ありがとうございます!最初の2行でバッチリできました。
tokensを使うとそれぞれの項目を分けて取得することも出来るんですね。参考になります。
確かにヘルプは無知相手には敷居が高い表現が多いが日本語だからモニターに穴が開くほど繰り返し読めば理解に至るはずだけどここで聞いた方が早いのも確かだし有益だしそこから学び次回いこう応用時などにヘルプを利用すればいいか
日本語のハードルが高いようだ
for /F の eol オプションとか普通の感覚だと、ん?て感じだしな。 てか何の略なのかいまだにわからん。
ぐぐりゃそれらしいものにすぐあたるがな
eolの意味も分からずに、よくもまぁプログラミングなんぞしてるな
単なる英単語で構成された指示書程度深く理解する必要も無かろ パフォーマンスを求めるようなハードを理解しなきゃならんプログラムでもあるまいし
いやいや、別にeolのAcronymがわからないとは言ったつもりはないんだが。
for /?
eol=c - Specifies an end of line character (just one character).
eol=c - 行末のコメント文字を指定します (1 文字)。
ヘルプ読んだ上で実際に使用したら、ん?行末じゃないよな?ってなるから、ヘルプの表現て難しいよな、
という
>>306 の流れに乗っただけ。
このeol指定ってEOLではなくて実際はコメント行(≠行内コメント)指定で、 誤解を生むというか説明間違ってるってスクリプトの偉い人が書いてたような。
英語詳しくないけど line って単純に 行 って意味だけじゃ無いし誤訳なだけなんでしょな
訳も微妙だけど誤訳じゃなくて英文の時点で説明が間違ってるというか、 元の意図は説明のとおりで実際のところは実装が間違ってるだけにしか見えない。 一般的なコメント文字(仮に「;」とする)は普通「コード;コメント」「;コメント」「空白文字;コメント」って使うけど、 これを機能として表記すると「行の終わりを意味する文字」だからfor /?の説明のeolと完全に一致するよ。 日本語説明、英語説明、一般的なコメント文字、どれを基準に考えても実装が間違ってる。
316 :
デフォルトの名無しさん :2013/12/26(木) 16:05:23.64
その行の処理対象の終端だろ それ以降の無視をやらないのか?
「コード;コメント」だと普通にコメント部分もトークンに入ってくるよ。 EOLというよりSOCL(start of comment line)とか呼びたいくらい。
>>316 だよな。
何が問題なのかさっぱりわからん。
>>318 デフォは「;」がeolだからコレが途中に入った文字列を処理してみ。
平然と「;」以降も入ってくるから。
Erase One Line
323 :
321 :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の仕様が変わったんじゃなくて自分がヘマしてただけだったんだな。
>>322 それが理由なら
if x%1 == x%2
の方が良くね?
325 :
322 :2014/01/02(木) 11:40:46.75
>>324 その部分はリンク先と同じにした。お好きにどうぞ
つうか %1 %2 に ! 文字があると副作用があるかも知れないので対策が必要
貧弱なパーザだニャー
アッセンブラで作ってるからな
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」を入れてやらないといけないが、ここに値を入れるコマンドがわかりません
開始オプション欄はコマンドでは入りません セキュリティ対策なのか一種のバグです 面倒ですが、ここだけはリモートでGUIを開いて直接入力する必要があります
そのbatはクライアントがログオンした時のHomeディレクトリに置けば(コピーするとか)良いと思うけど?
では、そのBATをHomeディレクトリに置くにはどうするのでしょう?
テキストファイルの内容を1行毎に空行を追加して表示するにはどうすればよいですか? for使えば出来そうなんだけど思いつかない… <test.txt> あああ いいい ううう ↓ あああ いいい ううう
echo %%A&echo.
元のファイルの空行が消えてもいいのか?
改行コードを無理矢理力業で変数に入れる方法があったけど忘れた
wsh使え
@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"); } };
app1.exe "%1" | find "hoge" のような処理の時、app1.exeのerrorlevelの取得方法を教えて下さい。
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上でよく確認してから使うこと
また、そういうことじゃなくってapp1.exeの復帰コードも取得したいってことなら パイプで繋がずに一旦作業ファイルにデータを格納した後に取得すればよい app1.exe>tmpfile.tmp set app1_rc=%errorlevel% find "hoge" tmpfile.tmp
342 :
339 :2014/01/15(水) 11:34:16.05
>>340-341 さん、レスありがとうございます。
わかりづらい説明ですみません、質問の趣旨は341の方でした。
一つ前のアプリの終了コードの取得方法がわからずお尋ねした次第です。
一時ファイルに書き出す方法で解決しました。
ワンライナーでやりたかったため以下のようにしました。
(app1.exe "%1" &>"tmpfile.tmp" echo %errorlevel%)| find "hoge"
夜分遅くにありがとうございました。
なんか文字化けしてますね? (app1.exe "%1" &>"tmpfile.tmp" 以下略〜 半角アンパサンド記号で繋いでます。
くっさ
345 :
340 :2014/01/15(水) 16:59:45.44
>>342 トリッキーであまりお勧めできないですが、どうしても中間ファイルなしで1行で書きたければ
app1.exe|find "hoge"&set app1_rc=%errorlevel%
346 :
340 :2014/01/15(水) 17:15:22.05
上記取り消し これでいけるかと思ったんだけどダメだな
>>346 %%は行の解釈時に展開されるからな。
!!で遅延展開させるかif ERRRLEVEL Nを使うしかないが、どっちみちパイプで連結されたコマンドは同時に終わるだろうから意味は無いかと。
(app1.exe "%1" & ( call echo %%%%errorlevel%%%% >&2 ) )| find "hoge"
質問です。 ドメインに参加した端末で、everyoneにローカルの管理者権限を付けたいのですが、コマンドではどのように書くのでしょう? やりたいことをGUIで説明すると、compmgmt.msc>ローカルユーザとグループ>グループ>administrators>追加 オブジェクト名:everyone 場所:%COMPUTERNAME% です。 試したこと↓(どちらもダメでした。) net localgroup "administrators" "localhost\everyone" /add net localgroup "administrators" "%COMPUTERNAME%\everyone" /add
350 :
349 :2014/01/24(金) 14:28:34.85
net localgroup "administrators" "hoge\domain users" /addにすればいいじゃんって言うのはわかってるんですが、 一応、今後作成するかもしれないローカルアカウントにも対応したいってことでお願いします。
それがバッチファイルに関する質問ではない Windows板に行け より良い方法はお前をクビにして、もっとスキルのある派遣を雇う事だ
>>349 のような能無しは社史編纂室に異動させるべき
コマンドプロンプトでコマンド打ってると、挿入モードから上書きモードに 勝手に切り替わってしまうことありませんか? そのたびにInsertキーを押して挿入モードに戻していますが、何が原因なんだろ?
ない
> 何が原因なんだろ? Insertキーを押したのが原因
コマンドプロンプントンのショートカットキー一覧でも眺めてみるしかない
ぷろぷんとん?
折りたたみ自転車
for /f "tokens=*" %%i in (test.txt) do call :sub "%%i" :sub set str=%1 echo %str% test.txtの中身は「abcd%efg」一行 上を実行すると%が消えちゃって「abcdefg」と表示されるんですが、%を表示する解決法はないでしょうか?
test.txtにあらかじめ書き込んでおけば?
>>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:
だったら死ぬような目にあうよ
>>361 ありがとうございます!
期待通りに作動してくれて欲しかったバッチを完成することができました!
for /f "tokens=*" %%i in (test.txt) do call :sub "%%%%i"
>abcd&rmdir /s /q c: こーいうのいんじぇくしょんって言うの?
>>364 インジェクションそのものだな。
コマンドインジェクションとかシェルインジェクションとか呼ばれてたはずだ。
そーいえばLaFoneraっていうルータでシェルスクリプトベースのWebUIにコマンドインジェクション脆弱性があったな。
ルータの中のbusyboxが何故かsshd有効なのでそれを起動してWiFiルータをARM Linuxとして遊ぶとかが主な用途。
typeコマンドとかでテキストファイルの内容を表示することが出来ますが スペースとタブしか含まない行は除いて表示することって出来るのでしょうか?
cmd /f:off findstr /v /r /c:"^[(スペース)(タブ)]*$" foo.txt exit
for /f "delims=N" %I in ('cmd /u /c echo 三') do findstr /r /c:"[^ %I]" test.txt
forってDOSのころから変態だったけどNTになって変態を超えたよね
370 :
366 :2014/02/03(月) 23:42:25.65
>>366 ありがとうございます。望みどおりの動作でした。
>>367 「三」が「TAB文字+N」とは知りませんでした。
逆CLASSってこんな使い方をするんですね。勉強になりました。
set sequence=月火水木金土日 set today=%sequence:~3,1% echo 今日は%today%曜日です。 ここのオフセット数3に変数使いたいのですがどうやったらいいでしょうか
set sequence=月火水木金土日 set s=3 call set today=%%sequence:%s%,1%% echo 今日は%today%曜日です。
チルダが抜けてた call set today=%%sequence:~%s%,1%%
おお!ありがとうございます 変数内変数ていつもはset /aで外側の%省略してたんだけどこういう手もあるのですね
echo onでいいんじゃね?
:L1 pause goto L1 ↑のバッチファイル作って実行するとEnter押してもバッチが終わらなくて無限ループするけど pauseで止まってる時にバッチファイル開いて3行目を消してからEnter押すとバッチが終了する。 これってpauseでEnter押した時はバッチファイルを再読み込みしてるって事なのかな?
一行毎に読み込んでる 処理の長いバッチファイルを実行中に書き換えると予期しないことがおきる
>>378 この仕様地味にうざいんだよなぁ…
記事読んでないけど
>>375 のとかでそれが回避できるならそれだけでも割と価値がある
最大メモリ640KiBのスクリプトだから
まあメモリーが少ない時代からのソフトだから 数KB でも節約したかったんだろうな でも、それで困ったことはないが...
ディスクキャッシュ効かせると恐ろしく速度上がるよな
逆に実行中に自身を書き換えさせていくことで変態的なことができるのか 自分にはまったく思いつかないが
>>383 なんかの結果で Goto の飛び先変えるとか実行文差し替えるとかできるだろうけど、どのタイミングでどこまで読み込んでいるかがわからん (Windows のバージョンとかによっても違うかもしれない) ので、実際にやるにはカットアンドトライでやるしかないんじゃね。
命令の読み込み中はファイルロックかなんかで書き換えできなかったと思うけど pause等で止めておけばpause以降は如何様にも書き換えられる pause前はbyte数が変わらない範囲で変更が可能 > :loop > echo test > pause > goto loop これをpause中に下のように書き換え可能 > :loop > ::ho test > ::use > goto loop つかフレキシブルにやりたいなら変動を前提とした外部bat作ってcallする方が万倍マシ
やっぱあれ行単位じゃなくてByteなのか 前にテストしながら編集してたとき 何かキー押したら明らかに行の途中の処理が動いてびびった
387 :
デフォルトの名無しさん :2014/02/08(土) 15:47:33.14
surface pro2(Windows8.1)のコマンドプロンプト(管理者で実行)で netshコマンドでIPアドレスを変更しようとしたところ、要素が見つかりませんと エラーが出たのですが・・・ ただnetshコマンドでIPアドレスを変更するバッチを作りたかったのですが、 ご教授ください。
>>387 netsh ?
とかやって操作方法を確認すれば?
バッチファイルでパーセントエンコード (URL エンコード/Web エンコード) を行うにはどうしたら良いでしょうか?
wsh powershell
@ \\pc1\share\test.txtと A \\pc2\share\test.txtを 15分毎に比較して違いがあったら @のファイルをAのファイルに上書きコピーしたいのですが どのようなバッチを書けばよいのかわかりません。 schtasksというコマンドで実現出来るのでしょうか? ネットワークに負荷がかかるので違いが無い場合は コピーしないようにしたいのですが?
fc file1 file2 || copy /y file1 file2 をタスクマネージャーで15分毎に実行する
アーカイブ属性が付くか日付が更新されるならxcopyでいいんじゃね?
>>392 > ネットワークに負荷がかかるので
比較するためにどうせファイル読み出すんなら、毎回コピーすればいいんじゃ...
更新日時とか見れば?
ま、比較はネットワーク負荷ゼロでできると思い込んでるお花畑君だからね
397 :
392 :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
IDEが必要になるほど複雑な処理はバッチではやらない
401 :
デフォルトの名無しさん :2014/02/11(火) 13:49:59.35
だな 複雑なバッチを組むと保守が大変になる
402 :
デフォルトの名無しさん :2014/02/11(火) 14:24:36.02
gomi ゴミ
変則的なコマンド書くと落ちる ifの連続でerrorlevelが同じ値を出力され続けて参考にならない 阿久津って相変わらず面白くない記事を書くね
>>403 > 変則的なコマンド書くと落ちる
> ifの連続でerrorlevelが同じ値を出力され続けて参考にならない
必死で難癖つけましたってか (w
405 :
デフォルトの名無しさん :2014/02/11(火) 23:17:33.22
本人乙
自演認定カッケー (w
ガキ共は一目で分かるな
システム環境変数のPathの末尾に「;C:\test\hoge.exe」を追加したら コマンドプロンプト画面で"hoge"と入力してエンター押すだけでhoge.exeが実行出来るようになりました。 ただ「ファイル名を指定して実行」画面から"hoge"と入力してOK押しても「'hoge'が見つかりません」 などと表示されてhoge.exeが実行出来ません。 「ファイル名を指定して実行」画面からもコマンドプロンプト画面と同様に実行出来るようにするには どうすればよいのでしょうか? スレチですみません。どこで聞けばよいかわからなかったので…
>>408 レジストリエディタでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Pathsまで開いて、
ツリーでApp Pathsを右クリック→新規→キーとして「hoge.exe」を作り、その中の(既定)の値をC:\test\hoge.exeにする。
ガキって平日の真っ昼間に、にちゃんやってる奴のことかな?
>>408 Pathを実行ファイル単位で追加する人、初めて見たかも
Pathってそんなこと(ファイル単位)できたんかえ?
>>411 PATHじゃねーだろよく見ろよ知ったかぶりしないで。
414 :
409 :2014/02/13(木) 11:18:38.74
>>408 App Pathsが定番だと思ってレスしたけど、パス通ってればApp Paths設定しなくても起動するはずだけどな。
環境変数は設定後に起動したプロセス(の子プロセス?)にしか反映されなかったりするから、設定したら再起動。
あと411-412が言ってるように普通はファイル名まで入れず、必要なディレクトリまでのパスだけ設定する。
実行ファイルをパスに指定した場合にファイル名を指定して実行で探しに行くのかどうかは知らない。
すまんなんか間違えてた
HKLMだと再起動するまででHKCUはプロファイルの再読込で済むんじゃなかったけ?
>>416 レジストリ(App Pathsとか)は対象アプリケーションが値のコピーを保持して無ければ即反映されるよ。
レジストリハイブだったかを直接操作した場合はしらんけど、レジストリエディタでローカル操作ならそう。
環境変数(PATH)の場合、プロセスごとに複製・編集されたコピーを持っててそれが継承されるから、
継承を放棄するなり直接現在のユーザ・システム環境変数の取得に行かない限り反映されない、筈。
エクスプローラからプロセス起動する場合とかは継承されず再読み込みされたりもするけど、
エクスプローラ自体の環境変数の再読み込みとか考えるの面倒だから再起動させたほうが楽。
>>399 普通に実行した状態で
...
mycommand || startide
...
みたいになにか致命的な失敗したらIDE起動して変数インスペクトできたら
便利なんだけどな
rubyだとIRB.startで簡易デバッガみたいの立ち上がってよかった
今はテキストエディタのアウトラインモードにコードの断片書いていって
カーソル行のある部分の断片だけを即実行できるようなマクロ作って
ちょっとしたテストなんかをやってるせいであまりIDEは必要としてないけど
mycommand || goto fatalerror
:fatalerror
echo デバッグしろ
start visualbat "%~f0"
goto :eof
とか仕込んどくとちょっと便利かね
419 :
408 :2014/02/13(木) 21:10:27.60
>>414 今日試しました。
App Pathsへのキー追加で[ファイル名を指定して実行]画面からも
EXE名だけで実行出来るようになりました。ありがとうございます!
ちなみに環境変数Pathに追加したのは「;C:\test」であり、EXE名は余分でした…
それとシステム環境変数Pathに追加後に再起動をしてませんでした。そのせいかも…
その点については明日また試してみます。
どうもありがとうございました。
420 :
419 :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へのキー追加もすることにしました。 以上です。
>>420 「;C:\\test;C:\SakuraEditor」を追加・再起動して環境変数を正しく追加できていれば、
App Pathsへのキー追加は不要だよ。
ファイル名の指定と実行から「メモ帳」で以下を試すと引数のファイルで開くでしょ。
notepad "C:\abc.txt"
サクラエディタでも同様な原理のはずだけど。
422 :
420 :2014/02/14(金) 23:11:01.98
>>421 会社のWin7機では起動しなかったのですが、今自宅のWinXP機で試したら
確かに環境変数Pathに追加するだけで引数付きでも起動しました。
うーん、原因がわかりませんね。
いい加減この話題が長引いてるんでこの辺にしときます…
doskeyコマンドって日常的に使ってる人いるの? 使いどころがよくわからない。
>>423 使いどころはマクロ定義(alias機能)
KI-Shellを知っているやつは相当なオヤジ
history.comしか知らない
Vzだけで十分だった
なんかオモロいことない?
call %0 限界に挑戦しようぜ! 俺は704回
再起呼び出し
× 再起 ○ 再帰
xcopyでフォルダ内のフォルダを含むコピーをしたいのですが コピー元フォルダの中身だけがコピーされてしまいます コピー元フォルダごとコピーさせるにはどう記述すればいいですか? xcopy C:\hoge\hage D:\backup /e この例で言うとhageフォルダの中身じゃなくhageフォルダごとコピー先にコピーさせたいんです
xcopy C:\hoge\hage D:\backup /e /i とか
436 :
デフォルトの名無しさん :2014/02/21(金) 02:29:48.79
robocopy使うといいよ
>>435 ハゲが足りない
xcopy c:\hoge\hage d:\backup\hage /e /i
回答ありがとうございます コピー先にもhageフォルダ作るしかないですかぁ robocopy試してみます
だから /i にすると作成されるんだよ
そういうことか理解しました
今日自宅PCでバッチコマンドの研究にいそしんでたんだが、手だけ寒い… んで今ドンキで指切り手袋買ってきたらあったかくて捗るようになったw チラ裏スマソ…
Windows7でバッチファイル作ってるんだけど質問 echoを使ってファイルにリダイレクトで出力をしてるときに、ファイルがパーミッション不足 なんかで書き込めなかったときは、"アクセスが拒否されました"ってエラー表示が出るけど、 エラー表示を一切非表示にしたいんだ 例: echo hogehoge > hoge.txt 上の例で>NUL の挿入場所がわるいと、ファイル自体出力されなくなるし どういう書式で書けば いいかな? echoを使ったリダイレクトでエラーのみ非表示って不可能?
echo hogehoge > hoge.txt 2> NUL とか無い頭でやってみたけど、全滅('A`)
2> NUL (> hoge.txt echo hogehoge)
… まあ質問者が満足したんならいいか
もはや式の意味がさっぱりだけど なんか問題あるの
()の必要性
リダイレクトを先頭に持ってくるのが気色悪い () もサブシェルと錯覚しそうだし 俺なら echo hogehoge >hoge.txt 2>NUL と書くな
>>452 当たり前だろ。
お前は実際試しもしないで色々言ってたのか?
どうしようもないな。
>>452 みたいな奴がテスターだったら恐ろしいな。
既に消化したケースと似たケースはことごとくはしょりそうw
試すもなにも、hoge.txtに読み取り属性でも付けてやるだけじゃん。 恥の上塗りっすなあw
>>450 > () もサブシェルと錯覚しそうだし
はあ?
これってechoのエラー出力じゃなくてリダイレクトのエラー出力なんだから カッコが必要って事だよね?
(echo hogehoge> hoge.txt) 2>nul これでもいい…よね? というか>444の (> hoge.txt がその後ろのechoより 前に書いて正しく動く理屈が分からん…
あ、書く順番が違うだけで結局意味は同じになるという事なのかな?
echo 0 0 0>hoge.txt >hoge.txt echo 0 0 0
(echo 0 0 0)>hoge.txt
atコマンドで例えば10時にタスク登録すると9時59分55秒ぐらいに実行されたりするんだけど、仕様ですか?
知らないけど条件判定して成立するまで待機とか誤差の範囲がある程度ならそのぶん遅延させればいいよ
余裕を見てるんだろ
ワイルドカードってトランプのジョーカーのことなんだね。知らんかった。
466 :
デフォルトの名無しさん :2014/03/20(木) 23:40:42.82 ID:w7dI4Sn/
特定のアプリケーションを手前に表示することってできますか?(常に手前にするではないです。) 例えば最小化表示されているchrome.exeを最大化する、みたいな感じです。
>>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;
>>466 実際実験してみたところ、
他のアプリは最小化してても有効だけど、Jane Styleは最小化してるとダメみたいだ
Chromeは多分最小化してても有効だけど(俺はChromium互換を使っててChromeは使ってないので確かとは言えない)
sh.SendKeys("% "); // Alt+Space+R 元のサイズに戻す
WScript.Sleep( 500 );
sh.SendKeys("R");
のようにwaitを挟まないと処理が追いつかないことがあるみたいだし
window titleに何を指定すればよいのか不明
(上のは、tasklistの一覧からプロセスIDを検索してそれを指定しての検証結果)
ipconfig /release ipconfig /renew を自動実行してくれるバッチファイルスクリプト書いてください
ただ並べるだけでした、申し訳ありませんでした
こちらの環境(win7)だと、下記のコードを実行すると「flag=1」とだけ表示される 誰か他の環境でも同様に動作するか試してほしい @echo off set flag=0 :label1 &echo comment^ echo flag=%flag% if %flag% == 1 exit /b set flag=1 goto label1
またこいつか
>>467 WSHですか。ちょっと試してみます。どうもです。
バッチファイルでホットキーを実行したいのですが方法が判りません。 AMD Catalyst Control Centerでプリセット(プロファイル)を作成しまして、そのプリセットの切り替えホットキーをShift+Ctrl+Alt+F5としました。 バッチファイル実行時にプリセットを切り替えたいのですが、どの様にすれば良いのでしょうか
バッチでは無理
This program cannot be run in DOS mode.
マルウェアを検出しました
> cipher /w:r:\ を実行すると 0x00 に書き込み中 .................. 0xFF に書き込み中 .................. 乱数 に書き込み中 .................. と、乱数まで書き込んでくれるんですが、 0xFFが出たタイミングで Ctrl+C を送信とか無理でしょうか。 > echo ^c > cipher /w:r:\ だと即終了。 > cipher /w:r:\| findstr "0xFF" だと 0xFF に書き込み中 と、いいタイミングで表示されます。
>>480 できてもトリッキーな方法になる気がするから、WSHなりなんなり使ったほうがよさげ
482 :
デフォルトの名無しさん :2014/04/20(日) 18:20:49.58 ID:47OpZGct
findstrとかで文字列を検索したいんですが、 検索したい対象が例えば、 "hoge"=123 で、この"hoge"=123全部を検索対象にしたい場合、どうすればいいでしょうか? hogeの両端にタブルコーテーションがあり、うまくいきません。
すみません、自己解決しました。 """"hoge"""=123" で検索できました。
484 :
デフォルトの名無しさん :2014/04/20(日) 20:07:42.26 ID:47OpZGct
ついでにもうひとつお願いします。 <list.txt> AAA1BBB CCC2DDD EEE3FFF というファイルがあり、 CCCとDDDに囲まれている文字列をfindstrで検索し、 その囲まれている数字を変数に入れたい場合、どう書けばいいでしょうか?
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 さっそくありがとうございます!!
大変参考になりました!!
横だけど/xって使ったこと無いな。 「findstr /x "CCC.*DDD"」 = 「findstr "^CCC.*DDD$"」 ってことなのかな?
findstr /?も使ったことないのか?
dir /s >aaa.txt 現在のディレクトリ以下の構成をテキストに書き出せますが これでヘッダの部分と各ファイルの作成時間が不必要なので無くした状態のものがほしいのですが やり方をおしえてください
Powershell便利だけど、大抵のところにはインストールされてないから意味ないんだよね 結局バッチコマンド駆使するのがもっとも汎用的なテクニックになっちゃう
@(for /r %%F in (*) do @(echo %%~tF %%~aF %%~zF %%~fF))>>aaa.txt
>>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
訂正 is_dateはis_timeにしたほうが良い XP以外だと正常な結果は得られないかもしれないけど、 まず、先頭2行をforコマンドのskip指定で読み飛ばしている(2行でない場合は要修正) 次に、時間フィールドかどうかは、各行先頭から15文字目に:(コロン)があるかどうかで判定している (これも15文字目じゃない場合は要修正) "2014/04/23 00:00"
さらに訂正 文字"&"と"^"はフォルダ・ファイル名として許されてないと思ってたが、指定できるようなので set a=%a:^=^^^^% set a=%a:&=^^^&% を :disp の下に挿入する
見直してみたら、間違ってる部分があった(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
>>493-496 492の方法で大体何とかなるんだからいい加減諦めたら?
そういうアプローチも一つの手段だけど、ながったるい
アプローチの仕方次第で変えられる訳ね cmdは奥が深いわ
tasklist実行時の出力についてお尋ねします。OSはWin7 x64です。 以下を実行したとき、 tasklist /FO CSV /NH /FI "IMAGENAME eq appname.exe" 2>NUL appname.exeが起動していない場合、 「情報: 指定された条件に一致するタスクは実行されていません。」 と出力されますが、この表示を抑止させる方法はありますか? Win XPでは抑止できていたのですが、Win7にしてからできなくて。 なお、ファイルが起動している場合の出力は利用したいのです。 お分かりの方よろしくお願いします。
1>nul 2>nul
501 :
499 :2014/04/28(月) 22:55:55.78 ID:dKlvDiul
>>500 さん、レスありがとうございます。
それですと、起動している場合の出力まで捨てられてしまうため都合が悪いのです。
エラー出力のみ抑止できる方法を探しております。
>>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
みたいに。
tasklist|find "appname.exe"&&tasklist /FO CSV /NH /FI "IMAGENAME eq appname.exe"
Win7でtasklistコマンド打ってみたけど、 どうもそのエラーメッセージは標準出力に出してるようだ ふつうにfindやfindstrでフィルタできる
505 :
499 :2014/04/29(火) 09:40:56.77 ID:phxhUks1
499です、皆さんレスありがとうございます。
>>502 さん、なるほどfind側でerrorlevel取るんですね。
tasklistでは取り方がわからなかったので参考になります。
>>503 さん、見つかった場合に次のコマンド実行ですね、参考になります。
>>504 さん、標準出力なんですね。どおりで表示の抑止がされないはずですね。
findやfindstrでフィルタしたいと思います。
表示の抑止は無理のようですので、皆さんからご提示いただいた案で行いたいと思います。
夜分遅くに対応していただきありがとうございました。
質問させていただきます
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」というファイル名に変更したいです
まずどんな手段で実現できそうなのかすら分からなかった為一番初めにこちらのスレで質問させていただきました
バッチファイルで出来ることの範囲外でしたら何か他の手段で実現できそうな方法を助言していただけたらと思います
よろしくお願いいたします
自分でやるとするならいくつかのツール、curl、yagrep、onigsed、nkf32 を組み合わせる。 ファイル名を for とかで適当に取得 & 動画URL生成 curl で動画URLにアクセス、 grep (yagrep) でタイトル抜き出し、nkf32 で SJIS化、 sed (onigsed) でファイル名に使えない文字などを適当に置換 & ファイル名を生成 リネーム 上であげたツール4つと正規表現のちょっとした知識があればこんな感じで概ね可能かと。 他の手段(バッチじゃない何か)使えるひとならもっとスマートにできると思う、 試さずに書いているので何か変だったらごめん。
telnetとか使って無理やりいたすのがお前らのJOBじゃないのか!?
JScriptやらRubyやらを使えば良いんちゃう
>>507 そのメソッドでスクレイパー書いたことあるけど、辛かった
>>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;}
}
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;
}
●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文字)も必要なら追加。
>>510 それはなんとも乙。
本体というか
>>507 の 根っこは「pixiv」や「小説を読もう」 とかのを拾ってくる用バッチ
だったので個人的にモチベーションは高くて辛くは無かったかなw
515 :
510 :2014/05/12(月) 22:07:09.17 ID:y9Wttb40
>>514 ・・・俺も小説家になろうのダウンローダ書いてたけど、なんでこんなところで被るのかと。
ちなみに出来が悪くて今はAndroidアプリに丸投げ中だけどコッチも出来が微妙という…
やる気が出たらnode.jsで一から書き直すんだ、俺。と言ってはや2ヶ月……
●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; を挿入しとくと精神的に良いかと
>>515 おやまぁ目的の一つ被ってましたか > 「小説を読もう」というか「小説家になろう」
テキストダウンロードで拾ってくると、ルビの振り方が統一されてなかったり、
挿絵を別途拾う、とか後処理もめんどくさいですよね。
node.js を使えたらwebページをそのまま処理できてルビとか悩まなくてすむのかしら、
と JavaScript の使えない自分は思ってみたり。
スレチごめんなさい
>>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%"
あまりに酷いbatに全員ドン引き 初心者過ぎる質問に更にドン引き
リネームもしないで移動させるだけなら 全部消して一行書くだけだからなぁ…
元のバッチ見てないから分からんが、リネームなしだと最後の行が駄目臭いんだが。 とりま後ろから二行目を move /-y "%filename:~1,-4%.mp4" "%MP4folder%\%FolderName%" かな。
動画のエンコードバッチで『バッチの中で複数のバッチを実行する』という事をしています 録画終了後、バッチファイル1でリネーム&フォルダBへ移動 フォルダBへ移動後、バッチファイル2を実行しリネームしたファイルを読み込み、エンコード開始 こうするとフォルダBのエンコードバッチが同じフォルダにあるリネームされた動画ファイルを読みに行くのですが フォルダAに動画ファイルが無いという旨のエラーが出て終了してしまいます。 フォルダBでバッチファイル2に動画を直接ドラッグアンドドロップすると正常に動くのですが バッチで同じことをしようとする場合には何か特別な事をしなければいけないのでしょうか。
>>524 フォルダAっていうのはいったい何だ。
echo onで実行過程を見ればすぐ問題は解決する気がするが。
どうせカレントディレクトリが違うって程度だろう
>>525 記入不足でした、フォルダAは録画ファイルとバッチファイル1が置いてあるフォルダです。
bat弄り始めて2日のビギナーですみません、カレントディレクトリを移すコマンドというのを試してみます。
録画云々ってことは別ドライブに移動させるとかしてそうな気がするんだけど、 ディレクトリだけじゃなくてドライブも違うのに、カレントドライブ変更し忘れた、とかありそう。 もしそうならCDコマンドに/Dオプション付けてフルパス指定するとかでどうぞ。
cd /dはUNCパスには無力だから、自動でネットワークドライブ割り当ててくれる pushdの方がいいよ
pushd使ってpopdしないで放置してって何回もやったらドライブどうなるの?
CMD.exeの/Sオプションってどういう時に使うの? イマイチ使いどころがわからない…
>>527 >>528 ありがとうございました。おかげさまで無事複数のbatが動くようにできました。
もう一点質問なのですが、batファイルの実行にあたって、フォルダ内の全てのファイルを対象一回ずつ実行する方法はありますでしょうか。。
例えば、エンコード用のbatファイルがある場所で
call c:\B\enc.bat *.ts
これを実行すると、Bフォルダ内にあるTSファイル一つだけがenc.batで実行されます。が複数ある場合はそちらは対象として実行されませんでした。
TSファイルが複数ある場合に1つずつ順番に同処理を行う方法はありますでしょうか。
for %%i in (*.ts) do call c:\B\enc.bat "%%i" enc.batそのものにファイルを次々にエンコするように書く(実行に引数不要)とかもあり。
>>532 迅速なご返答ありがとうございます。
こちらの記述でさっそく試してみます。
>>532 無事TS毎の実行ができました。ありがとうございます。
恐縮なのですが、もう一点質問させてください。
無事エンコード環境が整ったと思ったのですが、一点問題が出てきました。
私の環境だと録画ファイルを別ドライブへコピーして保存しています。
copy c:\録画\*ts c:\TS\
このコピーの際に、別途録画中のファイルがあると、それも一緒にコピーが実行されてしまいbatが固まってしまいました。
録画中(使用中)のファイルはbat処理の対象にしない方法等はありますでしょうか。
宜しくお願い致します。
forfiles /d -1とかやればいいんじゃね
>>534 録画ツールで録画終了時に何かさせるって事出来るだろ。
tvrockかedcbか何使ってるか知らんが。
録画終了直後に今録画したばかりのファイルを一つずつ
保存用フォルダに移動させりゃいいだろ。
そうすると録画フォルダには録画中のファイルしか
存在しないことになり、一々区別の必要は無くなる。
実行したいコード文字列をそのまま渡したい時に。 例えば、外部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%" # 間違ってたらスマソ
このスレでコメント行を # とか... ひっとらえろ!
::ヒャー echo ニゲロー
まぁバッチファイルにPower Shellとか書くだけなら書けるしなぁ。スレ主によるとJScript,Perlまで含まれるらしいからなんでもありだろ
#.exeを作ってPathにいれときゃOk
バッチファイル 埋め込み 言語名とかでやると 幾つかのスクリプトはやり方が出てくるね、もちろんjsもperlも出てくる
ひっとらえろ→ヒットラーエロ→総統エロ→機密漏えい→きみ、えろい
cmd.exe /c start "" "myprog.exe" とほぼ同等の機能を持つ shellexecute.exe myprog.exe みたいな標準かsysinternalレベルの準標準?のコマンドラインツールないですか cmdでもいいんですけど一瞬窓が見えるのがかっこ悪い…
呼び出し元がバッチファイルならstartの/MINオプション SysinternalsにもShellRunasとかpsexecがあったような それか、wscriptで小さいプログラム書くのもいいと思う あと、そもそもプラットフォームがコンソールになってる実行ファイル (いわゆるコマンドラインツール)の場合はOS側でコンソール出すぞ?
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文字列の引数を受け取る方法ってありませんか?
Unicode文字列の引数を使いたいのなら、バッチファイルの代わりにVBScriptファイルを//uオプション付で使うのが無難だと思う
%~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
個人レベルでの利用なら for /f "tokens=3" %%I in ('dir /-c /a-d *.iso 2^>nul ^| findstr /v "^[0-9]" ^| find "のファイル"') do echo sum_size=%%I
あ〜!なるほどなるほど!ああ〜!なるほどー! ところでサイズの計算は imagesize+imagesize/20 じゃなくて imagesize-imagesize/22 でした。
以前数値を分割して多数桁の計算をするバッチ例がアップされたような
dir /s /b > FileList.txt みたいなコマンドでファイル一覧を取得してるんだけど、あまりにも長いパスだと出力されないことがあるみたいです。 これってコマンドの制限でしょうか? あとパスに半角の括弧とかがあると取得に失敗することがあるようです…
557 :
片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/04(水) 17:19:20.90 ID:qVJRsv3N
二つのファイルのどちらが新しいかを判定するコマンドはありませんか?
558 :
デフォルトの名無しさん :2014/06/04(水) 17:29:48.92 ID:qVJRsv3N
あげ
>557 そんなコマンドは無いが、以下のコマンドを使えばコピー元の日付がコピー先の日付より新しいファイルだけをコピー可。 xcopy コピー元ファイル コピー先ファイル /d
>>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%より新しい
訂正 %fileA% → %1 %fileB% → %2
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つを同時に開くにはどうすれば…
start なにか.exe
start
pushdはバッチ終わったら勝手に元に戻るようにして欲しかった
566 :
562 :2014/06/04(水) 22:42:41.49 ID:O3v0nml9
>>557 nmake使えよ。どうせ入ってるだろ。
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 で改行コードを送れば複数のコマンドが使えるかと思ったけどそんなことはなかった。
特定のフォルダ内にあるテキストファイルを移動&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ファイルが無くなれば終了とさせたいです。 宜しくお願い致します。
sagyou2をファイル名を引数として受け取り1ファイルを処理するよう 書き換えた上で for %%i in (*.txt) do ( move "%%~dpnxi" "C:\フォルダ2" pushd "C:\フォルダ2" call sagyou2.bat "%%~nxi" popd )
書き換えなくても move pushd call del popd の繰り返しでいいんでない?
削除していいもんなのかわからんだろ。
というよりテキストとsagyou2の関連性が全く書かれてないからその辺わからんな。
あぁそうか、出来るだけ簡単にと思ったんだわ del なら move よりも type や copy で複製しないとあれか for 使えば重複実行は心配しなくていいし(実行中に新たに増えると管理が面倒だけど)
cmd /c rd /s / c:\
まだこんなの書くバカがいたのか
qが無いからエラーになるだけじゃね?
>>576 VMwareの仮想OS下でコップの中の嵐で楽しんでみたけど結構消えなくて残るよね
消すなら消すでちゃんときれいに消せよと思った
Unixの場合はファイル開いてる状態だとファイルノードの参照カウントがちゃんと増えるから、 ディレクトリツリーからファイルノードへの参照だけ消して見た目はまっさらに出来るらしいね。
for文を使用して、batファイルでiniファイルを読み込むのは出来たのですが iniファイルの中身に ---------- txt=C:\test.txt csv=C:\test.csv ---------- 上記のような指定したテキストファイルやcsvファイルを さらに読み込むことは出来るのでしょうか? iniファイルの中身だけが表記されてしまいます
>>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
>>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
: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]は許す
なお iniファイルやtxtファイルの中にさらに xxx = ファイル があったらそれも全部表示する
バッチでフォルダパスがどの物理デバイスかを調べるのは可能ですか? 大量のファイルを処理する時に物理デバイスが別個なら並列でやりたいなと考えています
>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 実際には使い物にならないからそのつもりで
所詮バッチ制限ですし、「とりあえず使える」と「ずっと使い物になる」の違いですかね まぁ1回こっきり用途ならそれでもアリかと。なかなかスクリプト前提にはスレ移行できませんね
>>587 ありがとうございます、試してみましたが全て同一の数字になってしまいました
ですが、レスを拝見し検索ワードを変えてみたところPowerShell(Get-WmiObject)に
参考になりそうなものがありました
未だ目的達成には至ってませんが、ヒントになるレスを頂き大変感謝です
@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)
遅延展開とかなかったっけ?
>>594 593が変数展開前のコード貼ってないからよく分からんけど、場合によって2回展開されるあれじゃない?
展開時の置換で出来るかと思ったが変数の用途によって展開方法がケースバイケースでよく分からん。
prmにURLが入ってるとして「setlocal ENABLEDELAYEDEXPANSION」としてから
「!prm:%%=^^%%!」とか「!prm:%%=%%%%!」とかで展開してどうにかならんかな
…それとも、遅延展開オフの環境から「start cmd /V:ON /C !prm!」として直接解釈させるとかいう話?
バッチ内で %errorlevel%が設定されない場合があるが、直前にerrorlevelを消してから 実行すると設定されるとわかったので、記念に書いておこう。 例 set ERRORLEVEL= findstr 検索文字 abc.txt if %ERRORLEVEL% NEQ 0 exit /B 検索結果あり場合の処理 win7 home X64
>>593 コマンドプロンプト直打ちでの話?
この場合でも、もし変数に入ってるのなら展開されないと思うんだが?
もしbat内での2回展開ってことなら%1と%f3%と%3が展開されてしかるべき話だし
もっと特殊な場合なら、batを見せてもらわないとわからない
>>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が入るようだ
下記のようなcsvファイルからユーザとOUを読み込んで、OUの移動を行いたいのですが 上手くいきません dsqueryで値を読み取って、dsmoveで移動しようと思っているのですが for文と下記のようなコマンドを使用して、バッチファイルの作成は可能でしょうか dsquery user -name csvのユーザ名 dsmove 上記でとった値 -newparent "ou=csvのOU名,dc=○○,dc=○○" test.csv -------------------------- test01,OU01 test02,OU02 --------------------------
失礼します。
質問です。
変数名hoge内に2バイト文字が使用されていた場合、
Error.2バイト文字が使用されています。
入力し直してください。
と表示したいのですが、
どのようにしたらいいのでしょうか。
2バイト文字 全角 検出 bat
などを組み合わせて検索してみたのですが、
検索結果にそれらしい物は見つかりませんでした。
よろしくお願いします。
>>579 出来るだけ消したいなら、
| takeown icacls を組み合わせないと無理ですねぇ。
あと、使用中のファイルはtaskkillしないと消せません。
よってシステムドライブの全データの削除は不可能です。
602 :
デフォルトの名無しさん :2014/06/28(土) 03:58:56.25 ID:sKWOMnpi
変数名hoge内つーのは例えば%hoge%とかすると置き換えられる文字列つまり変数の中身のことを指してるのかね
ループ回して部分文字列切り出して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]" な感じで検出自体はできるようだ
そんなような制限のない何でも入るような文字列操作はbatじゃ不向き 文字列の中に特殊文字(&や|とか)があるとまず破綻する
文字コードを判定するフリーソフトってないのかなあ
EUC、ShiftJIS や UTF-8 を判定したい、って意味なら nkf32 を使ってる。
>>605 >>606 書き忘れていてすいません。
実際に行うのはユーザー名判定やフォルダ文字列での判定です。
Win8で実行するスクリプト上、
2バイト文字のユーザー名などですと、
下の処理で不具合起す物があるので修正させたいわけです。
ファイル名として許される文字であっても^とか%とか面倒事が有るのは変わらんよ ダメ文字の判定をダメ文字の多い言語(バッチファイル)でやるのはお勧めしない
ユーザー名なんてものは勝手に作らせるものじゃなくて システム管理者が割り当ててやるもんだよ 運用自体がそもそも間違ってるけど、そういう会社なの?
>>609 まあそこは仕方ないとして
batだと色々と大変だから(ファイル名に&^%=~ような文字も使える。特に&なんかは結構使う人が多い)
jsかvbsのscriptを作って呼び出した方がいいね
SEDまで使い出すともうこのスレの範囲を超えると思う
>>613 最初のecho %hoge%で問題が発生するだろ
hogeの中に&があったらエラーになるぞ
んじゃ set | findstr "^hoge=" | onigsed -n -e "/[^\x01-\x7E]/p" | findstr /v c:"" >nul &&echo;Error.2バイト文字が使用されています。&&echo;入力し直してください。
>>616 NULL(0x00)とDEL(0x7F)をASCII文字からハブらないで
>>613 なるほど。
バッチファイル1つだけでは完結できないのですね?
>>618 bat全体を検証しないと、全角文字を取り除いただけで大丈夫かとうかはなんともいえないからね
&は大丈夫でも^は問題ないのか他のダメ文字はどうか、全部確認しないと
むしろ、"a-zA-Z0-9_"とあと幾つかしか使っちゃダメとかにした方がいいよ
チェックはvbsかjsでなら一例として、/^[\w!#$+-=]+$/でmatchするかしないかだけで済むし
621 :
デフォルトの名無しさん :2014/06/29(日) 16:29:29.36 ID:Qv/RYUQu
622 :
デフォルトの名無しさん :2014/06/29(日) 16:37:19.23 ID:Qv/RYUQu
>>621-622 初心者レベルの知識自慢は初心者スレでどーぞ
あ、ただのコピペだから自慢にすらなってないかw
>>625 =ID:Qv/RYUQu
なんか哀れ杉
まあ涙拭いてまた出直せや
知識自慢っぷりがアレな奴と、
嘘を自信満々に教えた
>>620 。
涙拭いて出直すのは一体誰か。
んじゃ 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;入力し直してください。 ※ 「*」は、半角の空白に変えて下さい
知識自慢っぷりがアレな奴と、
嘘を自信満々に教えた
>>620 。
その尻馬に乗り、自信満々に煽って自爆した
>>623 。
涙拭いて出直すのは一体誰か。
>>628 どっちにしろコピペを指摘されて泣く程口惜しがる奴とか中々居ないだろ
自信満々に教えた事が間違ってて泣く程口惜しがる奴は沢山居そうだが
>>630 だよな。粘って何が得られると思っているんだろコイツ
粘ってるのが630な件。 631も630だろw
話題が爺の良き思い出の「紙テープ」でなかったら、もうとっくに終息してるんだがなw
そもそもコピペじゃなかったら、ソース出せって言い出すに決まってるのになあ
>>619 返信遅れてすいません。
変数からsetで特殊文字全部を特定の文字列に置換して、
その文字列が含まれている場合はエラーというのはどうなんでしょうか。
>>637 そういう風に色々しなきゃならなくなるからbatじゃやりたくないってなるんですけど?
例えば=があったらどうするとか
wshを併用すると楽にできるのにどうしてそれを忌避するのか?
んじゃ 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;入力し直してください。
>>638 すみませんでした。
onigsed、またはwhsをインクルードしてやってみます。
onigsedはさておき、WSHはほとんどのWindowsに標準搭載されててバッチファイルからも簡単に呼び出せる (かなり昔のWindows95などでは、後から別途インストールしないと使えない場合もあったが)
>>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)
訂正 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
以下の様な構成で、フォルダ「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\配下のファイルは削除したくないのです。 上記のようにフォルダ名は固定とか連番では無いので、事前に取得が必要かと思っています。
追加 大変分かり難いと思いますが、E:\TEST\000\だけで無くE:\TEST\001\と続きます。 つまりE:\TEST\000\のサブフォルダ一斉削除だけで無く、E:\TEST\001\・・・・とE:\TEST\内全てで 同様の処理がしたいと思います。 説明不足で紛らわしくて申し訳ありませんでした。
for /d %i in (*) do rd /s/q "%i"
format e: /q e: mkdir \TEST
>>645 @echo off
pushd e:\test
attrib +H "000"
for /d %%i in (*) do (
rd /s/q "%%~i"
)
attrib -H "000"
popd
for /d %%i in (E:\TEST\000\*) do @rd /s/q "%%i"
>>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
E:\TEST 内の中は各サブフォルダ直下のファイルを除いて全部削除ってことだろ。 for /d %%i in (E:\TEST\*) do (for /d %%j in (%~dpnxi\*) do @rd /s/q "%~j")
for /d %i in (e:\TEST\*) do for /d %j in ("%~i\*") do rd /s "%~j"
645です。
>>650 さん 分かり難くて申し訳ありません。
>>651 さん のとおり\TEST\000,\TEST\001など
第一サブフォルダ直下のファイルは残し、それより更に下位階層のファイルは
フォルダ毎削除したいのです。
皆さんのバッチを実行してみましたが、どのバッチでも以下の内容のエラーが出ててしまいます。
コマンドラインは管理者権限で起動してtest.batを実行する形式です。直打ちとバッチで表記方法でも
違うのでしょうか?
--------------------------------------------------------------
バッチ パラメーターの置き換えで、パス演算子の次の使用法は無効です:
%~j"
>直打ちとバッチで表記方法でも違うのでしょうか? ここから分からないの?そりゃ違うこともいくつかあるよ %と%%は顕著な違いだね それと上のいくつかの奴で何処を修正したらいいのか自分で調べられないと batがどう動くのか心配になるだろ? @とかecho offとかrdの/qを取ってみるとかecho 〜を挿入して途中までの動作を確認してみるとか いろいろとやってみて
ファイルの作成/更新日時の取得でミリ秒まで可能な方法はありますか? 現在 WSH を併用する事で HH:MM:SS までは取得できました。
そもそもファイルシステムにそんな精度で記録されてない
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
エクスプローラを再起動する
あるファイルの別のフォルダに もしあれば新しい場合だけ更新コピー、もしなければそのままコピー これはいつもファイラーでやっていますが、自動化するために バッチでやろうとすると意外に適当なコマンドが無いことに気がつきました。 copy replace xcopy どれもやや違う。
robocopy
ロボコピ使えるよな 共有フォルダからコピーしたいときとか、マルチスレッド指定で動かすとかなり高速 ミラーリングも何気に便利
>もしあれば新しい場合だけ更新コピー、もしなければそのままコピー これファイルがあろうがなかろうが必ずコピーするってこと?
>>663 古い場合はコピーしたくないって事でしょ
xcopy /d じゃダメなん?
666 :
658 :2014/07/23(水) 08:34:54.84 ID:i4+a6YSx
>>659 ありがとう
でも再描写で画面がチラつくのが嫌だったからSendKeys使ってタスクトレイ選択するマクロ作ろうとしたけど途中でめんどくなった
>>666 アレはネタ回答だったけど、マウスカーソルをタスクトレイ一周させるUWSCマクロを起動するのが一番手軽かなぁ…
GUIはバッチの領分じゃないだろうし。
>>659 エクスプローラの再起動は遅延書込中のコピーバッファが壊れる可能性があるから
オススメできない
>>668 遅延書き込みはOSの管轄だから無関係じゃないか?
>>665 サンキュです
/d で年月日なしが出来たんですね
xcopy /DIQY コピーファイル コピー先フォルダ >nul
で出来ました。
>>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 よろしくお願いします。
>>672 rename *.* 1234????.*
重複するファイル名が存在するか、またはファイルが
見つかりませんでした。
って出ることも。
674 :
672 :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でした。
ご教授お願いいたします。
@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
676 :
672 :2014/08/03(日) 21:57:10.71 ID:1Uu1p9vY
>>675 ありがとうございます。
希望の結果になりました。
何をやっているのかさっぱり分からないので
キーワードを検索して勉強します。
コード書けよ・・・
PowerShellとVBAとVBとcscriptと wscritptとbat どう違うかよくわからない
>>680 ・bat
OSに対する一連のコマンドをファイルにまとめたものをバッチファイルと呼ぶ。
その拡張子が.bat。バッチファイルの略記として使うこともあるが、口語ではバッチファイルと呼ぶのが無難。
この中では最も歴史が古く、MS-DOS時代から存在している。Unix系とのパイプ役でもある。
入力や出力はすべてテキスト文字列である、とするため各アプリ側の対応は標準入出力やコマンド引数など、基本的な機能だけで済む。
・cscript
cscript.exeのこと。WindowsScriptHost(以下WSH)の実行環境のひとつで、コマンドプロンプトを開いてその中で実行する。
WSH自体は言語を規定していないが、主にJScriptまたはVBScriptが使われる。低機能なバッチファイルを補佐することができる。
・wscript
wscript.exeのこと。もうひとつのWSHの実行環境で、ウィンドウを開かずに実行する。そのためバッチファイルと連携せず単品で動かすことが多め。それ以外は大体上に同じ。
・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 おきにいりをバックアップファイルに保存したいのですが 上記で一応は取れるのですが ファイル名でたとえば禁則文字とか特殊文字がある場合ははじきたいのですが どのようにすればいいでしょうか?
for+findstr
「が」を重ねるな。しかも3個も。小学校出てないのか?
ですがですがうるせぇ
ぬるぽ!
688 :
デフォルトの名無しさん :2014/08/06(水) 20:03:50.85 ID:TlJgkja3
「が」を重ねてもいいだろ。レディガガだけで2個重なる 逆接続詞って単語知らないのか
689 :
デフォルトの名無しさん :2014/08/06(水) 20:13:38.23 ID:1ZlV87Ba
Death ガッ Death ガッ Death ガッ
まあ幼稚ではあるな
たまたま続いちゃうことはあるかも知れないけど、指摘されてレディガガとか言い出すのは確かに幼すぎだわな
>>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をはずして実行する
糞遅い回答ご苦労
694 :
デフォルトの名無しさん :2014/08/08(金) 07:49:01.43 ID:1XaUH8/D
>>683 どうにもなりません
バッチファイルでブラックリスト方式で特殊文字を扱うのは極めて困難です
>>605 を参考にホワイトリスト方式でfindstrする方が安全確実です
696 :
デフォルトの名無しさん :2014/08/08(金) 13:38:09.79 ID:pWDxpd5M
guro
>>674-675 こういうの15分ぐらいで正確なレスしちゃう人ってなんなの?
ハッカーでもやってるの?
ハッカーでもやってる、とかじゃなくて、 そういう人のことをハッカーっていうんだよ。
拡張子cmdでも同じように動くけどバッチって言うの?
バッチ batch という単語は「一連の」って意味でwindowsの拡張子batの ファイルだけを示す言葉じゃないからな。
もともとパソコンがない時代から使われてる言葉だし
D&Dしたファイルの名前を使った空ファイルを作るバッチを書こうとしたけど、 nulの説明に「出力先に指定するとすべて捨てられてしまいます。」とか書いてあって .batをうっかりWクリックしたらどっかが全部消されちゃうんじゃないか とか思って怖くて「type nul」が使えなかったけど 「a >ファイル名」でも空ファイルが出来ると知ってホッとした
「バッチ」か・・・ FORTRANカードかかえてコンピュータの前に並んで順番まちしてたあのころがなつかしい
>>700 >>680 が bat と言ったから
>>681 に .cmd の話が無かっただけで
.cmd のファイルもバッチファイルと言うのが普通だと思う
但し「バッチ」だけだと
>>704 の言うようなものを含んで
ちょっと意味が広過ぎちゃうかな…まあ文脈から解るけどな
>>704 DO文の区切りのカンマをピリオドと間違えるんですね
おまえらFORTRANとか40代ぎりぎりか50代なのか
>>706 FORTRANって、スパコンでは現役じゃなかったっけ
理系の数値計算が専門じゃないとスパコンなんて 普通使わんから。 文系SEとかにはわからん世界。
>>700-702 >>704-705 コンピュータすら関係ない工場等の工程の分類に使う言葉でもあるらしいね。バッチ殺菌とか。
>>707 FORTRANは現役だった筈だけど、現役のスパコンで
「FORTRANカードかかえてコンピュータの前に並んで順番まち」はしないんじゃないかな…。
学生の頃、メインフレームの専用端末もいっぱい並んでて使わせてもらうこともあったが、 普通はコーディングシートに書いてパンチ依頼し後日コンソール前に持っていって カードリーダーにセットしたもんだった LANが普及する以前のことですたい
>>709 > 「FORTRANカードかかえてコンピュータの前に並んで順番まち」はしないんじゃないかな…。
>>704 は学校の実習の提出でカードリーダー待ちとかじゃね?
ジョブスケジューラが入ってないスパコンなんて見たことないし。
そろそろスレチ FORTRANスレに池
(実はスレタイに.cmd書いてあるのすら忘れて
>>700 を書いたなんて言えない・・・)
MSはDOS時代のBATとはもう全然かけ離れてしまったから 拡張子は.batじゃなくて.cmdを使うようにってリードしたかったんだろうな けど.batが定着しすぎて.cmdは全然広まらなかった
そういや今更だが… 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
もう記憶がおぼろげだが、.cmdってOS/2由来じゃなかったっけか
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
>>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
@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 )
>>721 もしかしてmpvならそれで動くのかも知れないが、mplayer2やMPCではダメ
(m3uのプレイリストのファイル名は""で括るとダメだと思う)
for /r "%~1" %%a in (*) do echo %%a>>"%temp%\mpv_playlist.m3u"
(また、/rでサブフォルダまで含めるのはどうかと思う)
フォルダの存在チェックは、サイズ=0かどうかではなく
if exist "%~1\." (
とした方が良いのでは?
(フォルダ区切りに/を使うかどうか、また最後にドットを付けるか付けないからお好みしだい)
さらに複数フォルダまで対応するのならそれがファイルかも知れないのでそのチェックも必要
あと、パラメタをさらに引数として受け渡すのも危険な場合があることにも留意
>>719 言い忘れてたけど、
cdコマンドでドライブの移動まで行おうとするなら
cd /d
または
pushd
を使うこと
>>723 あちゃ、いつの間にか cd /d というのが出来ていたんだ
いつの間にか?? 少なくとも10年以上前からじゃないのか?
わろた 一体いつの時代からトリップしてきたのか
DOSコマンドは、MS-DOS、CP/M時代から 頭が更新されていないから仕方がない まぎらわしい、unix にもあるコマンドは同じにしてくれないと
うにっくすにドライブなんてねーよ
こんなやりかたがあった type con >"aaa.txt"
copy con aaa.txt 派も居るぜ
>>727 Unix系とcmd両方使ってると、標準エラー出力のリダイレクトをよく間違えて
"2"ってファイルは無いよと言われたり、標準エラー内容が"2"ってファイルに出力されるわ…
ごめん、そこは同じか…ただ俺がバカなだけだった…
cshが混ざったんだろ?
sleep相当コマンドはフリーソフトしかないのかと思っていたが、 choice や timeout で代用できた timeout /T n >nul forfiles 発見
知らなかった。timeoutコマンドをググったら、Windows Vista/Server2003以降で使えるらしいな。
新しいコマンドかぁ・・・XPはそろそろ見限っていっても良いだろうしそっちに目を向けるのも良いね forfilesで@〜とかを導入したのはバッチでは%%~にする仕様がキモかったからとかなのかなぁ… その辺の誤爆を意識したにしては0xHHとか導入しててこれも誤爆がちょっと怖い ところで、0xHHに面白い使い道って無いかな?
コマンドって言うかあれexeがぽつんとあるからXPにも持ってったら使える
>>736 そんなライセンス違反するぐらいなら、自分で作るわ
XP以前のWindowsでやるならWSHと併用するのが無難だろ
持ってける環境ならそもそもリソースキットのsleepでいいよなぁ
イロイロ面倒なので ping -n 4 127.0.0.1 >nul で済ます派
俺も同じだけど ping -n 4 localhost>nul って書くなあ
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 は得られませんでした。 解決策はあるでしょうか?
>>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
745 :
743 :2014/09/08(月) 11:49:15.60 ID:mzCBiPNi
>>744 すばらしい!
SET を CALL でやるとか、そんなことできたんですね。
* も \ でエスケープできるんですね。
実はそれは試した気がするんですが、その時はまた別の問題で動かなかったのだと思います。
大変勉強になりました。ありがとうございます。
746 :
743 :2014/09/08(月) 12:06:19.31 ID:mzCBiPNi
たびたびすみません >* も \ でエスケープできるんですね。 エスケープしてるわけじゃなく \* という文字列にマッチさせたんですね。
Win7 64bit環境でやたらと >このコマンドを実行するのに十分な記憶域がありません。 というメッセージが出るんだけどどういう理由で出るんだろうか 指示したコマンドはすべて正常に実行されてバッチ終了時に出てるっぽい やってることはこの程度で複雑な再帰的な呼び出ししてリソースが足りなくなるようなこともしてないんだけど dir xxx > index.txt start myapp index.txt
startに2つ引数渡すと、1つ目はタイトルバー文字列であって実行コマンドじゃないんだけど、そこは考慮しとるか?
>>749 startでは、""で括ってない文字列はタイトルとは見做さないし
もしmyappが実際には""で括ったパスだったとしても
.txtに関連付けられたテキストエディタが起動するだけのことじゃない?
myappが何者か知らんけどね
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つのバッチファイルで書く方法はないでしょうか。
findコマンドでBを含む行を削除して、 for /F "tokens=1,2* delims=,"でカンマ区切りのフィールド1とフィールド3以降を抽出して、 set /Aで生成した連番を付けて出力すれば良い けど駄目文字とかもあるからCSVの内容次第によっては上手くいかない 加工はWSHとかPerlとかawkとか別のソフトで自動処理したほうが良いと思う
>>751 LogParser使うと楽
logparser -q:on -headers:off -headerRow:off -i:csv -o:csv "select field1, sequence(1), field3 from hoge.csv where field1 <> 'B'"
>>751 データが例題通りなら
for /f "tokens=1-4 delims=,[]" %0 in ('findstr /v /r /c:"^B," CSVファイル ^| find /v /n ""') do @echo;%1,%0,%3>>振りなおしたファイル
>>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;
エディタでB始まり行を削除し、二項目でソート sort /+3
>>756 連番振り直しにならないしそれは多分違うと思う
>>757 そっか、ソートでなく番号付け直しだった
撤回
759 :
751 :2014/09/18(木) 21:08:15.87 ID:IKvy/bQU
皆さん、助言ありがとうございました。
おかげさまで、イメージしていた処理ができるようになりました。
>>754 で書かれたものをベースでできました。
ただ、データが数万件あるファイルの処理なので、結構時間がかかります。
軽いファイルで、同様の処理があるので、これを活用していきたいと思います。
>>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
@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;
バッチ内で、今日の曜日を知る方法がわからなかったので調べたが、 一発で得る方法は無いんですね。 年月日がわかると計算できるとわかったが面倒、曜日GETコマンドを追加してほしい。 昔のDOSだと出来たのに。
>>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))
>>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);
>>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=月
>>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"
>>763-769 ありがとうございます。
ぐぐったら、いろんなやりかたがありましたので、
コピーしてバッチを作り使っています。(パクリ) で
>>766 さんとほぼ同じ。
date.exeはあると便利そうですね。
4年前のスレの時に作った ISO 8601 の週とか、曜日とかのバッチを貼ってみる @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
>>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
>>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 /vオプションなんかに頼らず、
fc /bでバイナリ比較するのが確実
>>774 そんな心配は不要だろ
HDDやDVDやメモリカードならCRCエラー訂正ぐらいはやってるだろうし、
そもそもHDDのファイルが信用できなきゃ、OSのEXEファイル自体の動作を心配しなきゃならなくなるぞ
>>777 じゃあ心配して、毎回チェックすりゃいいさ
そのチェックプログラムももしかしたら壊れてるかもしれんからチェックする前に
チェックプログラムもチェックしなきゃな
「じゃあ」って会話成り立ってなくね・・・?
>>777 もしファイルが1コでも壊れてたならそのHDDは廃棄したほうがいいよ
数十万個もあるファイルの中でどのファイルも信用できなくなるから
ID:GsQr0uZE ガキかよ w
今知った情弱だけど ドス窓でもlsやcpってあるんだね dirよりlsの方がいいわ
無いよ。 msysとかgitとか自分で入れたんじゃ?
あぁ本当だ 環境変数確認してみたら、過去の自分がmsys\binのパス通してたみたい 勘違いごめん・・・
Microsoftさまの Microsoft Windows Services for UNIX か Subsystem for UNIX-based Applications + パッケージ の話をしてたのかと思ったら違った
>>785 それってbashのShellshock脆弱性のパッチは出てるの?
788 :
デフォルトの名無しさん :2014/10/21(火) 13:40:31.50 ID:S84tBIG3
おお batのスレなんてあったのか ffmpegを起動するbatファイルを書いてたのですがffmpegに渡す引数の加工に 独自のコマンドアプリで処理させてその独自コマンドアプリのはいた文字列を ffmpegの引数とする場合どのようにbatファイルを書けばいいのでしょうか?
ファイルに出力するなり、forで受け取るなり
790 :
デフォルトの名無しさん :2014/10/21(火) 13:47:58.34 ID:S84tBIG3
サンプルコードなどいただけるとありがたいのですが・・・ @echo off ffmpeg %1 exit とかbatそのものの引数の格納されている変数?は理解してるのですが 独自コマンドアプリをhogehogeとした場合 @echo off hogehoge %1 ffmpeg ??? exit この連携の記述がよくわかりません・・・
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 もしかしてこれでいいのかな?
exitやめてpauseにして 一度どんな風に渡されているのか見てみたらいい
795 :
デフォルトの名無しさん :2014/10/21(火) 14:35:09.24 ID:S84tBIG3
わかりました
いろいろヒントいただいたおかげで検索ワードがいろいろ追加できたので
今まで探しきれなかった情報にたどりつけそうです
ちょっと自力でやってみてまたつまったらこちらにお邪魔します
>>789 >>791 ありがとうございました
フォルダを削除した直後に同名のフォルダを新規に作成しようとすると「アクセスが拒否されました」と表示されて作成できないことがあります。 コマンドは終了していても、フォルダの削除は完了していなくて作成できていないような動きなのですが、そんなことあり得るのでしょうか?
797 :
デフォルトの名無しさん :2014/10/22(水) 02:01:18.93 ID:ZQ5GB3JT
今知ったけどM$がコマンドでハッシュ計算用のソフト公開してるね fcivってやつ
>>799 それ使ってバッチファイル書いたことあるけど、出力をバッチで取り扱うのが面倒だった上に、
Unicodeパス非対応、挙句マルチバイト文字の扱いにバグがあってすごく駄目駄目だった。
isupper(*(signed char*)str)でマイナス文字領域を参照しちゃう系のバグだったかな、
デベハトップ系よりもタチが悪くて、2バイト文字の先行バイトすら化けるという有り様だよ。
今は直ってるかなーと思ったが2004年からバージョンアップしてないんすね、駄目だこりゃ。
Win7のシャットダウンコマンドでXPみたいなカウントダウンしてる画面って出せない? コメントなら出るし2分前になればダイアログ出るけど・・・
>>800 そーだったのか。
Windows8のダウンロード版が一致するかチェックするのに便利だったが。
>>802 ダメ出しできる俺スゲー君でしょ
便利に使えばいいだけ
不具合あるなら自分で作ってもそんなに大変じゃないし
>>802 不特定ファイル名を受け入れる用途やバッチファイルでは駄目だけど、
ファイル名の取り扱いとかでバグ踏まない用途なら別に問題ないよ。
>>803 バッチファイル書いてからバグに気がつくよりマシだと思って情報出しただけなんだけどなぁ…
というかハッシュ計算機を自分で作るって、ライブラリに頼らず書くのは結構な手間だろ何言ってん?
805 :
デフォルトの名無しさん :2014/10/26(日) 20:14:50.47 ID:RaZwtAdW
PsShutdown
807 :
デフォルトの名無しさん :2014/10/26(日) 21:29:11.59 ID:NwSJFL0J
俺スゲー君とか言っちゃう君
>>806 うん、「今後も、特にバッチファイルで使うなら別のハッシュ計算ソフト探すべきだな」と思えるよ。
: 実際にはnode.jsのコアライブラリに丸投げしたけど。コールバックまみれでダルかった
しかしライブラリ使うに決まってるって言われるかと思ったら実装が楽って返事が来るとはなぁ…
大したことがないのならバッチファイルで実装してみてくれとか無茶振りしてみても良いかい?
>>810 > うん、「今後も、特にバッチファイルで使うなら別のハッシュ計算ソフト探すべきだな」と思えるよ。
なら、そう書けばいいだけ。
> 大したことがないのならバッチファイルで実装してみてくれとか無茶振りしてみても良いかい?
リンク先読んだか?
C でも数十行だから、たいしたことないだろ?
バッチファイルではバイナリと配列が扱えないので、面倒。
812 :
デフォルトの名無しさん :2014/10/26(日) 22:29:05.55 ID:KYTvr3GZ
もしもしのソースはいつもwikipedia(笑)
>>811 ここはバッチファイルスレだって分かってるのかね、君。
「結局node.jsで自作(但し丸投げ)した」ってボケにも気づいてないようだし…もう少し余裕を持ちたまえ。
.NET 4.5でようやく、MD5が追加されたのでは?
今、困っていること call で複数階層の呼び出しをした場合、 エラーで以後を中断し、一気に元に帰る方法がわからない。 exit /B だと次々に判定をしないと戻れないし、 exit だと DOSプロンプト自体が消えてしまう。
816 :
デフォルトの名無しさん :2014/10/26(日) 23:57:41.58 ID:KYTvr3GZ
エラーのときにフラグセットして各ルーチンでそれ観察すれば
mingwにopenssl sha1コマンド入ってた ただ表示するだけだけど
MSYSだったw
>>813 何を言いたいのかさっぱりわからんが、悔しさは伝わったよ w
>>821 何を言いたいのかさっぱりわからんが、悔しさは伝わったよw
>>812 ID:fx3FFnF6 と同じで、ダメ出ししかできない奴乙
使えるものは便利に使えばいいじゃん
まあ、
> exit /B だと次々に判定をしないと戻れないし、
と書いてるのに、
> エラーのときにフラグセットして各ルーチンでそれ観察すれば
とか、書いちゃう人だし w
825 :
デフォルトの名無しさん :2014/10/27(月) 10:41:19.76 ID:G9UeKJLQ
自己紹介乙(笑)
涙ふけよ
ファイル名の取り扱いにバグがあるなら標準入力から突っ込めばモーマンタイ WindowsならCryptAPIにハッシュ関数は一通りそろってるからラクショー
コード書こうよ スラドより酷え・・・
>>827 改造板に帰って来いよ。誰もいなくなっちゃったんだよ。
2週間に一度とか3週間に一度とかに実行させるサンプルどっかに無いでしょうか? バッチファイルを実行してから、実行すべきかどうか判断して 実行するしないに分岐するようなのが欲しいのですが、自分ではどうにもうまいこと 思いつかず、サンプルを探してみたのですがどうにも見つけられず…。 実行した日を別ファイルにして書き出すと管理が面倒なことになるので、 曜日と日付をみてなんとかできないものかと考えたものの頓挫しました。
>>830 自分のPCだけならスケジューラにbatを登録すればいい
(実行にユーザ名とパスワードが必要なため)
スケジューラに登録するbatも簡単に書ける
832 :
デフォルトの名無しさん :2014/10/28(火) 02:37:50.58 ID:TKGNZfF+
俺なら特定のファイルキープしておいて一定以上新しいなら実行しないようにする
>>832 日付で何日何週間先とか後とかを比較するには、
基準となる日を決めて、本日とファイル日付を基準からの日数を求めて差
求めるということをしないといけない
確かにそんなに難しいことではないが、batに不慣れだとまず実現できないだろう
$ forfiles /D -14 /M *.bat /C "cmd /c echo [last modified : @fdate] : @path"
>>827 fcivは標準入力を読むように出来てないでしょうに
現在のプロンプトのタイトルを取得する方法を探しています、何かいい方法ありますか? やりたい事は下記のような事で Call元はバッチや場所が不定で変数の引き回し不可 :Main側に戻った時の更新以外の方法を探しています。 :Main Call :Sub Exit /b :Sub GetTitle的な何か MainTitle Title %SubTitle% 進捗... Title %MainTitle% Exit /b
837 :
830 :2014/10/28(火) 22:06:59.72 ID:+z/Rv312
>>831-834 様々なヒントをありがとうございます。
処理するディレクトリ毎に目印ファイルを forfiles で判定させる、な感じで目処が立ちました。
あらためて読み直すと自分のレス
>>830 何かおかしいな。
『曜日』が肝なので「2週間に一度とか3週間に一度」というより「隔週の金曜日とか3週毎の月曜日」だし、
「頓挫」じゃなくて「挫折」だし…
>>838 情報ありがとうございます
Win7環境で試してみましたが、取得に至りませんでした。
教えて頂いたページでは Title で変更した場合でも現在のウィンドウタイトルが取得できる前提のようですが
当方では Start "NewTitle" ... など名前を指定して立ち上げたウィンドウのタイトルしか取得できないようです。
840 :
デフォルトの名無しさん :2014/10/29(水) 20:02:22.27 ID:06hl2t+T
すみません、1コマンドずつ分けてテストしなおしたらタイトル取得できるようなので もう一度自分で全部書き直してやってみます、失礼しました
>>840 LFコードを環境変数に入れるところで一行少ないため
文字列の先頭に余計なものがつき、全体に2つずつずれてるので
%2->%4 %9->%11
だけど、改行を一行挿入するだけの方が良い
ckwとnyaosを使い分けたいんですが ckw.cfg下記のように、コメント分にしようと思ったんですがうまくいきません //Ckw*title: ckw[cmd] //Ckw*exec: cmd.exe //Ckw*chdir: c:\ どうすればいいですか?
コマンドでフォント変更って可能でしょうか utf-8使用時にショートカットのフォント変更を行わずバッチ側で済ませたいのです
デフォルトの ラスタフォントからMSゴシックに変更したいと考えています。 宜しくお願いいたします。
>>843 >>844 ・regコマンドなどでコンソール用のレジストリ定義を変更して、それに合致するコンソールを開くようなバッチを書く
・WSHなどで自身のコンソールのGUIを自動操作してフォント設定の部分を操作するようなスクリプトを書く
コマンドプロンプトの表示フォントを変えたいってこと? 「ファイル名を指定して実行」でcmdで起動して、 ウィンドウ左上のアイコンをクリック→プロパティ→フォントタブで変えれば、 次回から勝手に変わるんじゃないっけ。
コマンドプロンプトでUTF-8を表示させたり出来たっけ?
echo UTF-8
>>847 code pageの話じゃね?
chcp 65001
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のクソ仕様により文字が化けたりトーフになったり幅が狂ったり散々。
>>852 WriteConsoleWってWin32APIを使って自作したってこと?
それとも何かそれを使う方法があるのならその方法を教えて欲しい
コードページでDBCSをサポートしているのは
932 (Japanese Shift-JIS)
936 (Simplified Chinese GBK)
949 (Korean)
950 (Traditional Chinese Big5)
の4つだけみたいだね
>>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がテキトーなのがいけないんだよ、君は悪くない。
結局質問者のUTF-8使用時に色を変えたいってのは どういう意味だったん?
色に関する質問ってどれだ?
フォントを先に変えておいて、chcp 65001で typeコマンドでutf-8ファイルを表示することは出来るけど クリップボード経由で貼り付けると表示が崩れるし、 IMEも起動出来ないのはまあ良いとして、 batが動かないのはどうしてだろう?
>>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のサンプルをあげとく
@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);
tar.gzの中にMakefileが入ってるか調べるコマンドありますか?
Unix/Linux系のコマンドアプリや、Cygwinなどを導入する気があるなら tar ztf ファイル名.tar.gz | grep Makefile みたいな感じになるんだろうと思うが 標準的なコマンドセットでどうにかしようと思うと苦しいかもなあ…
確かにwshで作れないことはないけど...ってレベルの話だね そんなの今更作る気もしないぞ
あざっす 諦めてUNIX使うおw
DOS画面をファイルに書き出すバッチはどうやればできますか。 手動だと全部選択してコピーしエディタでペーストするでできます。
>>867 ありがとうございます。
やはり実行前に指定するしかないんですかね
ckwやcolorconsoleもダメみたいだし。
emacs系のエディタ内から実行すると出来そうだが、使っていないし。
colorを使うと「"コマンド プロンプト"のプロパティ」の「画面の色」ダブにある16色の内から適宜背景色と文字の色を設定できますが この16色の値自体をコマンドによって変更することは可能でしょうか?
reg /?
>>870 回答ありがとうございます。
vistaでは HKEY_CURRENT_USER\Console\cmd にある ColorTable00 などを編集することで色の変更はできました。
しかしこれだとOSを一度再起動しないと反映されません。
「"コマンド プロンプト"のプロパティ」上で件の値を変更した時のようにリアルタイムに反映させることはできないでしょうか?
条件を後から付け足してしまってすみません。
>>871 WScript.exeでSendKeys
>>871 > OSを一度再起動しないと反映されません。
start cmd & exit
>>872 コマンドプロンプトのシステムメニューを出す方法プリーズ
ALT+Spaceはキーコードを送っても無効化された
>>871 ,873
なるほど。ウチのWin7でも HKEY_CURRENT_USER\Console 内の ColorTable00 などで同様にできたが、
実際問題そこまでして微妙な色を設定する必要があるものなの?
>>872-873 どうもありがとうございます。
Sendkeysについては
>>874 さんの指摘通り私の能力ではうまくいきませんでした。
>>873 さんの方法で期待通りの動作が確認できました。
OSごと再起動する必要はなかったんですね。
どうもありがとうございました。
>>875 阿呆な試みなんですが、実はコマンドプロンプト上で起動するアクションゲームを作っておりまして
Rogue?
>877 今の時期にスゲェな。そのタイプのゲームでは市販ソフトにオマケとして収録されていた以下3作を思い出す。 「オレハ ザカリテ ザッザッザッ ゲーム」:PC-8801(SR以降)版シルフィードに収録。 1キー操作で難しいが爆笑必至の傑作。オールBASIC 「シルフィード2」:PC-8801(SR以降)版シルフィードに収録。同じくオールBASICで、ジワジワくる。 「KAX」:PC-9801版サーク1に収録。1キー操作で難しいが爆笑必至の傑作。BGMも素晴らしい。 後に3D化されてWindows用フリーソフトとしてVectorで公開されたが、現在は入手不可。
>>878-879 一般的なローグ・ライク・ゲームよりももう少し描写が複雑なものを作ってます。
以前グラディウス(2面まで)をコマンドプロンプト上で再現できたので
今度はロックマンあたりに挑戦しようかと思っているんです。
移植性は乏しいですし、ただのお遊びなんですけどね。
スレの趣旨とずれてしまって恐縮ですがこれにて失礼いたします。
皆様どうもありがとうございました。
881 :
名無しさん@そうだ選挙に行こう :2014/12/13(土) 22:29:32.94 ID:NyNXg+vj
windows7、1ユーザーなので管理者なのですが、openFilesで管理者権限ないよって言われます。どうしたらいいですか? で調べたらcmdを明示的に管理者権限で起動しないといけないんですね。 管理者権限で起動してないcmdで、途中から管理者権限で各種コマンドを実行する方法はありますか? UNIXのsuコマンドみたいな。
runas
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は次の行に影響しないんですか? それともさくら側に実行場所を限定する設定とかありますか? フルパスで指定するしかないんですかね
>>885 さくらエディタのことは何も知らないが、
batと同じだとするなら
基本は別ドライブへの移動とカレントフォルダの移動は別にする必要あり
z:
cd \かかか¥ききき
一つのコマンドで実行するには
cd /d z:\かかか¥ききき
又は
pushd z:\かかか¥ききき
>>886 即レスありがとうございます。
ドライブの移動方法があったんですね。助かりました。
なんでも /? しないとだめですね。勉強になります。
>>885 さくらエディタって、中からコマンドを実行できたんだ
使えそう
下記のバッチを実行すると 最後に存在しないファイル名が表示されるんだが 仕様なのか? @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
GetFullPathName は、カレントドライブとカレントディレクトリを、指定されたファイル名に結合し、指定されたファイルのフルパスとファイル名を判断します。 また、フルパス名とファイル名を組み合わせた文字列のうち、ファイル名部分のアドレスを計算します。 この関数は、組み合わせによって得られたパスとファイル名が有効であるかどうか、およびそれらが適切なボリュームの既存のファイルを指しているかどうかを確認しません。
よくある間違いだよね ファイルのパスを求めるのに使っても目的のDriveとDirがカレントじゃないと 求めるパスと違うパスが出来上がるってのは
最近知った環境変数 %__CD__% が思いのほか便利だったので自分用メモ。 cd .. set WORKDIR=%CD% echo %WORKDIR%\HOGE.TXT だとドライブ直下へ上がった時にバックスラッシュが重なってOops!となりがちだが、 cd .. set WORKDIR=%__CD__% echo %WORKDIR%HOGE.TXT だと場所を問わずバックスラッシュが一つのためパス変更がはかどる。 %CD%の拡張版のような変数がなぜあるのか、いつ頃からあったのか不明だが地味に便利だったというメモ。
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.
>>892 これ、win8 だけなのかな
win7 はダメだった
Windows7、Windows2003 でもできたよ (XPが手元にないのでXPは不明) アンダーバーが前後2つというのに気が付かず、 最初は %__CD__% を %_CD_% と一個ずつ少なく間違えて?な状態だったけどw
%=D:%は一旦そのドライブに移動(アクセス)してないと使えないんだな あと、%=ExitCode%も同じく外部プログラムからの復帰値がないとダメ 現在これらのどれが定義されているのか見るには setじゃダメで、set ""で見られる 最初に表示される=::=::\が何なのかは良く分からないけど
エクスプローラ→ファイル→コマンドプロンプトを開く で、下記を入力 echo %CMDCMDLINE% すると "cmd.exe" /s /k pushd "???" となる。カレントディレクトリは pushd で移動してるらしい。 じゃあ、popd してみると何処に行くか見てみたら、 システムと無関係なディレクトリに飛ぶ事がある。 何故だろう?
ルールでは親プロセスのを引き継ぐんじゃね?
>>898 > カレントディレクトリは pushd で移動してるらしい。
単なる cd ではドライブを変えられないから
> システムと無関係なディレクトリに飛ぶ事がある。
c:\Windows\System32 (cmd.exe がある場所) じゃないの?
>>895 サンキュです
__ はアンダーバー二つでしたか、どうりでダメだったはずだ
win7でも出来ました。
しかし旅館増設の迷路みたいな機能拡張だな
担当毎に勝手に増設している感じ
もっとわかりやすくすっきり拡張する方法はなかったのか
アンダーバーで始まる(しかも二つ)変数はシステム変数であって 通常の機能拡張ではないし、ずっと前からあった機能だし
>>900 俺の環境ではなぜか
C:\Program Files\Autodesk\Inventor 2013\Bin
に飛ぶ。
何なんだ?
このフォルダで何もした覚えがない。cmd.exeも無い。
echo %ComSpec%
とすると
C:\Windows\system32\cmd.exe
環境はWin8
>>902 ずっと前って言われてもWin98には無いぞ
>>904 そりゃすまんかった
なんせwin7でどうとか言ってた奴に対してのレスだからwin7に対してずっと前からだと言ったまで
>>905 まあ、そもそもwin9xにはcmd.exe無かったと思うんだけどね
>>901 > もっとわかりやすくすっきり拡張する方法はなかったのか
WSH なり PowerShell 使えってことだろ
>>903 Inventor は開発環境を構築する類の製品みたいだし、
おそらくシェルの拡張がされていてそれが影響しているんじゃね?
先に Inventor の設定を読込んでからプロンプトを立上げていると予想
多分以下のレジストリの辺りにそれっぽいものがあると思う
HKEY_CLASSES_ROOT\Directory\shell\cmd\command
HKEY_CLASSES_ROOT\Folder\shell\cmd\command
>>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
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした
良く分からんが、スレチなのでこれで終わりにします
Win10 のコマンドプロンプト プロパティに Experimental タブが有るそうだが どんなもの?
ありがとう
>>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 バイト
そういや確かにDOS時代は%cd%や%errorlevel%なんて環境変数は無かった
9xの cd ... は好き
%date%も無かったなあ
AとBという2つのディレクトリがあって ディレクトリBには読み取り専用属性を設定してるんですが RobocopyでディレクトリA内のファイルとサブディレクトリをBにコピーすると Bの読み取り専用属性が解除されてしまうんですが解除させない方法は無いんでしょうか?
なぜここできくんだ
フォルダとディレクトリは別物だと思ってる爺だから
一応、実際に別物だよ ディレクトリってのはファイルシステム上での概念 フォルダってのはOSやデスクトップ環境での概念だからな 例えば、Windowsのデスクトップは 全ユーザ共有のデスクトップディレクトリと ユーザ個別のデスクトップディレクトリを併せて 1つのフォルダとして表示してる
あ、いやOSはディレクトリか… ともかくレイヤが違うって感じ
頭悪い奴だな(笑)
>>917 がレイヤだ何だの話をしてると思うのか?
属性付け直しじゃダメなの? attrib +r B & attrib +r B\* /S /D
ああ、これかな? robocopy A B /nodcopy
フォルダのRO属性はwindowsがほかの用途で使っちゃってるからな・・・ 無駄にRO属性つけると遅くなるぞ
下記のバッチを実行したら 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回ループしてるんだが こういう仕様なの?
その100回ループを見たとき「iの値だけの行」は本当に全部あるかい? forコマンドの内容は100回分に展開はされるのよ(echo off 時でも展開自体はされてる) その中で、実際にコマンドの呼び出しにありついてるのは途中までって話
Windows XP Home Editionでのサービスパック導入状態を確認できる方法はありますか? Professionalであれば WMIC OS Get ServicePackMajorVersion /Value で取得出来るはずですが、Homeでは出来ないようなので…
systeminfo は? XPが手元に無いんで分からんけど
>>930 Home Editionにはsysteminfoもないんです
レジストリ見れば分かるし、公式な資料やレジストリを見るためのコマンドもあるけど、そーいうのは求めて無いわな。 (万が一求めてるならMSDNかTechNet漁れ)
すいません。教えて下さいませ 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ディスクそのもの)を指定する引数を教えて頂けましたら幸いです
>>933 そのソフトのメーカーなりに確認がベスト
/Dのあとにドライブ指定とかだろうなと推測するけど、
引数は/P:でいいの?実はP:だけでいけたりしない?
>>934 ハイソルなんじゃそら、と思ったらHISOLですね
聞けませんすいません
>>935 その辺何度か試行錯誤した気はしますが、もう一回試してみます
やっぱり聞けませんすいません
938 :
933 :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:ディスクはドライブ上右クリック、「秘 文フォーマット」で実際にフォーマット可能です)
多分、また別の引数が必要だと思いますので諦めます
ボリュームの準備完了前に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
少し訂正 フォルダ作成処理はこちらのほうが無難か @rem フォルダの存在確認・ある場合はなにもしない :0 echo ドライブ発見 if not exist P:\etc\NUL mkdir P:\etc exit
pingをウェイト代わりにするのXP時代のバッドノウハウなので今なら素直にtimeout使った方がいいと思う
新規と新規フォルダの中に1,2,3というサブフォルダを作りたいのですが md 新規\1 cd 新規 md 2 3 でcmdだとうまくいくのですが、batだと1しか作られません 絶対パスを使うしかないのでしょうか?
>>942 先頭に
pushd %~dp0
とでも書いとけば?
>943 返信ありがとうございます。 pushd %~dp0 md 新規\1 popd cd 新規 md 2 3 だと何も反応がないようです。 batが速すぎて mdで作られた新規フォルダを認識出来てないんでしょうか?
popdしたら意味無いに決まってるじゃん。 わざわざmdの前に入れるとかわかってやってんだろ? 釣りだろ?
>945 最初にpopdない状態で試したのですがこちらも同じく 何のフォルダも作られなかったので 調べてみたらpopdと一緒に使うらしいので使ってみました。
pushd "%~dp0" for /l %%a in (1,1,3) do (md 新規\%%a) popd
>947 こちらも何も反応がありません 試しにcmdでpushd %~dp0をしてみたら 指定されたパスが見つかりませんとでます。 この辺が原因でしょうか? レジストリを見たら拡張編集は有効になってました
ああ、わかりました。 改行コードがCR+LFでなくLFになっていたせいでした。 pushd %~dp0をつけなくても動きました。 お騒がせしました。
3年はecho onしてろ
バッチファイルの引数に複数のファイルの絶対パスを与えて 各々操作するスクリプト(1)を書いているのですが パス内に「)」があると(%*)の閉じ括弧とみなされてエラーになってしまいます。 (1) for %%A in (%*) do (...) そこで一旦「)」を「^^)」に置換して対処しているのですが(2)、もう少しスマートな方法は無いでしょうか? (2) set path1=%* set path2=%path1:)=^^)% for %%A in (%path2%) do (...)
>>951 for %%A in ("%*") do (...)
これじゃダメなの?
>>952 どうもありがとうございます!
これで全く問題ありません
勉強になりました
再びすみません
>>952 の方法だと一度に%%Aへ全ての引数が渡されてしまってうまくいきませんでした
例えば、引数が「C:\foo\ C:\bar\」の時、for内は一度しか実行されず
%%Aは「"C:\foo\ C:\bar\"」になってしまうようです
>>954 ごめん。引数が複数ってのを完全に忘れてた
>>954 あ、どっちにしてもパスにスペースが含まれてると
スペースの前後で別々の引数として処理されるから想定どおりに動作しないね
どうやってパラメタを作っているのか知らないが、パラメタ一つ一つを""で括るような方向に持っていくべき
>>957 右クリック「送る」で引数を与えているのでちょっと難しいかもしれないです。
>>958 それだと、ファイル名にダメ文字がある可能性がありbatでは処理しきれない場合が出るので
WSHで処理する方向でどうぞ
例えば、
a&b.txt
a^b.txt
>>959 どうもありがとうございます。
WSHにはノータッチだったのでいろいろ読んでみることにします。
カッコ入りファイルが問題というなら、shiftで引数ずらすだけでよさそうだが違うのかな
>>954 を読んでそう感じたが
カッコ記号食わせる前提ならカッコを使う構文は避けて、shiftやgotoで回すほうが確実だと思う
念のため書くとこんな感じのね @rem 引数1がある間は繰り返し処理・無くなりし次第ENDラベルで処理終了 :LOOP if "%~1"=="" goto END @rem ここへ括弧を使わない処理を書く @rem [例] copy "%~1" "hoge" shift goto LOOP :END exit
バッチだと思わぬ落し穴があったりする ファイル名 "ab%cd%.txt" とか…
最初の質問を見た限り、括弧だけが問題じゃなく
一般の不特定のファイル名全てを対象にしたいという感じを受けた
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
forfiles /p c:\windows /c "cmd.exe /c echo @path" のもうちょっと軽いやり方ないですか dir /bだとフルパスが取れず dir /s /bだとサブディレクトリ巡回しちゃうし
一つ注意 問題ないというのは、ファイルを選択して「送る」の場合であり コマンドラインから起動するとbatの場合と同じく&や^はダメだよ
cd c:\windows for /f "delims=" %%I in ('dir /b') do echo "%%~fI"
フォルダの中に同名のサブフォルダが複数あり(第三下層)、その中にファイルが入っています。 サブフォルダの名前を指定して、ファイルを消さずにフォルダを削除する(ファイルは第二下層へ引き上げ)ってcmdで出来ますでしょうか?
これじゃだめ? フォルダ ├─サブフォルダ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%
>969 フォルダ ├─サブフォルダD │ └─サブフォルダE │ └─サブフォルダA │ ファイル ├─サブフォルダB │ └─サブフォルダF │ └─サブフォルダA │ ファイル ↓ フォルダ ├─サブフォルダD │ └─サブフォルダE │ ファイル ├─サブフォルダB │ └─サブフォルダF │ ファイル │ イメージはこんな感じです
・dir /a:d /b /s でサブフォルダのリスト取得 ・for でパスを??毎に区切る ・findstr で特定の文字列を含む行を抽出 この辺組み合わせればいけそう。
@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 ))
>>972 フォルダAの名にスペースが有ったら
rd "%%j"
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
>>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
>>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
977 :
968 :
2015/02/12(木) 15:34:02.00 ID:CcHe4lt9 みなさんお知恵をありがとうございます。 やはり結構複雑な処理になりますね。 rdのオプションにあったらいいのにとか思ったり。