初心者〜管理者まで必読!コマンドライン(DOS Pt.8)
1 :
名無し~3.EXE :
2009/05/24(日) 12:10:19 ID:J07+u5Pg 適材適所で GUI と CUI を組み合わせて、 (゚д゚)ウマー
DOS由来コマンドだけでなく、Windows バージョンアップのたびに拡充されてきたコマンド、
wsh(cscript)、cygwin、Resource Kit、Support Tools、その他のフリーソフト等ふくめ
コマンドラインインタフェースに関するネタならなんでもOK。
質問も歓迎だけど、自分で調べて勉強する努力も忘れずに。
前スレ
初心者〜管理者まで必読!コマンドライン(DOS Pt.7)
http://pc12.2ch.net/test/read.cgi/win/1217738171/
2 :
名無し~3.EXE :2009/05/24(日) 12:12:45 ID:J07+u5Pg
あげ
fc/?
8 :
名無し~3.EXE :2009/05/27(水) 17:13:14 ID:IeTG/H22
findstrやsed、grepなどで \ や " を使いたいのですが、 表示はできるのに、 > fin.txtとリダイレクトすると永遠に処理待ちやエラーになってしまいます。 |FINDSTR: 開くことができません (fin.txt) |grep: >: Invalid argument |grep: fin.txt: No such file or directory *nixなどのエスケープ文字としての \ と、コマンドプロンプトとは異なるのでしょうか? にしても、リダイレクトにするとエラーになるのがイマイチわかりません。 " を試していた時の hoge.txtは、こんな感じです。 "hoge" "moge" moge hoge [EOF] 試したコマンドラインは、こんな感じです。 c:\>grep "hoge\"" hoge.txt > fin.txt c:\>grep "hoge\"" hoge.txt > fin.txt c:\>grep "hoge\""" hoge.txt > fin.txt c:\>grep "hoge^"" hoge.txt > fin.txt c:\>grep "hoge^""" hoge.txt > fin.txt 正しいコマンドラインを教えてください。よろしくお願いします。
grep hoge^" hoge.txt > fin.txt grep ^"hoge\^"^" hoge.txt > fin.txt
10 :
8 :2009/05/27(水) 20:38:00 ID:IeTG/H22
>9 できました!ありがとうございます。 コマンドプロンプトのエスケープ文字が ^で、コマンドラインとして与える時には、 キーワードの対象文字全てに ^しておけばいいんですね!間にスペースを挟む場合も、これでいけました。 |C:\>grep ^"hoge hoge\^"^" "hoge hoge.txt" > "fin hoge.txt" こっちの例ではダメでした。処理待ちになってしまいます。動作確認は、XP/Vistaで。 |c:\>grep hoge^" hoge.txt |c:\>grep ^"hoge hoge.txt 別件。 move hoge.txt temp move moge.txt temp (しかも、tempディレクトリを作り忘れたまま)で、やってしまいました。 コマンドラインだと、上書き確認されるので、batにも、そのまま書いてたら… batの場合は明示的に/-Yつけてないと、確認無いんですね…。 油断してました。いや、こんなコトに今まで気づかなかった自分が情けない。
@echo off setlocal enableextensions enabledelayedexpansion set t=abcdefg echo !t:~0,4! if !t:~0,4!==abcd echo !t:~0,4! 実行結果 abcd 4!==abcd の使い方が誤っています。 何でこうなるのかさっぱり分からないです… 何か根本的な勘違いをしているのでしょうか?
一応今の状況を解説すると
こんな何時間も誰も相手にしないということは警戒されてる時
if "!t:~0,4!"=="abcd" echo !t:~0,4!
でいけるだろ、と書いたら
「そうじゃないんですよ、何でこうなるのかその理由を知りたいんですよ」
と牙をむいてくってかかってくる危険性が文章に仕掛けられている
それでみんな相手にしないと
まあそういうこと
>>11 は直しかたもすべてわかった上でわざと聞いてる、と考えるのが妥当
で?どういう意味? 間違いないの?
知らんがな 勝手に想像すればいいだろ 思うのはタダなんだし
if !t:~0^,4!==abcd echo !t:~0,4!
if a;,=a echo a
>>12 > 「そうじゃないんですよ、何でこうなるのかその理由を知りたいんですよ」
この部分は多分にあるけれど
>
>>11 は直しかたもすべてわかった上でわざと聞いてる、と考えるのが妥当
これは無いです。
>>15 で行けるのは分かったがなぜエスケープしなければならないのかが疑問。
if文でカンマって何を意味するんでしょうか?
ヘルプにはそれに関することは何も書いてないし…
ちなみに実際のif文はforの中に書いています。 結構何度もバッチ書いてるのに今まで引っかからなかったのが疑問な位ですが。
>>19 ありがたいです。
結構何年もバッチ書いてて初めて知ったようなw
>>12 さっきは気づきませんでしたが
> if "!t:~0,4!"=="abcd" echo !t:~0,4!
これじゃ駄目ですよね。
21 :
名無し~3.EXE :2009/05/28(木) 21:49:39 ID:U+1mTaXD
いけますがなにか?www
>これじゃ駄目ですよね。
牙をむいてくってかかってくる
はい予言的中ww
僕ちゃんなんねんもバッチ書いてまちゅー
けど、出来るかどうか自分では試すことはできません
何年もバッチ書いいてる
>>20
>>19 に"で区切り文字をエスケープできるって書いてあるだろ
24 :
名無し~3.EXE :2009/05/29(金) 00:16:02 ID:oLZd7y0B
>>19 に挨拶して黙って消えりゃいいものを
ひねくれた根性の悪さが災いして一言反撃してやろうという魂胆が墓穴掘ったな
>これじゃ駄目ですよね
とうどういうこと
パソコン持ってないの?バッチ書いて動かせば1秒で結果でる
なぜ他人に質問してるの?2chに投稿してる暇があったら簡単にできる
数年のバッチ歴をひけらかす日本を代表するバッチ男なんだろ
試してないが「これに書いてるのはどうせ駄目なんだろう」と言う意味か
25 :
名無し~3.EXE :2009/05/29(金) 00:29:10 ID:oLZd7y0B
じゃあバッチ野郎のAA頼む↓
if !t:efg=!==abcd echo !t:efg=! if !t:efg^=!==abcd echo !t:efg=! if "!t:efg=!"=="abcd" echo !t:efg=!
for /f "deims=;" は"で=;をエスケープ for /f deims^=^; でもおなじ
日ごとに生成されるログファイル(ファイル名が20090603.log等になってます)を type *.log > hoge.txt ↑でhoge.txtににまとめようとすると昇順にまとまりますよね? これを降順にhoge.txtにまとめたいのですが、どうも初歩的過ぎるようで参考になる情報がみつかりません。 どなたか教えてください。
dir/? for/?
dir /b/on *.log
(for /f "delims=" %%I in ('dir /b /o-n *.log') do @type %%I) > hoge.txt
longparmはどうよ?
コマンドプロンプトでプログラムの動作判定をしたいです Operaが終了したらif/else文かなにか(?)で判定してProxomitronを自動終了 というような作業をするのが目的です …が、if/else文はファイルしかサポートしてないようなので質問します
> if/else文はファイルしかサポートしてないようなので if /? どこにファイルだけなんて書いてある? そもそもif”だけ”で判断するようなもんじゃないが。
>>35 if existのtypoだろ
>>34 for /f ... in ('tasklist /fi ...')
cmdとPowerShellの中間が10年前に欲しかったよ。 WSHも使いづれーし意図的にGUI側に誘導しようとして 糞なまま放置したとしか思えん。
いや実際その通りだと思うが
ドライブレターがDのパーティションから、 ドライブレターだけ削除したいのですが、 どんなコマンドがありますか? diskpartのremoveだとリムーバブルドライブしか駄目なようなので困っています。
そうでもないな。 シンプルボリュームでもいけたわw
バッチファイルのfor文を使うときに、そのdo()の中で制御文--具体的にはif文--を 使う方法ってありますか?どうもif文の入れ子の要領でやってもうまくいかないようで。
普通に出来るが。 推測するにif文のところが問題なんではなく変数展開の問題と思うが。 遅延環境変数展開って言葉知ってるか?
レスありがとうございます >遅延環境変数展開って言葉知ってるか? 知ってます。でも基本的に駄目なんです、それ使っちゃ。大体こんな感じです。 set move_dir=C:\hoge\ rem パス中やファイル名に!があるかもね if not exist "%move_dir%%~nx1" ( for /f usebackq^ eol^=^ delims^= %%T in (`dir /b "%~dp1*%~n1*.*"`) do (ここでif not exist "%move_dir%%%T"ならmove "%~dp1%%T" "%move_dir%"とかしたい)
やべ、最後に)足りてなかった
moveはdefaultで上書きしないからifはいらない
>>45 おぉそういえばそうか!とも思ったけど、move以外のコマンドを使う可能性も
十分考えられるので、自分なりにファイルパス中に()や!が含まれるケースの
操作方法について考えてみた。
------------------------------------------------------------
set move_dir=C:\hoge\
for /f usebackq^ eol^=^ delims^= %%T in (`dir /b "%~dp1*%~n1*.*"`) do (
set target_F=%%T
set target_P=%~dp1%%T
call :move_action
)
goto :EOF
:move_action
if not exist "%move_dir%%target_F%" (
move "%target_P%" "%move_dir%"
) else (
echo "%move_dir%%target_F%"は既に存在します、移動取り消し
)
goto :EOF
------------------------------------------------------------
うーん、前スレの特に後半あたりでよく出てきた用例に触発されて
最近callをよく使ったりしてるが、実に使いやすい・・・
set move_dir=C:\hoge\ for %%I in ("%~dp1*%~n1*.*") do ( if not exist "%move_dir%%%~nxI" ( move "%%I" "%move_dir%" ) else ( echo "%move_dir%%%~nxI" は既に存在します、移動取り消し ) ) これじゃ駄目なのか
48 :
名無し~3.EXE :2009/07/26(日) 10:23:13 ID:2Xdbgl+/
コマンドラインから自分のグローバルIPを取得する関数はありますか? ipconfig ではLAN内のローカルアドレスしか取れないので困ってます。 できればWindowsネイティブの関数、なければcygwinで使えるものを探しています。
外にHTTPなりでリクエストを投げてレスポンスに Request-Hostを出してくれるような外部鯖を使わないとまず無理 もしくはtracertであたりを付けるか
>>48 LAN環境でのグローバルIPはそのPCが持ってるわけじゃないから
PCでコマンド打とうが何しようが出て来ないさ
グローバルIPを持つのはルータのグローバル側のポートだから
Telnetでルータに接続してifconfig叩く位しかない
超初心者の俺からの質問です。 treeやらdirでフォルダを一覧にする際に、 特定の階層まで(一階層下までなど)で、出力することはできますか? たとえばtreeやると、ずらーーーと何階層も下のフォルダまで表示するじゃないですか。 それを一階層までにしたいときはなんて入力しますか? 誰かお願いします
以下のようなバッチファイルを作ればtreeで一階層だけ出力できると思うが 正直お勧めしない @echo off for /D %%a in (%1\*) do ( for /D %%b in (%%a\*) do ( rd /s /q %%b ) ) tree %1
自作自演は正直お勧めしない
ファイルが一つだけ入ったディレクトリ、というものがたくさんあり、 整頓してファイルをまとめた一つのディレクトリを作りたいと考えています。 ディレクトリのみを消してファイルを残すというコマンドや方法はあるのでしょうか?
>ファイルが一つだけ入ったディレクトリ >ディレクトリのみを消してファイルを残す できない
bashかなんかの環境なら move ./**/* ./ でエラー吐きながらもやってくれた希ガス。 今は環境ないからわかんないけども。 コマンドラインでなくてもいいなら 移動とりどりでできる。
あるフォルダに、…[1].jpg という名前のファイルが多数入っていて これらのファイル名から[1]だけを外したいのですが、どうすればいいでしょうか?
位置が固定ならファイル名の3文字飛ばしてリネームが簡単。 位置が動くとちょっと面倒くさいな。
ren ????.* ?.* ren ?????.* ??.* ren ??????.* ???.* ...
FOR /F "tokens=1,2 delims=[1]" %a IN ('dir /b') DO ren %a[1]%b %a%b
delims=abc は aとbとcを区切り文字にするっていう意味だよ。 abcという文字列が区切りになるわけじゃない。
バッチで FOR /F "delims=" %%a IN ('dir /b') DO ( set n=%%~na call ren "%%~a" "%%n:~0,-3%%%%~xa" )
>>64 そうか、すまんかった(・ω・)
文字列の置換さえ出来れば[1]を/かなんかにして終わりなんだけど
タイムアウトを指定できるPAUSEコマンドのような外部ツールってありませんか
>>68 Vistaならずばりtimeoutってコマンドがあるよ
:?7%00%DDPYA44P,5@P_4?P],}P^5'2PZ-%qPR545PZ5E]1F}5uAP5,ZP]5w9'PU/5zjPRQu :Nide/com2txt/X-uw'P'5+~PZ5g(P]-vjPRU-*`P5H9P-E)PZ-KaP5V2P]5hTP5BSPRUVES :?[X5;:PZ5WN'PR',~P/5`QP5Z P-UrPEUQ]EENNNNNN:~ @echo off ( setlocal ren %0 %~n0.com "%~dpn0.com" 5 5秒PAUSE ren "%~dpn0.com" %~nx0 endlocal ) :~?aM!3"b3wvD[6%HF"6,IBt<[6j,I%0-2T`$,!tp"MdTpq36%H'LPi[6E%Iu<VPf0eH`!!^ :H7f-^e0f-Ptv9<\6wH)^-#]wf"-I%^f0f-5nvHrPevpoPKgf-<&^#]%Cf-]$Bf-?^H;f-*
コマンドラインを極めるのが時間の無駄だってことがよく分かる流れだな
72 :
名無し~3.EXE :2009/08/04(火) 21:11:07 ID:D+JSY9pz
わざわざcom2txt使うか?ぼけ
新出氏も相変わらずなようで
start /wait rsm.exe refresh /lf"4mm DDS" timeout 60 NTBACKUP BACKUP "@f:\backups\nightly backup.bks" /p "4mm DDS" /J "Nightly Backup" /l:s /m normal /HC:ON /UM /V:NO
secedit /refreshpolicy machine_policy /enforce secedit /refreshpolicy user_policy /enforce
81 :
名無し~3.EXE :2009/08/26(水) 00:06:27 ID:5EG0if/A
すみません。お知恵をおかりできませんでしょうか? 二つのテキストファイル(111.txt、222.txt)の文字列を比較したいのです。 111.txt ------- KB0001 KB0002 KB0003 KB0005 ------- 222.txt ------- KB0002 KB0006 -------- 比較した結果は、KB0002のみが抽出されるようにしたいのです。 222.txtの内容を変数にSETして FORでFCをまわしてやればいいのかとは思うですが・・・ すみませんがどうすればいいかアドバイスいただけませんでしょうか? テキストファイルの内容を変数にSETする方法だけでもお教え願えませんでしょうか??
for /f %i in ( 222.txt ) do echo %i
@echo off setlocal enabledelayedexpansion for /f %%i in ('"type 111.txt 222.txt|sort"' ) do ( if "!x!"=="%%i" echo %%i set x=%%i )
>>81 「comm」というUnixコマンド
$ comm -12 111.txt 222.txt
KB0002
…と思って探したらDOS版は意外に見あたらないな。
まぁ、Cコンパイラを持ってれば移植は簡単だが。
for /f %i in (111.txt 222.txt) do if exist %i (echo %i) else type nul>%i
findstr /g:222.txt 111.txt
> dir /b sss 2>&1 > NUL ファイルが見つかりません 標準エラー出力を消すのってこれじゃ駄目なの? うまく消えてくれない…
dir /b sss 2>NUL でいいんじゃね
>>87 順番逆にすればおk
dir /b sss >NUL 2>&1
意味ねーだろ
dir /b sss >NUL 2>&1 にどういう意味があるのか言ってみろよ 言えないだろ
馬鹿が居ますが気にしないでください
意味があるのは一目瞭然だけど、理由がわからんな… だれかメカニズムを教えてくれ…
見苦しいな
正しいのは
>>88 で、
>>89 はゴミでした。
と素直に認めればよいのに
>は左から評価
97 :
名無し~3.EXE :2009/08/28(金) 19:27:18 ID:QQt+uO29
ところで
標準エラー出力を消すのは
>>88 でよいけれど、
ファイルが見つかりません
てーのは標準出力なので、これを消すには
dir /b sss >NUL
ってなるけど、これじゃ意味ねー
if exist sss dir /b sss
みたいにやり方かえたほうがいいんじゃね?
>>96 もっと根本的?なところで
>>87 がダメな理由がわかんね。
標準出力と標準エラー出力の両方消したいときに同じような事やってしまいそうだが。
素直に 2>nul 1>nul でも俺的にはokなんだけど。
dir /b sss 2>&1 > NUL 初期状態1と2はコンソール 2>&1 1を2にコピー 結果、1と2はコンソール >NUL NULをオープンして1に設定 結果、1はNUL、2はコンソール dir /b sss >NUL 2>&1 初期状態1と2はコンソール >NUL NULをオープンして1に設定 結果、1はNUL、2はコンソール 2>&1 1を2にコピー 結果、1と2はNUL
>>101 >>87 がダメな理由はわかったような気がするが、今度はなぜ
> dir /b sss >NUL 2>&1
に意味がないのかわからなくなったぞ。
標準エラー出力を消すのに標準出力まで消してどうする? dir /bする意味があるのか?
俺は 2>&1 なんて書いてあるところから最初からそのつもり(出力全部消す)だと思ったが。
実際に使うコマンドは違っててリダイレクトの例としてdirを使ってるだけだと。
エラーだけ消したいなら最初から
>>88 にするのが普通だと思うし。
バッチ内でエラーレベル参照するだけなんで標準出力も標準 エラー出力もNULにリダイレクトする、ってのはよくやるな
出力全部消すつもりならわざわざ/bつけないだろ
UnxUtilsもそろそろバージョンうpしてくれないかな
新規書き込みレスの抽出に活躍中
113 :
名無し~3.EXE :2009/09/08(火) 19:38:42 ID:KSBFwEbc
.bat の右クリ-編集のエディタを変更するのってどうやるんですか?
move *aaa* ..\aaa\ のようなコードでディレクトリも移動してくれるやり方教えてください。 moveだとファイルだけ移動になってしまいます。
for /D %M in (*aaa*) do move %M ..\aaa\
current directory nameを取得したいけどこの場合forかなぁ c:\foo\bar\hoge\hage 上で実行すると hage を返す
%cd%じゃいかんの?
forかcallだけど、forです。
FOR /f "DELIMS=" %A IN ('basename %cd%') DO SET cdname=%A
FOR /f "DELIMS=\" %A IN ("%cd%") DO SET cdname=%A
FOR %A IN ("%cd:\=" "%") DO SET cdname=%A
for %d in ("%CD%") do set cdnamne=%~nd
T:\JKY\PC等>FOR /f %A IN ('cd') DO echo %A T:\JKY\PC等>echo T:\JKY\PC等 T:\JKY\PC等>FOR /f %A IN ('echo %cd%') DO echo %A T:\JKY\PC等>echo T:\JKY\P 下の書き方だと先頭一文字しか取得できないんだよな
%cd:\=&set cdname=%
ふりがながいなぁ
findコマンドとリダイレクトを使って、テキスト中に特定の文字列が見つかった時だけ ログファイルを出力するといったことをしようと思ったのですが、findによる出力は 該当する検索結果が無くとも改行とファイルへのパスの二行が強制的に表示されるので、単純に FIND "検索文字列" ファイルパス>>hoge.log ではうまくいきませんでした。XP標準のコマンドだけで実現する方法ありますか?
FIND "検索文字列" <ファイルパス>>hoge.log
GETCLIPBOARD 環境変数名 または /F[:]ファイル名 または /B[:]ファイル名 クリップボードに有効なデータがない場合環境変数は空になります(削除されます)。 環境変数の代わりに/Fまたは/Bオプションを指定してファイルにクリップボードの 内容を受け取ることもできます。 /F を指定時はテキストファイル、/B を指定時はビットマップファイルの指定になります。 クリップボードの内容を受け取れなかった場合、ファイルは元の状態のままになります。 /F を指定時にファイル名の先頭を '+' にすると指定のファイルに追加します。
コマンドプロンプト
何をやっているのかね
保守
保守をやっているのかね
暇つぶしだお
この手のリンクはすぐいなくなるので、無断転載しろ。
>>143 > [NT系]文字列の切り出しにFOR /F "delims="を使ってみたがうまくいかない (DOSプロンプト活用相談室LOG)
waybackにあったんで見たが、
"delims=abcde" でabcdeの文字列で切れると勘違いしたパターン。話になんね。
Win95時代でもBUなしではきつかった
T:\>TLIST -? Microsoft (R) Windows NT (TM) Version 5.1 TLIST Copyright (c) Microsoft Corporation. All rights reserved. usage: TLIST <<-m <pattern>> | <-t> | <pid> | <pattern> | <-p <processname>>> | <-k> | <-s> [options]: -t Print Task Tree <pid> List module information for this task. <pattern> The pattern can be a complete task name or a regular expression pattern to use as a match. Tlist matches the supplied pattern against the task names and the window titles. -c Show command lines for each process -e Show session IDs for each process -g Show group affinity for each process (Win7+)
D:\homo>TLIST|DKERRLVL FINDSTR ワードパッド 2128 wordpad.exe ドキュメント - ワードパッド errorlevel=0 D:\homo>TLIST|DKERRLVL FINDSTR ワードパッド errorlevel=1 D:\homo>cgrep p:// *.htm*|sed -f c:\bin\uty\urle.sed|sort|uniq|tee _|tclip
PsTools.zip tp://www.z4x.com/tools/PsTools.zip
本家sysinternalsから落とせるじゃん
bashのエイリアスみたいな機能はありますか?
事故解決しました。すみません。
コマンドプロンプトを実行した時、最初にどのパスにいくのか設定する事って出来ますか?
>>158 cmdへのショートカットを作る
右クリック プロパティで作業フォルダのところに
好きなパスを書け
このスレもすっかりさびれたな
>>160 Windows PowerShellが出来てwindows7のコマンドラインがほとんど変わってない所を見ると
もう放棄されたといっても過言じゃない状況だからだと思う
こっちは単発の質疑応答のみでいいんじゃないの。
xpにはあったヘルプファイルがvistaでなくなったのは責任放棄だろ
なくなったけど、MSが配ってる奴使えばまだ使えるでそ
もう目新しい話なんてないからな ぐぐればそこらに転がってるからわざわざ聞くまでもないし
SET OLDPATH=%PATH% PATH=@;%PATH% SET LIBRARY_PATH=A ↑これにはどんな意味があるのでしょうか? バッチコマンドなど調べたのですが結局分からず
どんな意味って環境変数PATHの意味がわからんってこと?
>>165 1行目 「OLDPATH」と名づけた変数に現在の環境変数の値を入力する
2行目 現在の環境変数に@という値(新たなパス)と既存の環境変数の値を入力する
→要するに既存の環境変数に@という新たなパスを追加してる
3行目 「LIBRARY_PATH」と名づけた変数にAという値を入力する
この3行の中では@、Aの値が出てきていないし
「OLDPATH」 「LIBRARY_PATH」といった変数も値をセットするだけで何も使っていない
何がやりたいのかは前後関係を知らないとわからんよ
賢い人達キタ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─ !! コンピューターの言語だろうか位しか分からんwww
あ、誤爆ったwww忘れてwww
2行目がSETコマンドじゃなくてPATHコマンドなのがこのお題のミソだな。 =はファイル名としても使えるのにここではコマンドセパレーターとして働いている その混沌っぷりがさらに話題を広げるのであった。
>>167 ,170
ありがとうございました
とあるバッチファイルの中身です
これを実行する事で、そのウインドウでのみ@にあるものを使えるようになるのですが
環境変数を書き変えて、その手間を省けないのかなと思い、質問しました
飢えたライオンに餌まく質問者
それに飛びつくライオン ライオンさん一言どうぞ ↓
あぁん
コードページが437の状態でコマンドを実行させたいのですが cmd /c chcp 437&dir <可能な限り1行で起動したい とかやってもdirが実行されるコードページが変更されていません コマンドプロンプトからの場合はコードページ変更が行われるようですが 「ファイル名を指定して実行」から実行した場合(CreateProcessによる起動?)に コードページの変更が行われないようです コマンドプロンプトからの実行でなくてもコードページを変更して実行する方法が あったら教えてください よろしくお願いします
cmd /c cmd /c chcp 437&dir
cmd /c chcp 437&cmd /c dir
現実世界から二次元世界へと戻るコマンドを教えてください
残念! コマンドラインは一次元の世界だ
ヘルプファイル見るより検索した方が早い気が ここで知ったか振るという手もあるけどw コマンドラインごみ箱ツール「GB」1.0.1
DOSっていうかバッチファイルすごいね。 レジストリ設定ファイルを作るバッチで小技が効いてる。 ブラウザで開く代わりにインターネットショートカットを作成するというものなんだけど。 出来立てほやほや置いときますね -- MakeDefaultBrowserSetReg.bat -- rem host\MakeInternetShortcut.batをデフォルトのブラウザに設定するレジストリファイルを作成します。 rem パス名の\を\\に置換 set VMWInterAppPath=%~dp0host\MakeInternetShortcut.bat set VMWInterAppPath=%VMWInterAppPath:\=\\% rem レジストリファイル echo Windows Registry Editor Version 5.00 > SetDefaultB.reg echo. >> SetDefaultB.reg echo [HKEY_CLASSES_ROOT\ftp\shell\open\command] >> SetDefaultB.reg echo @="\"%VMWInterAppPath%\" \"%%1\"" >> SetDefaultB.reg echo. >> SetDefaultB.reg echo [HKEY_CLASSES_ROOT\HTTP\shell\open\command] >> SetDefaultB.reg echo @="\"%VMWInterAppPath%\" \"%%1\"" >> SetDefaultB.reg echo. >> SetDefaultB.reg echo [HKEY_CLASSES_ROOT\https\shell\open\command] >> SetDefaultB.reg echo @="\"%VMWInterAppPath%\" \"%%1\"" >> SetDefaultB.reg set VMWInterAppPath= -- host\MakeInternetShortcut.bat -- rem ショートカットの作成 echo [DEFAULT] > ..\OpenURL.lnk echo BASEURL=%1 >> ..\OpenURL.lnk echo [InternetShortcut] >> ..\OpenURL.lnk echo URL=%1 >> ..\OpenURL.lnk
拡張子はurlだろが。死ねよ。
そうそう。 URLでした。 あと、カレントディレクトリをファイルのあるディレクトリを基準に考えてましたが間違っていました。 ファイルパスにはすべて%~dp0をつけて「%~dp0..\Open.url」とかにしないと駄目でした。 普通の実行ファイルだとたいてい実行ファイルのある場所がカレントディレクトリになってるからそのつもりで作っちゃった。 テストで実行するときはエクスプローラーで実行したけど、そんときはその場所がカレントになるから気がつかなかった。
>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Tools" /v InstallPath | for /f %P in ('find "InstallPath"') do set VMW-IPTEMP=%P Toolsがインストールされたパスをレジストリから取得し、環境変数に入れたかったんだけど、無理なのかな。 FINDの結果を一旦ファイルに出力して set /p path=<ファイル名 で実現はできたんだけど、 最初に書いたコマンドの結果は set VMW-IPTEMP=InstallPath となり、スペースで区切られたところまでしか取得できない。 確か標準入力は開業もスペース区切りも同一に扱われた気がするけど・・そのせいかな?
"delims="
>>185 ありがとう。1行取れました。
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Tools" /v InstallPath | for /f "delims=" %%P in ('find "InstallPath"') do echo %%P
でも、echo %%P はうまくいくけど、 set VMW_IPTEMP="%%P" でやっても、環境変数には代入されませんでした。
コマンドラインでもバッチファイルでも同じでした。
一応コマンドは実行されるんだけど。
他にこんなのも試したんですが、だめでした。
find "InstallPath" | set /p VMW_IPTEMP=
find "InstallPath" | set /p VMW_IPTEMP=<con
代入はされてる。ただし、子プロセスの環境変数は親に逆遺伝しない。 for /f %%P in ('echo AAA') do set XXX=%%P echo %XXX% echo BBB | for /f %%P in ('echo AAA') do set XXX=%%P echo %XXX% echo BBB|for /f %%P in ('echo AAA') do set XXX=%%P & call echo %%XXX%%
echo BBB | set XXX=AAA echo %XXX% echo BBB | (set XXX=AAA call echo %%XXX%% )
なるほど。 パイプ使った先で環境変数に入れるなら、そこで処理してしまわないと駄目なんですね。 結局ファイルを経由して set /p オプションでリダイレクトするのが正しかったか。
for /f %P in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Tools" /v InstallPath ^| find "InstallPath"') do set VMW-IPTEMP=%P echo %VMW-IPTEMP%
>>190 パイプ処理まで中に含めるとは思いつきませんでした。
ありがとうございました。
echo BBB | (set /p XXX= call echo %%XXX%% )
おはようございます、ちょっとコマンドについて質問させてください IEで、インターネット一時ファイル"のみ"を削除するには、 どのようなコマンドを打ったらよいのでしょうか? rd /s "tempor~1" だと、クッキーやフォームなども一緒に削除されてしまいます
無いから作れ。
>>197 おお、できましたサンクスです
ただ、cのクリーンアップのチェックは全て外し、
cleanmgr /d z: /sageset:1
でセットしておいても、
cleanmgr /d z: /sagerun:1
をbatにして実行すると、目的のzドライブだけではなく、cドライブも毎回空きを計算してしまいます。。
いい方法ありますか?
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8
FOR /f "skip=4 tokens=3" %%A IN ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') DO SET desktop=%%A
空白があると駄目だろ?
tokens=1,2,* do set desktop=%%C って所かな。
syslogをbat処理する時に困っています。 ↓で始まる行を直前の行と繋げたいのですが、どうしたら良いでしょうか? ,0,LAN - sed-1.18+mb1.03で色々試しているのですが、うまくいきません。 キーワードがあった行と次の行をつなげることは出来たのですが・・・。 よろしくお願いします。
空白・2バイト文字があるとアウトだね
>>205 各行を改行なしで書く。
なんとかで始まらないときだけ行頭に改行を書く。
最後に改行を書く。
C:\bin>type t.sed /.*$/N s/\n// C:\bin>type log.txt A ,0,LAN - B ,0,LAN - C ,0,LAN - C:\bin>sed -f t.sed log.txt A,0,LAN - B,0,LAN - C,0,LAN - 適当に書いてみた
forでできる
set sec=%now:~6,2% if %sec% lss 14 set m=14&&goto st if %sec% lss 29 set m=29&&goto st if %sec% lss 44 set m=44&&goto st if %sec% lss 59 set m=59&&goto st :st
now ?
Console Registry Tool for Windows - version 3.0 Copyright (C) Microsoft Corp. 1981-2001. All rights reserved regコマンドは2000じゃ使えないんか...
持ってけよ
スレ立てるまでもない質問はここで 105匹目より誘導されてきました。 WindowsXPで、タスクの登録を管理者権限を持っている人間が行うとして、タスクをユーザーアカウントを見て実行させるか、どうかを判定したいと考えています。 ・atコマンドで登録 →コマンドプロンプト上で実行 at 15:00 cmd /c if "Guest" equ ^"%USERNAME^%" ( echo hoge ) で実行するも、登録はされるのですが、 1、ダブルコーテーションがはずされてしまうという問題があります。 2、これを今度はバッチファイル上で実行しようとすると、ダブルコーテーションがはずされた上に、^"%USERNAME^%"の部分が^だけになってしまいます。 なにか、解決に向けてヒントなりをいただけないでしょうか、、、
at 15:00 "cmd /v:on /c if \"Guest\" equ \"!USERNAME!\" ( echo hoge )"
>>220 レスありがとうございます。エスケープシーケンス\と、!について教えていただき、前進することができました。
レスもらってから、うまくできなかったため、今も試行錯誤しています。
(cmd.exeをダブルコーテーションで囲むか、最初と最後のダブルコーテションをはずすとうまくいきました)
「ファイル名を指定して実行」
cmd.exe /v:on /c if \"Guest\" equ \"!USERNAME!\" ( echo hoge ) はうまく動作しました(ありがとうございます)。
しかし at 15:00 cmd.exe /v:on /c if \"Guest\" equ \"!USERNAME!\" ( echo hoge ) はうまく動作しません。
原因を探ったところ、 at 15:00 cmd.exe /v:on /c echo \"!USERNAME!\" ^> C:\test.txt で確認すると、実行結果は
"!USERNAME!\" がそのまま書き込まれていました。
上記をうまく解決するため、atに登録した時点で環境変数(?)を開くうまい方法などあれば、ご教授いただければと思います。
at 15:00 cmd.exe /c echo \"%USERNAME%\" ^> C:\test.txt
>>222 レスありがとうございます(なんどもありがとうございます)。
at 15:00 cmd.exe /c echo \"%USERNAME%\" ^> C:\test.txt
自分の環境だと上記コマンドは at 数字 で確認すると、すでに登録した段階でユーザー名が展開されてしまいます。
(コントロールパネル→タスク at数字のプロパティで確認すると、タスクを登録した段階で環境変数が展開されております、、、)
at 15:00 cmd.exe /c echo \"%%USERNAME%%\" ^> C:\test.txt
などもいろいろためしてみたのですが、、、上記の場合は、C:\test.txtの中身が "%USERNAME%"になってしまいました、、、。(/v:on のあるなしに関わらず、、、)
なにか、良い方法があると、、、いいのですが、、、。
at 15:00 cmd.exe /c set ^> C:\test.txt
>>223 事前にbatを作っておいてそれを実行するんじゃダメなんですか?
[test.cmdの中身]
if "%USERNAME%" equ "Guest" echo "%USERNAME%" > C:\test.txt
で、at 15:00 c:\test.cmd
を実行とか。
ところで目的は何ですか?
15:00ぴったりに使用していないと、その実行は明日に持ち越しになっちゃいますが
それでも良いんですか?15:00以降に最初に使ったユーザーとかじゃなくて?
また一回こっきり実行でいいんですか?毎日とかじゃなくて?
もしユーザーの管理に使いたいなら、ログオンスクリプトとして登録しておいて
ユーザーのログオン時を捕まえるのが良いと思うんですが?
@echo off
if "%username%"=="xxx" (
挨拶メッセージを表示
コマンド1
コマンド2
) else if "%username%"=="yyy" (
コマンド3
) else if "%username%"=="zzz" (
コマンド4
)
at 15:00 cmd.exe /c whoami ^> C:\test.txt
atのタスクがユーザアカウントでなく、システムアカウントで実行されることを分ってない?
皆様コメントありがとうございます。
>>224 レスありがとうございます。
setの中身を確認して、ようやく自分がアホなことをやっていることがわかりました。
(素で実行したのと、atで実行したのを比較して、%USERNAME%を確認しました)
>>225 レスありがとうございます。
(
>>225 の言うとおり)目的はある時間にAさんなら実行するけど、Bさんは実行しないスクリプトを組みたいと考えています。
at 15:00っていうのは特に意味はなく、質問するにしても可能な限りスクリプトを短くしたかったためです。
自分の環境では、教えていただいたbat処理は、ユーザーが "" になりましたので、違う手を考えてみます。
>>226 レスありがとうございます。
WindowsXP SP2 Support Tool入れてみて実験してみたいと思います。
>>227 レスありがとうございます。
システムアカウントが実行するということはなんとなく知っていたのですが、
>>224 のsetでようやく理解できました。
whoamiでログインユーザーがとれるかちょっと実験してみたいと思いますが、、、atコマンドで実行すれば、システムアカウントになるのを確認しようと思います。
at 15:00 cmd /c wmic computersystem get username ^>C:\test.txt
特定ユーザーでのみタスク実行したいのならatコマンドでなく実行アカウントを指定できるschtasksコマンドを使えば? 元々atコマンドはNTの互換のために残されている過去の遺物なので。
だめだろきっとパスワードがいるから
皆様コメントありがとうございます。
>>229 レスありがとうございます。
atでログインユーザー名を確認できました。
ありがとうございます。
>>230 レスありがとうございます。
>>231 が言うように、パスワードが必要なため楽な方法を探しておりました、、、。
(結果的にみなさまの貴重なお時間を割いていただいておりますが、、、)
>>231 レスありがとうございます。
おっしゃるとおりです、、、orz
wmicからのパイプ処理?について現在勉強しております。
少し時間がかかるかもしれませんが、うまく行きましたら報告いたします。
タスクは無差別にバッチを実行するだけにして、バッチの中でIF文使って %USERNAME%が条件に合った場合だけやりたい処理をする、 みたいな構成じゃダメなの?
ごくろうさん
なんかイタズラの臭いがするなあ 教えたのは失敗なんじゃないかな
できましたので、報告します。
for /F "usebackq skip=1" %%x in (`wmic computersystem get username`) do if /i "%%x" equ "%COMPUTERNAME%\%1" ( echo "hoge" )
>>223 レスありがとうございます
先に試しましたが、自分の環境ですとatで実行すると %USERNAME" にはなにも入っておりませんでした。
>>234 レスありがとうございます
すべてのレスをくれたかた、ご苦労さまでした。
>>235 レスありがとうございます
イタズラにも使えるでしょうし、有用なことにも使えるかと思います。
OSのバージョンを区別するスマートな方法ってないよな MS手抜くなよ
ver /?
SET UsrOS1=(不明) VER|FIND "Windows">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系?:不明) VER|FIND "Windows 95">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(Win9x系:95) VER|FIND "Windows 95. [Version 4.00.1111]">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(Win9x系:95_OSR2) VER|FIND "Windows 98">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(Win9x系:98) VER|FIND "Windows 98 [Version 4.10.2222]">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(Win9x系:98_SE) VER|FIND "Windows Millennium">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(Win9x系:Me) VER|FIND "Windows NT">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系:NT) VER|FIND "Windows NT Version 4.0">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系:NT_4.0) VER|FIND "Windows 2000">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系:2000) VER|FIND "Windows XP">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系:XP) VER|FIND "Windows [Version 5.2.">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系:Server2003) VER|FIND "Windows [Version 6.0.">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(WinNT系:Vista) VER|FIND "MS-DOS">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(非Win系:MS-DOS) VER|FIND "MS-DOS バージョン 5.00">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(非Win系:MS-DOS_5.0(EPSON製98互換機用で確認)) VER|FIND "MS-DOS Version 6.2">NUL IF NOT ERRORLEVEL 1 SET UsrOS1=(非Win系:MS-DOS_6.2(EPSON製98互換機用で確認))
>>239 煽りじゃなくてマジで疑問なんだが x64 と x86 の見分けは?
ついで言えば IA64 は?
jt.exeに関して質問です。 win7のタスク(windows/system32/tasks)を制御しようとしてますが、 jt /lj %systemroot%\system32\tasks\(タスク名) /sj SystemRequired = 1 [TRACE] Loading Job C:\Windows\system32\(タスク名) [PERF ] Load took 0 ms [FAIL ] IPersistFile::Load hr=0x80041313 となり、うまく制御できません。 根本的にやり方まちがってますかね?
根本的にやり方まちがってるんじゃない? タスクスケジューラはVistaで変わったからjtは使えないんじゃないか なんでos標準のschtasksを使わないの?
>>242 ありがとうございます。
いや、それがschtasksだと、そこまで(スリープからの復帰)制御出来ないんですよ。
createobject("schedule.service")はどうだろ?
TaskSettings.WakeToRun Propertyがあるね
スターターの私には難しそうですがいろいろやってみます。
>>240 PROCESSOR_ARCHITECTURE見ればいいんでない?
コマンドライン中で純粋に特別な意味を持つキャラクタとしては、 < > | の3つだけでしょうか。 つまり、 ECHO ほにゃらら〜〜〜ふにゃらら というように数十文字のテキストを表示するとして、 〜〜〜の中に入れてはいけない文字が知りたいのです。
^
>>250 ヒントをいただいてかなり分かりました。
まとめると以下のようで正しいでしょうか?
■コマンドラインで通常の文字と扱われない特殊キャラクタ、およびエスケープ方法
◆MS-DOSプロンプト(全4種)
<
>
|
※以上の3種は " (ダブルクオート)で括られた状態なら通常の文字として扱われる
% → %%
◆コマンドプロンプト(全9種)
< → ^<
> → ^>
| → ^|
& → ^&
( → ^(
) → ^)
^ → ^^
※以上の7種は " (ダブルクオート)で括られた状態なら通常の文字として扱われる
% → %%
" → ""
C:\>echo %% %%
C:\> echo ( (
なんて早さの即答…迷い無しですね。ありがとうございます。 なるほど、コマンドプロンプトでは%%でエスケープ、というのは ウソ情報をつかんできてしまったようです。 ただし、DOSではこれで正しい。 すると… %windir%と表示したい場合は、 COMMAND.COM echo %%windir%% CMD.EXE echo ^%windir^% ということですね。 あと、 " → "" というのもエスケープされてるのかされてないのか分からないですね。 常識的にはエスケープされてるとは言えないと思いますので、除外します この考え、正しいのかな?? 他に何か見落としがありますでしょうか?
>>253 そもそも () の使い方が分からない…。
ECHOで単体なら大丈夫と言うことですね。
しかし、使用できない文字、エスケープすべき文字の確認が目的ですので、
これは前述の通り普通に ^( ^) で良いかと。
エスケープしなくても大丈夫なパターンを探してるわけじゃないんです。
set windir^^=aaa echo ^%windir^%
echo ^" ^" echo " ^"
cmd/?|find "特殊文字"
>>256 >>258 う、難しい。勉強してみます。
>>257 ありがとうございます。
今ちょうど、
echo " | "
echo ^" | "
なんてやって確認してたとこでした。
結論は、
" → ^"
ですね!
>>256 これは分かりません??
結果は%windir^%にaaaが入ってますよ、と。
先頭の ^ はどこへ消えたのか?
%のエスケープが^%でないとしたら、どういうルールなのでしょうか。
これは自分では答えを出せそうに無いです。
>>258 ややこしいですねぇ。
cmd/?|find "^"
とか、
set test=ファイル
cmd/?|find "%test%"
とかやってました。
シェルとコマンドの仕事の範囲が明確で無いから分かりにくいんですかね。
もしくはリテラルの定義が明確で無いからか。
自分が必要としているのはechoだけなんですが、
>>256 の結果は影響がありそうです。
ぜひ解説していただけないでしょうか。
set windir^^=aaa echo %windir^%
c:\> cmd/?|find "特殊文字"
set windir^^=aaa set windir
XP及び7でコマンドライン or WSHから関連づけの登録を行うのにどのような方法がありますか? 標準でインストールされているソフトウェアの影響を受けにくい方法を探しています よろしくお願いします
レジストリ書き換えしかないだろ
assoc ftype
英字大文字を小文字に変換するコマンドがないよね
setがあるだろが なんとかとsetは使いよう
どういうことでござるか?
set x=%x:A=a%
コマンドプロンプト初心者です>< "xxx".拡張子 というファイルをD&Dして、以下のようなテキストファイルを吐き出すバッチ作りたいのですが ↓テキストファイルの中身↓ video = MPEG2Source("xxx".d2v) audio = WavSource("xxx".wav) AudioDub(video, audio) "xxx"の部分にD&Dしたファイルの名前だけを代入して吐き出させるようにするにはどうしたらよいでしょうか><
こりゃー釣りだな
釣りか真性かというと後者の方じゃないかと思うんだが
ちょっと調べりゃわかるけど、 1) バッチパラメータとして、%0〜%9ってのがある 2) パラメータには修飾子が使える。 %~1, %~n1など 3) 表示コマンド echoで出力先を標準出力からファイルにリダイレクト > or >> できる
>276さん なんとか作成することができました。 にありがとうございました〜
>>269 @if(0)==(0) echo off
if "%~1"=="" echo パラメタ1に入力ファイル名(変換元)を指定してください& goto :eof
if not exist "%~1" echo 指定ファイル"%~f1"が存在しません& goto :eof
cscript //nologo //e:jscript "%~f0" <"%~1" >output.txt
goto :eof
@end
WScript.Echo(WScript.StdIn.ReadAll().toLowerCase());
スゲー昔のことで悪いけど
>>127 これの動作を誰か解説してくださいな
>>279 文字の置換
%cd% 中の「\」を「&set cdname=」で置換するとどうなるか
c:\aaa\bbb\ccc → c:&set cdname=aaa&set cdname=bbb&set cdname=ccc
即ち
c:
set cdname=aaa
set cdname=bbb
set cdname=ccc
個人的にはdos窓を沢山開いてる時の識別用に
%CD:\=&title % をよく使う
ありがとさん 俺が混乱してた理由 &で一旦切れると思ってた。 そのまま置換されてさらに再度評価されるんだね。
再度評価じゃなくて評価の順序でしょ
cmd.exe だと title でウィンドウのタイトルを設定できるけど powershell.exe ではどうすればいい?
$Host.UI.RawUI.WindowTitle = "title" とかそんな感じ
あんがと とりあえず function title {$Host.UI.RawUI.WindowTitle = $args[0]} としといた
powershell.exe だと $Host.UI.RawUI.WindowTitle でウィンドウのタイトルを取得できるけど cmd.exe ではどうすればいい?
ウィンドウの概念が無いんじゃ…
できました
制限ユーザでログオンしてて、無線LANと有線LANの有効/無効を手軽に切り替えたいです。 管理者のパスワードは手入力で。 devcon.exeを入れて↓のショートカットを作って実行してもうまくいきません。 %windir%\system32\runas.exe /user:USERNAME "c:\bin\devcon enable 'PCI\VEN_HOGEHOGE'" runasのパスワード入力してもそのまま終了(エラーが出てるだろうけどすぐ消えちゃって確認できない)。 devcon enable "PCI\VEN_HOGEHOGE"とすべきところをダブルクォートの入れ子がダメだったのでシングルクォートを使ってみたのが原因だと思う。 どうすればいいの? MakeMeAdmin.cmd(制限ユーザで一時的に管理者権限のコマンドプロンプトが起動できます)でdevcon enable "PCI\VEN_HOGEHOGE"としたら期待通りに変更できました。 なので"PCI\VEN_HOGEHOGE"のハードウエアIDが間違ってるとかではないと思う。 あと、ショートカットを実行後に(表示だけでも)一時停止みたいに出来ない? バッチファイルのpauseみたいなの。 キーを押さないとウィンドウが閉じないようにしたい。 XP PRO SP3です。
runas/?
あと、cmd/k
ありがとん。
runas /? の例のところに
> runas /env /user:
[email protected] "notepad \"my file.txt\""
て書いてあったのでダブルクォートの入れ子は使えるってことなのかな?
でも↓のをショートカットにしてみたけどやっぱエラーになる。
cmd.exe /k "%windir%\system32\runas.exe /user:USERNAME "C:\bin\devcon.exe enable "PCI\VEN_HOGEHOGE"""
USERNAME のパスワードを入力してください:
C:\bin\devcon.exe enable PCI\VEN_14E4 をユーザー "DOMAIN\USER" として開始しています...
'DEV_HOGE' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'HOGE2' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'HOGE3""' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
\"
ありがと。節穴だった。 \でエスケープするのか。 もう一段深くするのは\\"じゃないの?↓うまくいかないよ。 cmd.exe /k "%windir%\system32\runas.exe /user:USERNAME \"C:\bin\devcon.exe enable \\"PCI\VEN_HOGEHOGE\\"\""
何も試してないしヘルプすら見てないんだが、 \がエスケープ文字だというんなら、 PCI\VEN_HOGEHOGEの中の\とかもエスケープがいりそうな気がする。
あ、そうか。 じゃパスのデリミタの\もエスケープしなきゃダメだな。 もう訳わからんくなってきた。(´・ω・`)
CommandLineToArgvW has a special interpretation of backslash characters when they are followed by a quotation mark character ("), as follows: •2n backslashes followed by a quotation mark produce n backslashes followed by a quotation mark. •(2n) + 1 backslashes followed by a quotation mark again produce n backslashes followed by a quotation mark. •n backslashes not followed by a quotation mark simply produce n backslashes.
d。また少し賢くなった。 cmd.exe /k "%windir%\system32\runas.exe /user:USERNAME \"C:\bin\devcon.exe enable \\\"PCI\VEN_HOGEHOGE\\\"\"" でも失敗。 が、エラー(?)の種類が変わった。 RUNAS 使用法: RUNAS [ [/noprofile | /profile] [/env] [/netonly] ] /user:<ユーザー名> プログラム ...略... "PCI\VEN_HOGEHOGE"のところに&が入ってた。"PCI\VEN_HOGE&hage"みたいに。 これ関係あるのかな? ダブルクォート中の&は特殊文字として扱われなくてそのままだと思い込んでた。 後出しでホントに申し訳ない。
^
cmd.exe /k 外すとうまく行く。 %windir%\system32\runas.exe /user:USERNAME \"C:\bin\devcon.exe enable \"PCI\VEN_HOGE&hage\"" 取りあえず一番目の目的は達成できた。 けど、もうちょっとがんばってみる。 runas.exeが引数の解釈が独自だったりするのかな?? 日記に付き合ってくれてありがと。
runas.exeがMS標準シンタクス cmd.exeが独自解釈
直前に飛んだラベル名とかサブルーチン名を取得する方法って無いですかね? call :sub :sub echo %~0 goto :eof みたいにやって :sub とか出れば嬉しいんですけど…
%0で出るだろ?
と思ったら出ないね 昔、出たような気がするが
こうすれば出てるのが確認できる call :sub :sub echo %~0 pause goto :eof
>>306 あれ?
何度やっても出なかった…と思っていたら
echo %~n0
とやってて本体バッチ名取得してました
%~0 ならサブルーチン入るんですねorz
しょうもない質問ですみません
shutdown /r
ちょいと質問ですが、startコマンドの正体って何ですか? batch?exe?探したけど見つからない
シェルつーかCMD.EXEの内部コマンド。 dirとかechoとかと一緒。
9x/Me では start.exe だったぞ
生き字引だね
老害って言うなぁ ><
315 :
名無し~3.EXE :2010/06/13(日) 05:26:28 ID:Rhlj2NIa
労咳乙
M/B温度、CPU温度、HDD温度を コマンドラインで取得したいです。 ご存知な方、ご教授ください。
net send /domain:hogehoge "誰かCPU温度見てきてくんない?"
>>317 役立たず
このコマンドの構文は次のとおりです:
NET
[ ACCOUNTS | COMPUTER | CONFIG | CONTINUE | FILE | GROUP | HELP |
HELPMSG | LOCALGROUP | PAUSE | PRINT | SESSION | SHARE | START |
STATISTICS | STOP | TIME | USE | USER | VIEW ]
>>318 vista以降はnet send無くなったみたいだな…
>>318 そうか?
有能なパシリを確保すれば無限の可能性を秘めている最強コマンドじゃないかw
Vista以降は
>>319 の言うように msg にしないとイカンようではあるけど
>>321 いきなりケース開けられて温度計当てられるのが最強だと思えるってステキだな
いや、さすがにパシリにそんなことさせないだろw 「俺がいない間に H/Wモニターと温度計付けとけ、PC壊したらゆるさん。 そして定時計測と俺が尋ねた任意の時の情報を即座に知らせろ。 ついでに茶ぁもってこい」 パシリなんだからこんな感じだろ
プログラマの進化を思い出した
>>321 ホント役立たず
'msg' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
326 :
316 :2010/06/18(金) 14:56:24 ID:Czg/EYoB
やはり無理なのでしょうか? wmicコマンドで可能でしょうか? wmicコマンドに熟知しているかた、 よろしくお願い致します。
snmpって温度とか取れるんじゃないっけ?
っけ?という語尾をつけたら2chぽいと評価された時代は 5年前に終わりました。まだ気づきませんか?
そんな時代があったんだ。 2chにすごく詳しいんですね。2ch歴何年ですか?
しあわせってなんだっけなんだっけ
キッコーマンの醤油は不味くはないが美味いと言う程でもない
ソースは2ch。
333 :
316 :2010/06/19(土) 08:03:52 ID:Oyfqtbw0
>>327 MotherBoard Monitorを使用してsnmpで取れます。
しかし、MotherBoard Monitorはログインしていなければ取れないのです。
for と dir を組み合わせて空き容量を取得するところまではできたけれど, それをMB/GB表示するとこでつまずいた。 XPなら
du.exe 拾ってこい
for /F "tokens=3" %%s in ('fsutil volume diskfree C:\実況') do echo %%s まともに動かなかったのはこのディレクトリ名のせいでした。 ごめんなさい。
forのカッコ内の全角文字の解釈、いつになったら直るんだろうなぁ。 DOS時代のforから生まれ変わって機能拡張したNT4.0SP3の頃からずーっと不調のまま。 昔より多少は改善してるけど、未だに手放しで信用できるレベルじゃないから、わざわさ 一時ファイルにいったん吐いてからfor /fで読ませるような段取りしてやってる。
HDDもTB超のこの時代にint32bitまでしか扱えないってのはなかなか辛い。 外部コマンド無しでHDDの空きをMiB・GiBに計算する方法は無いもんだか。 俺じゃ%freespace:~0,-6%みたいな次善策しか浮かばん…
一桁ずつ計算すればいいんじゃねえの?
>>338 上位桁と下位桁に分けて計算すりゃええじゃないか 小学生の算数だろ
>>337 ご苦労なこって 使い方が下手なだけだろ
>一桁ずつ計算すればいいんじゃねえの? わかったようなこと言ってわかってねーんじゃねえの?
ねえの?という語尾をつけたらVIPぽいと思われた時代は 5年前に終わりました。まだ気づきませんか?
せめて4桁ずつでないと難しいんじゃないか
345 :
名無し~3.EXE :2010/06/20(日) 22:22:56 ID:kOOEfEcy
質問 forの中でgoto使ったらだめとかそういうのは無いですよね? gotoのあとで終わっちゃうんです
346 :
345 :2010/06/20(日) 22:23:45 ID:kOOEfEcy
もちろんforの()内にラベルはあります
他の言語でもgotoは帰ってこないような? ご希望はcallの拡張機能ではなくて?
( goto :aaa echo aaa goto :bbb ) :bbb echo bbb ってやってみな
ごめ ( goto :aaa goto :bbb :aaa echo aaa ) :bbb echo bbb ってやってみな
C:\Documents and Settings\azusa>set z=j,k,l C:\Documents and Settings\azusa>set z=%z:,=% C:\Documents and Settings\azusa>echo %z% jkl
351 :
345 :2010/06/21(月) 02:20:35 ID:yphIa24T
>>347 callでラベルに飛べるんですね〜
ところで、現在末尾に@pause > nulと書いて表示を見てるんですが、
多分このせい?でキーを押さないと繰り返しを続けてくれないんですよね
@pause > nulのほかにウィンドウを閉じない方法は無いですか?
>>349 よくわからない;
そりゃバッチをダブルクリックで実行してるからだろ。 コマンドプロンプト開いてCUIで実行したら処理終了してもそのまま。
>>351 「末尾」がcallされたブロックの一部になっちゃっててるからだろ。
@echo off
for %%v in (a b c d e f g) do (call :ex %%v)
call :ex2
@pause > nul
goto :hell
:ex
echo %1
goto :hell
:ex2
echo オワタ
REM goto :hell ; これはなくても結果は同じ
:hell
ファイル末尾にpause入れるなら サブルーチン抜けたいところでgoto :eof eofはラベル不要。 自分の作ったラベルに飛んだら末尾のpauseに引っかかる。
for /F "tokens=3" %%s in ('dir %tmp%') do set size=%%s set size=%size:,=% set /a size=%size%/1024/1024 echo %size% MiB
356 :
345 :2010/06/21(月) 22:30:59 ID:yphIa24T
>>353 ああーできました
callはどこでもドア〜でforの外と繋がってるんですね
:exは:ex2の3行を除く末尾までがブロックてことですか
助かりましたありがとう!
>>355 %size%が2G超えてなければ文字列としても数値としても動くけど…
set size=2147483647
set /a size=%size%/1024/1024
echo %size% MiB
2047 MiB
set size=2147483648
set /a size=%size%/1024/1024
echo %size% MiB
-2048 MiB
一桁ずつ計算すればいいんじゃねえの?
>>333 ああ、そうなんだ。
じゃあ、プチサービスを作って、そのアプリをサービス化しちゃえばログインしていない状態でも取れるかもよ、
と書いてここがム板じゃないことに気付いた。
なんかそういうフリーソフトがあったような気がしなくもないよ>サービス化
MiB MLB
出来たっぽい @echo off set A=214748742140 set B=1024 set ans= set r= :div set r=%r%%A:~0,1% set A=%A:~1% set /a s=r/%B% set /a r=r%%%B% set ans=%ans%%s% if %r%%A% GEQ %B% goto :div echo %ans%%A% echo %r%
wmicのツワモノ、いらっしゃいますか?
>>363 r<1024の時
r/1024=0
r%1024=r
これで大丈夫…か? @echo on set A=1023 set B=1024 set ans=$ set r= :div set r=%r%%A:~0,1% set A=%A:~1% set /a s=r/%B% set /a r=r%%%B% set ans=%ans%%s% set ans=%ans:$0=$% if defined A goto :div if $%ans% == $$ (echo 0) else echo %ans:~1% echo %r%
数値の先頭が0の時8進数と解釈されてバグる。
うおぉ set r=0 :div set /a r=%r%*10+%A:~0,1%
ちょっと質問があります。 Win7でシステム情報(msinfo32)のコンボーネントの"CD-ROM"や"USB"の内容をコマンドラインで outputしてファイルに書き出したいのですが分かりません。(敢えてGUIではなくCUIで) どういうコマンドを実行すればいいのか教授してくれれば幸いです。
msinfo32 /?
>>370 回答ありがとうございます。
しかしそのコマンドを実行するとGUIが出てくるのです・・たしかXPなら確認出来た気がしますが。
>>371 msinfo32 /categories +ComponentsUSB /report c:\usb.txt
と「ファイル名を指定して実行」でやってみて、
特にウインドウは出てこなかったけど、Win7だと出てくるの?
373 :
369 :2010/06/27(日) 03:36:24 ID:N7jjxMwC
>>372 ありがとうございます。
ログ出力はされたのですが特定のカテゴリじゃなく全ての情報が書き出されます。
Win7(Vista)だと特定のカテゴリを出力させるのは無理なんですかね・・。
>ウィンドウの件
msinfo32 /?
のコマンドなら出てきます。
教えていただいたコマンドならシステム情報を取得してログ出力ってなりました。
(ただし上記にも書いてある通り全ての情報が書き出されます)
ちょっと調べた所Vistaからそうだったみたいです。
>>373 あー確かにWin7だとうまく動作しないっぽいね
じゃあPowerShellとか使ってWMIのクラスを叩くくらい?丁度Win7から標準搭載だし
ComponentsMultiMediaCDROMの場合なら
gwmi Win32_CDROMDrive
で済むと思うけど
ComponentsUSBと同じものを拾うとしたら、Win32_PnPEntityから
それっぽい文字列になってるものを選りすぐるとか
そういう泥臭いのしかないんじゃないかなぁ
gwmi Win32_PnPEntity | ? { $_.Description -match "HID|USB|マウス" }
しかしなんでmsinfo32の機能縮小したんだろね
375 :
369 :2010/06/28(月) 17:46:44 ID:F78fsBFc
>>374 確かに機能縮小は謎ですね・・。
PowerShellはあまり使った事ありませんが
コマンドまで書いていただいたので地道に勉強してみます。
ありがとうございました。
メビバイト
WSHやPowerShellでは何てことないのにコマンドプロンプトからだとかなり手間かかるのに ユーザシェルフォルダーの実パス取得があるな
そんな簡単なことにかなり手間がかかるとは
>378 VBScriptファイル(WSH)側で実パス取得〜Echoメソッドでコンソール出力し、 その結果をバッチファイル(コマンドプロンプト)側で環境変数に入れるのが、 やはり無難だろうね。Windows9x系では使えない方法だが。
ファイル更新日時の秒まで表示する方法ってないですか? dirも昔に比べればだいぶ機能追加されたのに、これくらいの拡張機能は付けてくれてもいいのに。。。
はい
dirに求めるんじゃなくてファイルシステムに求めるもんだからなぁ
ファイルシステムは秒の情報持ってるだろ
FATだと2秒単位だけどな
FAT16の場合だろ?
FAT32は2秒
FAT12/16/32は秒の情報を5ビットで持ってるから2秒単位だったな。 exFATは10ミリ秒単位で秒を記録できるようになったらしいが。
ファイル更新日時の2秒まで表示する方法ってないですか? dirも昔に比べればだいぶ機能追加されたのに、これくらいの拡張機能は付けてくれてもいいのに。。。
「秒とかバイトとか、細けえことはどうでもいいんだよ」というのが MSの設計思想じゃないのか? エクスプローラでのファイルサイズは、キロバイト単位でしか出ないし。 何?プロパティ?ファイルが1000個あったらどーすんだ? あれが「人に優しいUI」だと思ってるのかね。 んでもって馬鹿企業は、フリーソフト導入一切禁止とくるからなw
PowerShell なら 0.1 マイクロ秒まで表示できるな
でも精度的にはミリ秒までかな
そうかPowerShellがあったなぁ。 ・・・出たての頃インスコしただけで難しそうで即挫折したけどがんばって勉強しようかなぁ。。。
あと思い出したけど、NTFSのマルチストリームの情報を扱う手段も ぜんぜん提供されないね。エクスプローラとかGUIでもそうだけど。 いちおうdirでは見れるようになったけど何か中途半端な扱いだし。 そもそもdirでもエクスプローラでも何でもそうだけど、 ファイルのサイズとして表示する数字の中に代替ストリームの サイズが含まれてないってすごく変だけど、それすら改善する気は ないのかなぁ。。。
パフォーマンスのとてつもない劣化と引換の改善なんか誰がやるか
dirで/rの有無で比べるくらいだとそんなに劣化してないっぽいけどねぇ。
398 :
名無し~3.EXE :2010/07/08(木) 01:53:36 ID:VY4uFioD
cygwin入れといて ls -l --time-style=full-iso
powershellでdirとやっても秒が出ないが、どうやるの?
パソコンド素人なんですけど、コマンドライン等の勉強したいんですが、いい教科書等ありますか?
ド素人はなにがやりたくてコマンドラインを使おうと思ったの?
標準MS-DOSハンドブック
>>401 パソコンがド素人ってだけでワークステーションには習熟してるかもしれないじゃないか。
>>395 ,397
お前リパースポイントと代替データストリーム混同してないか
>>399 ls | select {$_.Name},{$_.LastWriteTime.ToString("o")}
>>401-402 -403
何がしたいと言う訳では無いのですが、
時間に余裕も出て来たので、何か勉強しようかなと思いまして。
どうせなら全く分からないものでもしてみようかと。
確かにVista/7だとmountvolコマンドがアクセス権絡みの問題で使い物にならないわ
>>407 教科書やドリルみたいなの買うと課題の不毛さに後悔するから
技術評論社のポケットリファレンスシリーズみたいな
手元に置いてパッと引けるようなのが一冊あると便利
でも先にコマンドを使う目的を見つけた方がいいと思うよ
目的がないと使い道がないから学んでも頭に入らないと思う
「毎日毎日手作業でファイルコピーしてるけど面倒くさくて嫌になった」
↓
「なんか金のかからない方法で自動化したい」
↓
「コピーコマンドを連ねてバッチファイルを作ればできるらしい」
↓
「じゃあまずコピーコマンドってのが何なのか知ろう」
みたいにさ
それだと逆引き系のリファレンスgだな
先日環境をXPから7に移したんですが、XPには無くて7にはあるコマンド類または その逆を解説したようなサイトがあれば教えてください。 別に全コマンドの解説でもかまいません。
ちなみにWindows7にはXPにあったntcmds.chmのようなのは無いんでしょうか?
>>409 知りたい機能だけ調べるってやり方だと、
知ってると便利な機能や小技を見落としたままってことがあるんだよな。
たしかに同意。 今日びのWindowsのコマンドプロンプトの存在意義って、どっちかっつーと なんかニッチな理由とか事情があって使うニッチな手段って感じのものだから、 具体的な利用目的もなしにゼロから勉強がしたいからって学ぶんであれば、 VBSとかの高機能で汎用的なスクリプト言語やJavaとかC++とかの開発言語を 勉強したほうが使い道広くて楽しいと思う。 あと、コマンドの世界って、シロート目にはけっこう複雑そうに見えるかもしれないけど それほど奥行きある世界じゃないから、そういう他の言語を触ったことある人なら すぐに使えるようになるし。
NTナツカシスw
俺もそういうのいっぱい買ったわー
>>411 [スタート]→[ヘルプとサポート]あたりで「リファレンス」で検索すると
コマンドラインのリファレンスを呼び出せない?
XPには標準でそういうのがあるよ
無料だし構文や使用例も載っててヒョイと引くのに便利
コマンドプロンプトで 「@」 てのは どういう意味、用法で使いますか。
>>421 ファイル名として使用できる文字です。
またバッチファイルでコマンドの前に記入すると一時的にコマンドエコーをOFFにできます。
この機能が実装される前はバッチファイルを実行すると echo off だけは必ず表示されてしまいました。
また一部のプログラムではレスポンスファイルを指定するために利用されていましたが
これは各プログラムの独自仕様にすぎません。
423 :
421 です :2010/07/28(水) 20:05:36 ID:e7q9P674
>>422 早速のご回答ありがとうございます。
ちょっと時間を掛けて理解してみます。
@@@@@@@@@@@
コマンドラインでループを見たくない時 for /f %i in ('dir /b') do @(echo %i | find "hoge") よくこんな風にブロックの前に付けて使う
コマンドプロンプトでPATH文字列から最後のフォルダ名のみ取得する方法ないですか? 例 c:\hoge\piyo\fuga → fuga って感じです。 よろしくお願い致します。
>>427 ありがとうございます。
>>281 難しいですねぇ・・・・。
理解するまで20分ぐらいかかった気がします・・・。
hoge\piyo\fuga\
で&で繋いで連続置き換えした場合
hoge\ → hoge に
piyo\ → piyo に
fuga\ → fuga に
それぞれ置き換えられて、それが上書きされ続けるから
fuga が最終的な結果として残るんですね・・・。
Linuxなら
$ basename $PWD
だけでいけるんすけどね・・・。Batは大変ですねぇ・・・。
>>428 GnuWin32 の basename.exe を使うか PowerShell で
(New-Object System.IO.DirectoryInfo c:\hoge\piyo\fuga).Name
とするかだな
>>429 いや、わざわざそんな書き方せんでもgi(Get-Item) 使えばいいだろw
>>428 > hoge\piyo\fuga\
> で&で繋いで連続置き換えした場合
>
> hoge\ → hoge に
> piyo\ → piyo に
> fuga\ → fuga に
> それぞれ置き換えられて、それが上書きされ続けるから
> fuga が最終的な結果として残るんですね・・・。
そうじゃなくて
>>281 。
最後に\が付いてるとNGだけどな。
>>431 そこまで求められてるのかわからんが、それでも Split-Path -Leaf 程度でいいと思う
おすすめのコマンド教えろ
cls オヌヌメ
専ブラにタスクトレイに収納はあるが、タスクバーに最小化がないから Alt+Space Nで強引にやるという方法を思いついたんだがどうやって再現すればいいのかな? 最小化で起動とかじゃなくて現在開いてる専ブラ『を』最小化させたい
test1.txt test2.txt test3.txt ・ ・ ・ を for %%I in (*.txt) do rename %%I n%%I ってやると、 他は ntest*.txt になるのに、最初のtest1.txtだけが 二度処理されて、nntest1.txtになるんだけど、何故に? ちなみに for %%I in (*.*) do rename %%I n%%I だとこれは起きない。
for %%I in (*.txt) do rename %%I n%%I & sleep -n 10
>>440 おや、汲み取り式便所のカマドウマさん、お久しぶりです。
すみません、
atest.txt
btest.txt
ctest.txt
で、もっかい試して下さい。
おや、カメムシさん。こんばんは。 7の64でお試し下さい。 バグ見つけるのって、そんなに 珍しいのか?
誰と戦ってるの?
NTFSの仕様だろ
これでなった for /l %I in (0,1,9) do echo a>>test%Itxt for /l %J in (0,1,9) do for %I in (*.*) do ren %I %J%I
コマンドプロンプトからファイルサーバの認証通すコマンドはないでしょうか? すみません、上手く言葉で伝えられないので、現状とやりたいことを書きます。 自端末からは自分のドメインアカウントでアクセスします。 ※(自端末)-->(ファイルサーバ) サーバ作業ではサーバのAdministratorでリモート接続しています。 ※(自端末)-->(サーバ) サーバ作業でファイルサーバにアクセスする必要が生じたため、 サーバからファイルサーバへは自分のドメインアカウントでアクセスします。 ※(自端末)-->(サーバ)-->(ファイルサーバ) このとき、エクスプローラでファイルサーバを開く場合は、 ダイアログでユーザ名とパスワードを聞かれるので問題ありません。 また、そのとき認証した後であれば、 > dir "\\fileserver\folder" で普通にアクセスできるのですが、 エクスプローラで一旦開いてダイアログで認証した後でないと、 「ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。」 でエラーとなってしまいます。 コマンド実行時にダイアログ表示でもコマンド上でIDとパスワードを入力でもよいので、 コマンドからファイルサーバへ認証されたいです。 以上、よろしくお願いいたします。
net use
テキストファイル内を検索し、特定の文字列を含む行をすべて抽出して別のログファイルに 書き出すというバッチ処理をしたいのですが、書き出す段階で詰まってしまいました。 「文字列を含む行が一切見つからなければ、何もしない」 「文字列を含む行が一つ以上見つかり、かつ書き出し先のログファイルが存在しなければ新規に作成」 「文字列を含む行が一つ以上見つかり、かつ書き出し先のログファイルが既に存在していれば追記」 という風に処理したいのですが、条件分岐をどのように記述すればいいかわかりません。 知恵を貸してください、お願いします。
grepの結果をファイルに書き出してサイズが0なら削除でいいんじゃね?
>> で追記書き出しすればファイルがなくても勝手に新規作成してくれる ファイルがあればもちろん追記 条件分岐いらんでしょ
>>451-452 文字列を含む行が一切見つからず、かつ書き出し先のログファイルが存在しなければ
空のログファイルを作成をせずに、そのまま処理を終了したいです。
やはり一度ログファイルを作成して、ファイルサイズを判定して空なら削除という
処理をするしかないですか?
>> で追記処理を始める前に、findstrで文字列が見つかったかどうかで条件分岐できるのが理想です。
じゃあそうしろ
仕様上、標準出力をファイルにリダイレクトするなら、結果が空でもファイルは作られる。 だからファイルサイズで分岐してサイズが0なら削除すりゃいいと書いた。結果的に同じになるから。 対象ディレクトリに一瞬でもファイルが作られるのが嫌なら、 %tmp%にでも吐きだしてからサイズ判断してコピーすりゃいい。 それすら嫌なら何らかのスクリプト言語でも使っとけ。
forつかえばいいよ for /f %%i in ('コマンド') do echo %%i>>hoge.txt なければつくられないよ
俺も一旦tempfileに書き出した後にhitした場合だけlogファイルにリダイレクト(>>)するなり 連結するなりした方が良いと思うがどうしてもというのなら、 OSによってerrorkevelの数値が異なってくるかも知れないが、win2k以降のfindstrだと hitしたか、hitしなかったかは、errorlevel(又は%errorlevel%環境変数も使える)に通知される。 詳しくは、if /?で。 rem *** 一発目のfindstrは判定だけして結果は捨てる。hitしたら改めてfindstrをやり直す *** findstr >nul if errorlevel 1 ( echo no_hit ) else ( echo hit )
>>455-457 ありがとうございます、一時ファイル出力して結合という方法があることをすっかり見落としてました。
検索した対象のファイル名+ヒットした各行という形式のログファイルにしたかったので
直接出力してファイルサイズ判定は都合が悪かったのですが、この方法なら目的を果たせます。
重ねてありがとうございます。
うーん、何かのプロセスが掴んでて削除できないファイルがある。 openfiles /Local on して再起動して確認しても誰も掴んでない。 openfiles /Query /V ってひょっとしてサービスプロセスが握ってるのは表示されない? 具体的にいうと、 TracサーバのApacheプロセスがlogファイル握ってるのに、 openfilesで確認できない。 サービスプロセスのも表示できて且つ強制的にdisconnectさせれるようなコマンドない?
filemon で調べられないんでしたっけ。 そういう場合、リブートする方が早いことが多いし、面倒がない。 apache 数分止まるけど。
XP以降ではatコマンドでなくschtasksを使うべきと書いているページがあるのですが、 atでも問題ないのでしょうか?調べて、結局、GUIのタスクを利用したのですが、 テキストファイルを関連付けてあるemeditorでなく、システムのメモ帳で開いてしまいます。 コマンドラインでスケジュールすれば特定のエディターを指定できるのでしょうか?
好きな方選べばよろし エディタのexeの引数にファイル名を指定すればいいだけ
XPはまだ使えるがVista以降はまあ使えんよ
ATコマンドで登録したジョブはSYSTEM権限で実行されるので
ユーザプロファイルに情報を登録するようなジョブや
ネットワーク上の共有フォルダに接続するようなジョブなどの場合
かなり面倒くさい細工をしなくちゃならない(一応できなくはない)
SCHTASKSはジョブの実行者を設定できるので
ローカルの単なるユーザでもドメイン管理者アカウントでも
好きなユーザの権限で実行できる利点があるが
User権限でログインしてる時にSCHTASKSコマンドを実行すると
PowerUserやAdministratorなど上位の権限ではジョブを実行できない
(ジョブを仕掛けても失敗する)
XPの出た当初SCHTASKSは管理者アカウントにログオンし直さなくても
管理者権限でコマンドやファイルを実行できる方法として挙げられていたが
リソキの隅っこに「実はできないんだな(テヘ」と書いてあってムキーッとなった
雑談はさておき
>>461 462氏の言わんとしているのは
emeditor.exe (ファイル名)
または
(フルパス)\emeditor.exe (ファイル名)
という指定をする事で目的のファイルをemeditorで開けると言ってくれている
ATコマンドで実行する場合は /interactive オプションつけれ
そうしないと実行しても自分にゃ見えない
schtasksでできなくてatを使うしかないってことは何かあったかな?
Vistaでat/interactiveは使えなくなった
どんどん使えない仕様になるな
468 :
461 :2010/11/16(火) 17:20:16 ID:O1xaQ4cs
CSVファイル中の各フィールドを抽出して一端変数に格納し、それを引数として 実行ファイルに渡すという処理をバッチでやろうとしています。 サンプルとして以下のようなfor文を書きました。 -------------------------------------------------- for /F "USEBACKQ tokens=1-6 delims==," %%A in ("C:\test\hoge.csv") do ( echo "%%A" "%%B" "%%C" "%%D" "%%E" "%%F" hogehoge.exe "%%B" "%%A" "%%D" "%%F" "%%C%%D" "%%E" ) -------------------------------------------------- CSVファイルの中身が test1,test2,test3,test4,test5,test6 のように連続して並んでいる場合は、問題なく変数%%A〜%%Fに順序良く格納されるのですが test1,test2,,test4,test5,test6 のように間に歯抜けのフィールドがあると、それより後ろのフィールドが繰り上がって "test1" "test2" "test4" "test5" "test6" "" のように左詰めで格納されてしまいます。これを "test1" "test2" "" "test4" "test5" "test6" といったように、歯抜けのフィールドはそのまま変数の中身もブランクに もしくは次善策として半角スペースを代わりに格納するようにしたいのですが for文以外の方法も含め、何かやり方はありますか?
FOR /L の方が適切なんでない?
ごめん よく読んでなかった CSXの中身か
WSH の方が適切なんでない?
テキスト整形が得意 or CSVの読み書きのインターフェイスのあるスクリプト使う方が楽だよ。
最初から空白を付加したcsvを作るようには出来ないのかな? 出来ないのなら後から整形すればいい もちろん一旦作業ファイルを作らずとも二重forループで一気に書く方が良いかも知れんが。 setlocal EnableDelayedExpansion @echo off echo.>%temp%\tmp.csv for /f "usebackq tokens=1* delims=" %%i in ("c:\hoge.csv") do ( set line=%%i set line=!line:,,=, ,! echo !line! >> %temp%\tmp.csv ) endlocal for /f "usebackq tokens=1-6 delims=," %%i in ("%temp%\tmp.csv") do ( echo %%i %%j %%k %%l %%m %%n ) rem del %temp%\tmp.csv
先頭がNULLの場合が抜けていた 最初のループ中でecho出力する直前に1行追加 if "!line:~0,1!" equ "," set line= !line!
ああーダメだ。全部やり直し。 下から3行目は環境変数oに半角スペースを代入してくれ(投稿するときに削られてるだろうから) @echo off setlocal EnableDelayedExpansion echo.>%temp%\tmp.csv for /f "usebackq tokens=1* delims=" %%i in ("c:\hoge.csv") do ( set line=%%i set line=!line:,= ,! for /f "usebackq tokens=1-6 delims=," %%j in (`echo !line!`) do ( set j=%%j set k=%%k set l=%%l set m=%%m set n=%%n set o=%%o if "!j!" neq " " set j=!j:~0,-1! if "!k!" neq " " set k=!k:~0,-1! if "!l!" neq " " set l=!l:~0,-1! if "!m!" neq " " set m=!m:~0,-1! if "!n!" neq " " set n=!n:~0,-1! if "!o!" equ "" set o= echo '!j!' '!k!' '!l!' '!m!' '!n!' '!o!' ) )
こりゃだめだ
"test1","test2","","test4","test5","test6" みたいなCSVにしときゃ済む話では?
無理やり前述のフォーマットにしてから読むパターン @echo off setlocal enableextensions enabledelayedexpansion for /f "usebackq delims=" %%i in ("C:\test\hoge.csv") do ( set t=%%i set t="!t:,=","!" for /f "usebackq tokens=1-6 delims=," %%a in (`echo !t!`) do echo %%~a,%%~b,%%~c,%%~d,%%~e,%%~f )
a,"b,c",d とかでもうまくいくか?
せめて試してから聞けよ
>>469 です。
ID:TgFKsTt0さん、その発想はなかったです。
>>479 の方法ですと歯抜けフィールドは
nullとして変数に格納されるので特にいい感じです。
ID:9z2PCu2Jさんもありがとうございます。
ですがいずれの場合でも、遅延環境変数のためCSVのフィールド内に半角の!が
含まれていると詰みますね。含まれる可能性があるかないかは現時点で何とも言えないのですが。
しかしデリミターで抽出された対象がnullだと、後ろの対象を繰り上げて変数に格納する
というこのバッチの挙動が今一つ腑に落ちないのですが、どういった理由からこのような
仕様になったのでしょうか?
ちなみここのところの長期規制につき、代理レスを依頼してるためIDが一定しないと思います。
>>482 そもそもデフォルトのデリミタである空白で一つ一つ区切られるような仕様だったら
えらく使用に困る代物だろ?
連続した区切り文字は一つの区切りとして考えるのは当然の流れ。
遅延展開が使えないならこんなのでもいいんじゃないのかね。 @echo off for /f "usebackq delims=" %%i in ("csv.txt") do ( call :sub %%i ) goto :eof :sub set t=%* set t="%t:,=","%" for /f "usebackq tokens=1-6 delims=," %%a in (`call echo %%t%%`) do echo %%~a,%%~b,%%~c,%%~d,%%~e,%%~f goto :eof
485 :
482 :2010/11/24(水) 23:51:10 ID:iNcoiXRQ
>>483-484 ktkr!!!
ありがとうございます、おかげさまで望みどおりの動作になりました。
そういえばこの遅延環境変数回避のテクニック、自分も以前使ったことがあるのに忘れてました;
連続した半角スペースが全部デリミタとして機能したら問題だというのは分かりますが
繰り上げると今回のCSVのように、何番目の要素かということが重要な意味を持つ場合に
問題になる気がします。つまるところバッチが使われるシーンではそういう例は稀なのでしょうか。
私は文字列操作の経験があまりないので、今後お話しいただいた内容を頭の片隅に
入れときながら注意していこうと思います、ありがとうございました。
(`call echo %%t%%`) callは不要
テキストファイルの中身を探索して、正規表現に「合致した範囲だけ」を抽出する方法ってありますか? findstr /r 文字列 パス で正規表現探索は出来るのですが、出力されるのが行単位なので、さらに各行内の 正規表現にマッチした部分まで絞り込んで抽出したいのです。
つwsh
どうでもいいが、教えて、は最早サーチスパムだよな
echo パスを追加 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path /t reg_sz /d "%path%;c:\bin\uty"
setx path "%path%;c:\bin\uty" /m
windows7 64bitではntcmds.chmはどこに行ったんでしょうか
無くなった。 しょうがないから自分で作った
質問です type 初期化.txt |format G: /FS:FAT32 /V:DATA (echo DATA&echo y)|format G: /FS:FAT32 /V:DATA 上は正常に終了するのに下は ファイル システムの種類は FAT32 です。 ドライブ G: の現在のボリューム ラベルを入力してください ドライブに無効なボリュー ム ラベルを入力しました。 となってうまくいきません。理由を教えてほしいです。 ただし、初期化.txtの中身は DATA y の2行(改行付き)です。お願いします。
cmd /c "echo DATA&echo y"|format G: /FS:FAT32 /V:DATA
498 :
496 :2010/12/23(木) 20:37:42 ID:9ROm8nmO
>>497 うまくいきました。cmd /c、勉強してみます。ありがとうございました。
聞いてみてよかったです。では。
初心者スレに書いたのですが、なにもレスが無かったので こちらで質問させてください。 以下のようなschtasksでタスクを作り、その日の01:13だけにR:\test.batを実行させるタスクを作りました。 SCHTASKS /Create /SC ONCE /TN TESTJOB /TR R:\test.bat /ST 01:13 R:\test.batがその日の01:13に実行されたのですが、 タスクはスケジューラーでみると次回実行時刻が空白のまま残っています。 タスクの実行後自動的にこのタスクを削除する指定はどうやるのでしょうか? タスクスケジューラーの設定をみると 「タスクの再実行がスケジュールされてない場合に削除されるまでの時間」という設定があって この設定をどうやって、CLIで指定するかです。 OSはWindows7 Ultimate 64bit
>>496-497 勉強するったって、勉強しても無理だと思うぞ
ヒント1
(echo DATA&echo y)|more>a.txt
a.txtをメモ帳で開いて、空白の有無をチェックしてみ
ヒント2
(echo DATA&echo y&echo %%cmdcmdline%%)|more>a.txt
なぜそうなるかこれで分る
>>501 C:\>SCHTASKS /Create /SC ONCE /TN TESTJOB /TR R:\test.bat /ST 23:13 /Z
エラー: タスク XML に必須の要素または属性が含まれていません。
(40,4):EndBoundary:
C:\>
/Kとかもやってみたしうまくいかない。
>>496 こういう方法もあるぞ
echo Y|format g: /fs:fat32
label g:DATA
504 :
496 :2010/12/24(金) 00:26:20 ID:Gp00iisX
>>500 追加情報ありがとうございます。
cmd /cを使わないとyだけがformatコマンドに送られるからだめなのと解釈したのですが、
まちがいでしたか?
ヒントは実行しましたが、すいません、理解できませんでした。難しいです。
>>503 レスありがとうございます。ですが、1行目でエラーが出てしまいます。
505 :
503 :2010/12/24(金) 00:51:21 ID:tS5P4SyW
>>496 =
>>504 ごめん
1行目は、
echo y|format g: (/q) /fs:fat32 /v:
だった
2行目をなくすには
echo y|format g: (/q) /fs:fat32 /v:DATA
だね
(Win7のcmd.exeとUSBメモリーで確認した)
空白を_で表すと DATA_ y_ になってるだろ?だからエラーになる 2つ目実行したら DATA y C:\Windows\system32\cmd.exe /S /D /c" ( echo DATA & echo y & echo %cmdcmdline% )" つまり、パイプの前は(echo DATA&echo y)が( echo DATA & echo y )に編集されてサブシェルで実行されるってこと
>>506 たびたびありがとうございます。理解しました!敗因はパイプとリダイレクトでは
挙動が違うことに気づかなかったことと、ヒントをコマンドプロンプトから実行した
ことです。結果、こうなってしまって、わけがわからなくなりました。
DATA_
y_
%"cmd.exe" /k "cd D:\TXT"%_
%cmdcmdline%をググるか、ヒントをバッチで実行すれば済んだのですが。
なさけないです。丁寧な説明、ありがとうございます。
>>505 確認までしていただいて恐縮です。情報提供不足でした。実はGドライブには元から
ボリュームラベルがついているのですよ。
その場合、Formatコマンドはラベルの再入力を求めるので、yだけではエラーになるのです。
蛇足ですが、コマンドラインはPerlスクリプト内で使用しています。モジュールを組み込む
より、qx(コマンドライン)のほうが楽ですので。筋が悪いですが(^^;)
アドバイス、ありがとうございます。
%%があったらバッチ
511 :
496 :2010/12/24(金) 22:52:47 ID:Gp00iisX
SCHTASKS /Create /SC ONCE /TN TESTJOB /TR R:\test.bat /ST 01:13 ユーザー名・パスワードとZ V1を付けたらうまくいった。 SCHTASKS /Create /SC ONCE /TN TESTJOB /TR R:\test.bat /ST 01:13 /RU mona /RP password /Z /V1
513 :
名無し~3.EXE :2011/01/08(土) 00:25:22 ID:KRZHH0QO
ドメインユーザのセキュリティタブの項目を追加するコマンドってありますか?
if not match "%~1" *.txt echo %~1 is not text みたいな処理ってどう書けばいいの
if not "%~x1" == ".txt" (echo %~1 is not text)
if /I not "%~x1" == ".txt" echo %~1 is not text
ワイルドカードや正規表現の一致のチェックするコマンドってないんだよな。 一応検査対象の文字列をファイルに保存してfindstrすれば正規表現の方はできそうだけど。
(echo %~1)|findstr ".txt$" && echo %~1 is not text
batファイルで a.01 a.02 a.03 といったバイナリファイルをまとめてドロップすると copy /b "a.01"+"a.02"+"a.03" "a" という処理をさせたい(ファイル名はスペースを含んだりさまざまです)のですがどう書けばいいですか? ドロップするファイル群の名前はみんな同じかとか、連番の拡張子かとかは人間側で判断しようと思っています 単純に入力部分にワイルドカードが使えるのかなと思ったのですが駄目でした あとドロップで渡されたときのファイルの順番は必ずしもファイル名の昇順とは限らないんでしょうか
これはおまえら(含む俺)が大好きなforと遅延展開を活用して作るのにちょうどいい難易度の課題だな。 ファイル名に空白文字入るかどうか、とか、結合する順番は単純に文字列ソート順でいいのかどうか、とか、 出力先のファイル名どう決めるか、とか、最大ファイル数あるいは最長パス長どうするか、とか、 仕様の細かい部分は考えるだけでカウパー出てきたぜ。
>>519 copy /b + %* %~dpn1
最大ファイル数とか、どうするかってどうにもならないでしょ。
ruby -e "`copy /b #{ARGV.sort.join(' + ')} eroero.avi`" %*
for /f "delims=" %%I in ('dir /b /o-n %*') do copy /b + "%%~I" ,, "%%~dpnI"
copy nul "%~dpn1" for /f "delims=" %%I in ('dir /b /o-n %*') do copy /b "%%~dpnI" + "%%~I" "%%~dpnI"
526 :
名無し~3.EXE :2011/01/17(月) 20:32:44 ID:cAtwP0h5
dsquery group -name groupというコマンドを実行して、 コマンド実行で返ってきた値が入っているか、 IFで判定したいんですがどうやったらできますか? いろいろやってみたんですが、全然うまくいかない…
for /f "delims=" %%I in ('dsquery group -name group') do echo %%I
528 :
名無し~3.EXE :2011/01/17(月) 21:26:49 ID:cAtwP0h5
>527 いけました!ありがとうございます。 もう一点質問なんですが、inの中って変数展開できるんでしょうか? for /f "delims=" %%I in (dsquery group -name %%temp) do echo %%I みたいに記載すると、うまく展開されません。
%temp%
LAN内のPCやプリンタ、ネットワーク機器のIPアドレスを 調べて一覧にするコマンドプロンプトのコマンドはありませんか? 固定IPかDHCPから割り振られたIPか、わかると更に嬉しいです。
こういう人がいるからいつまでたってもNetBIOSがなくならない
あるテキストファイル(hoge.txt)に、数行の文字列があり、その最後の行に「空白行(改行のみの行)」が含まれています。 この最後の空白行だけを、コマンドで削除したいんですが、どのようなコマンドになるでしょうか? よろしければご教授願います・・・。
for /f "usebackq delims=:" %%i in (`findstr /r /n "." "hoge.txt"`) do @set n=%%i (for /f "usebackq tokens=1,* delims=:" %%i in (`findstr /r /n ".*" "hoge.txt"`) do @( if /i %n% GEQ %%i echo,%%j))>hogehoge.txt
>>532 sort /+100000 hoge.txt|more +1|sort /+100000 /o hoge.txt
すみません、お伺いしたいのですが、 とあるスクリプトを毎ログオン時に実行させたいのですが、 普段使ってるのは管理者権限のないアカウントで、 そのスクリプトはその管理者権限のないアカウントで ログオンしたときにも、管理者権限で走らせたいんです。 また、そのPCを使用している人間に管理者パスワードを知られないようにしたいんです。 schtasks の onlogon で /ru を使うと、/ru で指定したユーザがログオンしたときにしか スクリプトが走らないと思うんです。 (今、実験できる環境がありません。すいません。) どのようにすればよろしいでしょうか? まことに申し訳ありませんがご教授お願いします。
無理です。 ログオン時じゃなくて起動時だったらスタートアップスクリプトで出来そうだけど。
タスクスケジューラでできね?
>>535 schtasksはログオンしてるユーザと同等かそれ以下の権限のアカウントでしか実行できない糞仕様
>>535 ついでに
レジストリのHKMLのスタートアップ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
ここに新しい項目作ってスクリプトを実行するよう登録してみ
HKMLなのにログオンしないと走らない糞仕様だから
>>535 の目的には使えるかもよ
ただAdministrator権限じゃなくてSYSTEM権限で実行されるんでそこんとこ留意
にーさん、にーさん、 HKLM -> HKLM 慌てすぎ。
慌て者はボクだったよ、 さよなら……
545 :
535 :2011/03/07(月) 00:55:58.18 ID:QCcxjvdA
皆様、にありがとうございます。
>>539 さんに教えていただいた方法を試してみたいと思います。
546 :
535 :2011/03/07(月) 01:01:48.26 ID:QCcxjvdA
途中で書き込むボタン押してしまいました・・・・crz 改めて、皆様本当に、いろいろ考えていただき、 ありがとうございました。 それでは、失礼いたします。
547 :
名無し~3.EXE :2011/04/24(日) 00:53:46.83 ID:ghmTn2ef
拡張子を.batにしたいのですが a.txtを作って a.batに名前を変更 a.bat.txtとなって拡張子はそのまま となってしまいます めちゃくちゃ初歩的な質問ですみません 誰か教えてください
>>547 「登録されている拡張子は表示しない」
でググれ
ren a.bat.txt a.bat
550 :
名無し~3.EXE :2011/04/24(日) 01:07:33.93 ID:ghmTn2ef
バッチファイル中の文字置換について質問です。 与えられた引数を元にした名前のフォルダを作成するバッチファイルを 作成したのですが、フォルダの名前に使用できない文字(\/:*?"<>|)が 含まれる場合があるので、その部分は適時全角の近似文字に 置換してからフォルダを作成しています。 以下の方法で \/:?"<>| については対処できたのですが、残りの * (半角アスタリスク)だけはどうしても*(全角アスタリスク)に 置換できません。他と同じように記述すると、構文エラーになってしまいます。 * を * に置換する方法はありませんか?よろしくお願いします。 C:\>sample.bat "dir\/:?<>|"test" ================================================== @echo off setlocal set dir_name=%1 set dir_name=%dir_name:\=¥% set dir_name=%dir_name:/=/% set dir_name=%dir_name::=:% set dir_name=%dir_name:?=?% set dir_name=%dir_name:<=<% set dir_name=%dir_name:>=>% set dir_name=%dir_name:|=|% set dir_name=%dir_name:"=”% set dir_name=%dir_name:~1,-1% mkdir "C:\%dir_name%" ================================================== C:\>dir 2011/05/10 22:45 <DIR> dir¥/:?<>|”test
あまりにも表示される情報が多いので、最初の方の情報が消えてしまいます。 最初の10行程度でいいので見る方法はないでしょうか?
>>551 set "dir_name=%dir_name:*=*%"
でもだめ?ためしてないけど
>>552 more
@echo off set dir_name=a**b*c***e set index=0 set out= :loop call set t=%%dir_name:~%index%,1%% if "%t%"=="" goto :end if "%t%"=="*" ( set out=%out%* ) else ( set out=%out%%t% ) set /a index+=1 goto :loop :end echo %out%
555
556 :
551 :2011/05/11(水) 23:32:32.40 ID:7phbG/we
>>553 ダメみたいです
>>554 多分set系の質問で毎度お世話になっている方だと思いますが、ありがとうございます。
いつも高度な組み方で舌を巻いているのですが、今回のcall部分の動作がわかりません。
callが対象にとれるのは他のバッチファイルか、もしくは同じファイル内のサブルーチン(ラベル)
だと思っていたのですが、今回はそのいずれでも無いように見えます。
一体どういった原理でしょうか?
>>552 moreでもいいけど、プロパティで画面バッファを1000〜2000行にしとけば逆スクロールで見られる
559 :
551 :2011/05/12(木) 18:36:53.53 ID:IzWOSOP9
>>557 callにこんな使い方があったなんて、目から鱗です。
こんな使い方ができるなら、if文の中で()を
含むsetコマンドを使うと構文エラーになる
恐れがあるのでいちいち外部サブルーチンに
callで飛ばしてからsetしてましたが、これでだいぶ
スマートに記述できます。ありがとうございます!
と思ったら、&(半角アンド)も引数で渡される
可能性があることを失念してました orz
&は""つきなら変数に格納できるんですが
前述の通り、フォルダ名に使用するのでこの方法も使えません。
再度質問で申し訳ないのですが、何かうまい方法はありませんか?
無限に広がるbat以外の選択肢
badな選択肢やね
PowerShell に9割方移行した俺に死角はなかった
×死角 ○資格 このスレ的にはw
俺は人間が丸いから四角はないなw
ウニみたなトゲトゲで遠くから見たら丸く見えるだけじゃないの
567 :
551 :2011/05/14(土) 08:11:56.82 ID:vQ4YR2pY
やっぱりバッチでやるのは無理ですかね。まさかこんなことのせいでで手詰まりになるとは・・ 今から新しく別のスクリプトやるならPowerShellもPerlもJavaScriptでも手間は変わらないけど、どれがいいんだろう。
バッチでは無理だと思う。 そもそもバッチファイルに&以降のパラメタは受け渡されてこないので。 (コマンドシェルの構文解析で&以前のコマンドと&以降のコマンドの2つに分離されてしまう ということは、&以前のコマンドであるバッチスクリプトからはどうあがいても &以降のコマンドを知るすべは無いと思われる) 入力方法を変えればいけるけど。(set /pかファイルから入力するとかすれば回避できる) JavaScriptがWebページにも応用できて良いんじゃないか? ただしWSH(cmd.exeから呼び出す)で使うんなら上記と同じことになるんで別のシェルを用意しないと。 まあ、俺は良くは知らないがどのシェル(Perlでも)でも入力に制限がつくんじゃないかな?
>&は""つきなら変数に格納できるんですが >前述の通り、フォルダ名に使用するのでこの方法も使えません。 って話が良く分からないけど、""付けて引数を渡して、フォルダ名は""外して作ればいいんじゃなくて?
あれ? ""で囲って入力するんなら何がダメなんだろう?
もしかして
>>551 と
>>554 を組み合わせられないの?
それとも&は小文字にしたいの?
@echo off
set dir_name="%~1"
set dir_name=%dir_name:&=&%
call :2nd_step %dir_name%
set out="%out:&=&%"
echo %out%
mkdir c:\%out%
goto :eof
:2nd_step
set dir_name=%~1
set index=0
set out=
:loop
call set t=%%dir_name:~%index%,1%%
if "%t%"=="" goto :end
if "%t%"=="*" (
set out=%out%*
) else (
set out=%out%%t%
)
set /a index+=1
goto :loop
:end
&は!の遅延展開つかわんとだめじゃないの?
直前に実行したコマンドの結果ってどっかの変数に入ってないですか? ipconfig /all | find "Default Gateway" | find "192.168.11.1" が成功してたら処理続行、成功してなかったら(何も返ってこなかったら)exit みたいなバッチを書きたいんですが。
&& ||
echo %errorlevel%
575 :
572 :2011/05/15(日) 22:56:59.06 ID:FQFzH4nC
あ、自己解決て書こうとしたら解答いただけてましたw errorlevelで見れました。 ありがとうございました。
576 :
551 :2011/05/17(火) 21:46:05.73 ID:cdAPGdzL
>>551 =559です。時間をあけてしまってスイマセン。
パスを""で括るとき、必ずしも一番前と後ろで括る必要が無いことを初めて知りました。
C:\>mkdir foo" "bar
C:\>dir
2011/05/17 21:25 <DIR> foo bar
これを使えばできるだろうと思いましたが、どうにもうまくいきません orz
フォルダ名に使えない(\/:*?"<>|)以外は、極力引数で渡された文字を
そのまま引き継ぎたいです。
なので半角&も、全角&に変換せずにそのままフォルダ名に使おうと考えています。
様々な文字が渡される可能性があるので、他にも半角スペースや()なんかも注意が必要だと思います。
目的を再度まとめると以下のような感じでしょうか。
[目的]
・sample.bat "文字列" の形で引数が渡されるので、その文字列を使ったフォルダを自動作成するバッチファイル
・フォルダ名に使えない(\/:*?"<>|)については、それぞれ近似の全角記号に置き換える
・上記のダメ文字以外は、極力元の文字や記号をフォルダ名に反映させる(半角&記号など)
一応自力で試行錯誤してみて、以下のようなバッチファイル作ってみたのですが
望み通りの動作になりません。特に"と、&や半角スペースが同時に使われている
場合などの処理が難しいです。バッチでうまいことやる方法は無いでしょうか?
※注意※ 正しく動作しません、あくまで参考です C:\>C:\sample.bat "h ge|<a>bc" ================================================== @echo off call set char_nam="%~1" echo 入力:%char_nam% set char_nam=%char_nam:\=¥% set char_nam=%char_nam:/=/% set char_nam=%char_nam::=:% set char_nam=%char_nam:?=?% set char_nam=%char_nam:<=<% set char_nam=%char_nam:>=>% set char_nam=%char_nam:|=|% set char_nam="%char_nam:"=”%" set char_nam="%char_nam:~2,-2%" set index=0 set out=
:loop call set t="%%char_nam:~%index%,1%%" call set t=%%t:"=""%% call set t=%%t:~1,-1%% if %t%=="""" ( set out=%out% ) if %t%=="" ( goto :end ) else if %t%=="*" ( set out=%out%* ) else if %t%=="&" ( set out=%out%"&" ) else if %t%==" " ( set out=%out%" " ) else ( set out=%out%%t:~1,-1% ) echo out:%out% set /a index+=1 goto :loop :end set out=%out:~2,-2% set dir_nam=C:\%out% echo ディレクトリ名:%dir_nam% mkdir %dir_nam% ==================================================
579 :
551 :2011/05/17(火) 21:56:11.22 ID:cdAPGdzL
C:\>dir 2011/05/17 21:50 <DIR> h ge|<a>bc C:\>C:\sample.bat "h ge&<a>bc" ( の使い方が誤っています。 思ったより長くなってしまいました。 お目汚しすいません。
>>579 >>570 ではどこがダメだったの?
@echo off
set dir_name="%~1"
if %dir_name%=="" echo パラメタを指定してください&goto :eof
set dir_name=%dir_name:\=¥%
set dir_name=%dir_name:/=/%
set dir_name=%dir_name::=:%
set dir_name=%dir_name:?=?%
set dir_name=%dir_name:<=<%
set dir_name=%dir_name:>=>%
set dir_name=%dir_name:|=|%
set dir_name=%dir_name:&=&のバ カ%
call :2nd_step %dir_name%
set out=%out:"=”%
set out="%out:&のバ カ=&%"
echo %out%
mkdir c:\%out%
goto :eof
:2nd_step
set dir_name=%~1
set index=0
set out=
:loop
call set t=%%dir_name:~%index%,1%%
if "%t%"=="" exit /b
if "%t%"=="*" (set out=%out%*) else (set out=%out%%t%)
set /a index+=1
goto :loop
そうか"が途中に入ってるとダメなのか。 さらにいろいろな場合にまずいな。 順番をちょっと変えて最初の方にもっていけば入力できた場合は多分大丈夫だろう case1: 入力できない場合は対処不可 "h ge&"<a" NG case 2: パラメタ無しの判定もまずかった。 "a"b" NG case 3: あと、^<(^>)の入力時もまずい。 "a^<b" NG 次にcase1はどうしようもないが、case 2,3の修正版をあげておく
@echo off set dir_name=%1 if not defined dir_name echo パラメタを指定してください&goto :eof set dir_name=%dir_name:&=&のバ カ% set dir_name="%dir_name:"=”%" set dir_name="%dir_name:~1,-1%" set dir_name=%dir_name:\=¥% set dir_name=%dir_name:/=/% set dir_name=%dir_name::=:% set dir_name=%dir_name:?=?% set dir_name=%dir_name:<=<% set dir_name=%dir_name:>=>% set dir_name=%dir_name:|=|% set dir_name=%dir_name:^=^のバ カ% call :2nd_step %dir_name% set out="%out:&のバ カ=&%" set out=%out:^のバ カ=^% echo %out% mkdir c:\%out% goto :eof :2nd_step set dir_name=%~1 set index=0 set out= :loop call set t=%%dir_name:~%index%,1%% if "%t%"=="" exit /b if "%t%"=="*" (set out=%out%*) else (set out=%out%%t%) set /a index+=1 goto :loop
set dir_name="%dir_name:~1,-1%" これ無意味だった。 さらに全角の”が両端に付くがまずけりゃcall 2nd_stepから帰ってきたあと &と^を半角に戻す前に判定して取っちゃえ。 ちなみに&と^を一旦別文字列に置き換えてるが、これはおよそ入力しそうにない文字列に しとけば実用上問題ないだろう。
set dir_name=%dir_name:<=<% set dir_name=%dir_name:>=>% set dir_name=%dir_name:|=|% set dir_name=%dir_name:&=&% はset "...=..."でエスケープせんとあかんのじゃなかろか set "dir_name=%dir_name:<=<%"
585 :
551 :2011/05/19(木) 00:34:36.79 ID:ph4ezJMK
>>580-583 ありがとうございます。おかげさまで一応の目途が立ちました。
流石にあらゆるケースに、バッチだけで対応するのは難しいですね。
まぁ " 自体の発生頻度は少ない見込みですし、その他 & や | 記号と
同時に発生する確率はほとんどないハズなので、実用上は問題ないと思います。
それでもダメだった場合は、潔くあきらめて半角&は全角&に置換するようにします。ちなみに
set dir_name="%dir_name:~1,-1%"
の部分を、思いつきで
set dir_name="%dir_name:~2,-2%"
に変更したらなぜかうまく両端の全角”が外せました(動作も問題ないように見えます)。
原理は分かりません。
>>584 精査してないですが、試してみたところうちでは正しく動作しなくなりました。
必ず全体を""付きで貰うと条件を固定した場合はそれでもいい。
set dir_name="%dir_name:~1,-1%"
これは無意味なステートメントだが、この時点では、dir_name="”〜”"の状態となってるので。
わざと両端の""を全角で残したのにはパラメタが""付きでない場合や"のみの場合も考慮したから。
例
abc"&< "def
""
"
など。
なので全角の”をとるのなら
>>583 でアドバイスしたタイミング(callの直前でもいい)を薦める。
また無条件に取るんじゃなく全角の”であることをチェックしてから取るように。
さらに最初に""や"の場合、パラメタなしと判定することも必要になってくる。
あと&を全角にしようとも、そもそもバッチスクリプトにきちんと入力されてこない場合は対処は無理。 例 "abc"&def" "abc"<def"
@echo off set /p chars=新規フォルダ名を指定してください : rem set /p chars=<"parm.txt" if not defined chars echo 何か指定してください&goto :eof set chars="%chars:"=”%" if %chars%=="”" echo 何か指定してください&goto :eof if %chars%=="””" echo 何か指定してください&goto :eof if "%chars:~1,1%"=="”" set chars="%chars:~2% if "%chars:~-2,1%"=="”" set chars=%chars:~0,-2%" set chk_spc_only=%chars: =% if %chk_spc_only%=="" echo 何か指定してください&goto :eof set chars=%chars:\=¥% set chars=%chars:/=/% set chars=%chars::=:% set chars=%chars:?=?% set chars=%chars:<=<% set chars=%chars:>=>% set chars=%chars:|=|% set chars=+%chars% set out= :loop set chars="%chars:~2% if %chars%=="" set out="%out:"=%"& goto next if "%chars:~1,1%"=="&" set out=%out%"&"& goto loop if "%chars:~1,1%"=="^" set out=%out%"^"& goto loop if "%chars:~1,1%"=="(" set out=%out%"("& goto loop if "%chars:~1,1%"==")" set out=%out%")"& goto loop if "%chars:~1,1%"=="*" (set out=%out%*) else (set out=%out%%chars:~1,1%) goto :loop :next echo %out% mkdir c:\%out%
↑ パラメタの受け渡し方を変えると、かなり入力できるようになった。 ""で括ってなくても、多分どのような文字列も大丈夫。 例 a&b^|c)>d" <e など
WSH使えば簡単だろ?
PSのほうが簡単だろ?
略すな。 PS って言うと PostScript のことかと思っただろ!!
(アカウントを)つかいきろう PSN
>>590 に言われたので試しにWSHで書いてみた。
結果から言うと確かに簡単だったが1から勉強した身には結構大変だった。(何時間も掛かった)
検索してみても、いろんなバージョンのJavaScriptがあって、WSHでなくHTAだったりして頭が混乱したよ。
以下実行結果(StdInを使ったのでcscriptじゃないと動作しない。wscriptはダメ)
Z:\>cscript //nologo sample.js <list.txt
sample: ヌル、又は空白.(ピリオド)のみは指定できません
sample: "com0"は予約文字列です
OK. "z:\h ge&<a>bc"
OK. "z:\a < ”bcd” *:&(¥)"
OK. "z:\abc"
sample: "z:\abc" 既に同名のファイルが存在しています。
Z:\>echo abc| cscript //nologo sample.js
sample: "z:\abc" 既に同名のファイルが存在しています。
Z:\>
--list.txtの内容--
..
com0 .txt. ..
h ge&<a>bc
a < "bcd" *:&(\)
"abc"
abc . . .
---------------
var drivename = "z:\\"; var stdin=WScript.StdIn, arg = WScript.arguments; var fs = new ActiveXObject("Scripting.FileSystemObject"); var rc=0; while(!stdin.AtEndOfStream) { try{ var out = stdin.ReadLine().replace(/^"|"$/g,""); var out = drivename + chk_fname(out.replace(/[.\s]+$/g, "")) //後方空白削除(前後空白削除の場合は/^\s+|[.\s]+$/g) fs.CreateFolder(out); // 自前でfs.FolderExists(out)で存在チェックしても良い WScript.Echo('OK. "'+out+'"'); } catch(e) { rc=999; WScript.StdErr.Write(WScript.ScriptName.replace(/\.[^.]*$/,"") + ": "); switch(e) { case "E_spc_only" : WScript.StdErr.Write('ヌル、又は空白.(ピリオド)のみは指定できません\n');break; case "E_reserved" : WScript.StdErr.Write('"' + out.replace(/\s*\..*$/,"") + '"は予約文字列です\n');break; default : WScript.StdErr.Write('"' + out + '" ' + e.description + '\n'); } } } WScript.Quit(rc); function chk_fname(s) { var invalid_chars = {'<':'<','>':'>','*':'*', '"':'”', '?':'?', '\\':'¥', '/':'/', '|':'|', ':':':' }; var reserved_strs = new Array( "CON", "AUX", "NUL", "PRN", "COM[0-4]", "LPT[0-3]" ); if (s.replace(/[. ]/g, "")=="") throw "E_spc_only"; for (var i in reserved_strs) { if (s.replace(/\s*\..*$/,"").replace(new RegExp(reserved_strs[i],"i"),"")=="") throw "E_reserved"; } return s.replace(/[|:/<>*"?\\]/g, function (w){return invalid_chars[w];}); }
596 :
551 :2011/05/31(火) 00:09:15.39 ID:mdi5oQEJ
>>586-589 またもお返事遅くなすいません、どうもありがとうございます。
当該機能の部分を本チャンのバッチにマージして、一週間ほど
経過を見てみたのですが、どうにかまともに機能するようになったようです。
追加で示していただいたset /pを使う方法も、ファイルを経由する
やり方であれば選択肢として有り得たのですが、できれば引数で渡したかったので
結果として元の方法に、両端””を対処する処理を加える形で落ち着きました。
>>587 に挙げていただいたようなトラブルは現実的には発生しないと考えています。
それよりも、""の扱い方が変わった(両端だけの使い方でなくなった)ので
そのために全部手動で修正した作業が大変でした。
今時PowerShellが動かないOSに新機能を追加するケースはそう無さそうですし
DOSブート環境で使える処理を組みたいとかでない限り、バッチファイルを
掘り下げて習得していく意義は薄いのかもしれませんね。
それでも私なんかは、過去の資産に縛られて泥沼に嵌っていってますが・・・
それと、お教えいただいたサンプルコードは他の場所に転載したり
アーカイブさせていただいてもよろしいでしょうか?
>>596 スクリプトコードは何処へなりとも自由に持っていってもらって結構ですよ。
ちなみにBATでの最終形
>>588 は両端の"も取るし受け渡されたどの文字列も大丈夫だと思う。
set /pをパラメタ渡しに変えるだけで良いだろう。(
>>587 の制限はできるが)
ちなみに、set /pだとパイプでパラメタ受け渡しができる。(
>>595 と同様にフィルタ動作をする)
例 echo "abc"|sample.bat や type data.txt|sample.bat
なお
>>595 はWSHの習作なんで行儀の悪いことになっていた。まあ使わないとは思うが一応注意を。
(使ったオブジェクトを開放し忘れてる)
なお、DOSでのBATは似て非なるものでここで使ったようなテクニックはほぼ全て使えないんだなあ。
598 :
551 :2011/06/01(水) 00:00:36.95 ID:AfdclPhS
>>597 重ね重ねありがとうございます。
パイプで渡す場合でも、引数と同じように
>>587 の制限が
生じてしまうとのことで、かえって割り切れました。
DOSへの応用範囲も狭いとなると、後はもう殆ど意地ですねw
コードは今すぐどこかに転載するといった算段ではありませんが
今後も活用させていただきます。ありがとうございました。
上記の現在のディレクトリで CMD.EXE を開始しました。UNC はサポートされません。 UNCパスってなに? うんこ?
ネットワークドライブにマウントしてから使っとけ 分かったかウンコ
ありがとうんこ
おすすめはpushd
pushdしまくったら爆発した
pushd と prompt $P$+$G 併用お勧め
文字コードにUTF-8が使われているテキストがあるとまともに動かないツールばかりだ
>>605 君のIDに出てるようにシフトJIS使え
>>605 君のIDに出てるようにJScript使え
608 :
名無し~3.EXE :2011/07/13(水) 13:07:00.93 ID:0zcACgIP
数百KB〜数MBのファイルが何十GBと大量にあり、 なんとかこれを高速にコピーする方法は無いかと探しています。 今はxcopyを使っていますが、もっと良い方法は無いでしょうか?
robocopy
xcopyとかrobocopyの/Zスイッチの「再起動可能モード」ってなんなの?
↓見ると「再起動可能モード」の他に「バックアップモード」があるというのは分かったけど。
http://support.microsoft.com/kb/950790/ja 「バックアップモード」のほうはユーザー権利の「ファイルとディレクトリのバックアップ」や
「ファイルとディレクトリの復元」が有効になるってのはなんとなく分かったけど、
「再起動可能モード」のほうは、ネットワーク経由のコピーのときに有効なモードのようだけど
具体的には何なんだか全然よく分かんない。。。
えぐいひと?
614 :
612 :2011/08/13(土) 21:09:09.70 ID:CYdSlQAp
〇は特定の文字ではなく任意の1文字にマッチする(略 などと意味不明なことを言いつつごちゃごちゃやってるうちになんか見えてきたような気がする 書き込みアクセスしてるファイルに対して別プロセスで書き込もうとするとエラーになるけど 読み込みはできるって仕様になってるのを利用してるってことなのかな しかしこの8・9行目の処理って初心者的に目から鱗すぎる
無理筋だな やめとけ
616 :
名無し~3.EXE :2011/08/14(日) 16:24:20.80 ID:ihVTTdCj
バッチが遅いので調べたところ、コマンド全般が遅いことがわかりました。 C:\temp>prompt $t$s$p$g 13:37:57.40 C:\>for /l %A in (1,1,10)do find 2> nil 13:38:00.67 C:\>find 2>nil 13:38:01.01 C:\>find 2>nil <略> 13:38:03.71 C:\>find 2>nil 13:38:04.04 C:\> エラーになるだけのfindコマンドの実行1回あたり0.34秒ほどかかります。dirやdate /tなどは早いのですが findやfcなどの外部コマンドが遅いようです。 マシンはLenovo X200sでXP SP3です。低スペックのR51eでは10倍ほど早いので、遅くなる要因があるものと思います テスト時CPUの負荷などは最低限です。antivirusやfirewallを切ると1秒ほど改善しますが、大きな要因が他にあると思います。 原因を調べる方法はありますでしょうか?みなさんのPCではパフォーマンスはいかほどでしょうか?
PATHのsystem32より前にネットワークが入ってんじゃね
>>617 パスにネットワークドライブはありませんし、フルパス指定でも同様でした。
>>618 ゴミ見たいの残ってるとか?
net useでネットワーク共有確認した?
一度、実行前に set path=%systemroot% を実行してから試してみて欲しい。
半角"%"を含んでいるファイル名の処理方法をお聞かせ下さい。 具体的には、”AABBCC100%.txt”と言うファイルをmoveやren しようとしても上手く行きません。””でパス&ファイル名をくくっても同様です。 例:D:\test\aabbccdd 100%.txt を F:\DATA\08\へ移動したい ┌─────────────────────────────┐ │D:\test > move /Y "D:\test\aabbccdd 100%.txt" "F:\\DATA\08\" │ │ │D:\test > move /Y "D:\test\abcde 100\DATA\08\" │指定されたパスが見つかりません。 │ %の箇所で可笑しくなっています。%付きのファイルが沢山有って 手作業で%(全角)に変更するのも現実的ではありませんし、 リネームソフトで変更より、まずは一旦コマンドプロンプトで解決できる 方法をお教え下さいませ。
>>621 「指定されたパスが見つかりません」がtarget側にかかっているように見えるのは気のせい?
>move /Y "D:\test\aabbccdd 100%.txt" "F:\\DATA\08\"
move /y "D:\test\aabbccdd 100%.txt" F:\DATA\08\ でもダメですか?
#手元の環境では二重引用符で括るだけで問題なく動作します。
直接入力なら問題なかったような気がするけど・・・ バッチ内なら%%
>>622-623 有り難うございました。100%%で解決いたしました。
正規表現のメタキャラみたいな扱いなのでしょうか?
ほかの文字もあるのか、もう少し勉強し直してきます。
助かりました。
625 :
622 :2011/08/20(土) 15:38:08.00 ID:ZtdU7YRi
>>624 あぁ、バッチでの記述だったんだね(
>>621 では言及されてなかったけど)。
バッチだと%は変数のために予約されているんで、リテラルの%は%%で記述。
保守 ※落ちたように見えるスレは、ブラウザなどで1回書き込めば スレリストに復活、専ブラ等でも書き込み可能に。
627 :
名無し~3.EXE :2011/09/19(月) 20:44:45.01 ID:2pOzoyXR
batファイルにドロップした分を連続で処理できるようになっています。 これをフォルダ内のファイルを一括で処理するように改造する方法を教えてください @echo off SETLOCAL SET SPath="D:\ICEECC\ICEECC.exe" SET SParam1=c SET SParam2=/b1024 SET SParam3=/r2 SET SParam4=D:\ECC :start IF "%~1"=="" GOTO syoriend :syori %SPath% %SParam1% %SParam2% %SParam3% "%SParam4%\[ECC] %~n1%~x1.ecc" "%~n1%~x1" :next SHIFT GOTO start :syoriend rem ↓pause不要なら削除 pause ENDLOCAL
ドロップ for /f %%I in (%*) do %SPath% %SParam1% %SParam2% %SParam3% "%SParam4%\[ECC] %%~nxI.ecc" "%%~nxI" フォルダ for /f %%I in (*.*) do %SPath% %SParam1% %SParam2% %SParam3% "%SParam4%\[ECC] %%~nxI.ecc" "%%~nxI"
すまん/fいらん
schtasksのstで秒単位で指定しても無視されてしまいますが、こんなもの?
>>631 そんなもの。GUIのタスクスケジューラでも時分までしか設定できないんだから仕方ないだろ。
必要なら中で待てばよい
schtasksで表示すると秒まで出るが、虫されるとは、指定の仕方が悪いんじゃね
635 :
名無し~3.EXE :2011/11/09(水) 18:52:01.56 ID:y4E29ing
コマンドプロンプトのプロパティのレイアウトタグでバッファサイズと画面サイズを指定できますが、 cmd.exeの起動オプションかバッチファイル内で同等の指定をする方法はあるのでしょうか? ご存知の方がいましたら教えて欲しいです。よろしくお願いします。
mode/?
637 :
635 :2011/11/09(水) 20:40:15.34 ID:y4E29ing
638 :
名無し~3.EXE :2011/11/12(土) 08:50:42.69 ID:1vH/LxN0
コマンドプロンプトでtelnetを開始して、 open ホスト名 80 って打っても、2秒ぐらいした後にバグって入力のバーがコマンドプロンプトの左上(最初の位置)に戻るんですが、 これはバグですか? 7でやっても別のPCのXPでやってもこうなりました。 そのままGETコマンドとか打っても受け付けてはくれるんですが、見にくくてしかたありません。
GNU grep 使っていたが、日本語はうまくいかないこともあるのを発見 こまったアル 2.5.1
>>641 ありがとうございます。
findstr というツ−ルもあるようですが、たしかどっかに問題があった。
findstrは標準で入ってるやつだよ
文字列を貼り付けるときにマウスの右クリックでメニューを表示して貼り付けてますが マウスを使わずにキーボードで貼り付けるショートカットってありませんか?
alt+space e p
646 :
名無し~3.EXE :2011/11/23(水) 05:35:55.96 ID:nwtiGPYP
電波テロ装置の戦争(始) 魂は幾何学、コピー出来る公安はサリンオウム信者の子供を40歳まで社会から隔離している オウム信者が地方で現在も潜伏している それは新興宗教を配下とする公安(慶應卒T)の仕事だ発案で盗聴器を開発したら霊魂が寄って呼ぶ来た <電波憑依> スピリチャル全否定なら江原三輪氏、高橋佳子大川隆法氏は、幻聴で強制入院矛盾する日本宗教と精神科 <コードレス盗聴> 2004既に国民20%被害250〜700台数中国工作員3〜7000万円2005ソウルコピー2010ソウルイン医者アカギ絡む<盗聴証拠> 今年5月に日本の警視庁防課は被害者SDカード15分を保持した有る国民に出せ!!<創価幹部> キタオカ1962年東北生は二十代で2人の女性をレイプ殺害して入信した創価本尊はこれだけで潰せる<<<韓国工作員鸛<<<創価公明党 <テロ装置>>東芝部品)>>ヤクザ<宗教<同和<<公安<<魂複<<官憲>日本終Googl検索
>>644 キーボードじゃなくてスマンが
プロパティのオプションタブで簡易挿入モードをONにすると
マウスの右クリックだけで貼り付けられるよ。
↑「簡易編集モード」の間違い
隠しフォルダ内のファイルをコマンドでコピーするときってどうやるの?
おんなじだけど
xcopy? アクセスできなくない?/H とか? Win7のAPPDATA内のSleipnirお気に入りを別の場所にコピーするバッチ作りたいんだけど… xcopy で/Hってやってもダメなんだけど必要なオプションとかある?
copyでできるが?
ほら >md aaa >echo >aaa\aaaaa >attrib +h aaa >copy aaa\aaaaa 1 個のファイルをコピーしました。
俺は使ってないので、Sleipnirお気に入りでググってみたところ C:\Users\<ユーザー名>\AppData\Roaming\Fenrir & Co\Sleipnir の下に Favorite.ffv(お気に入り)、 FavoriteGroup.ffg(お気に入りグループ) の2つのファイルがあるそうだ。 xcopy使うまでもなくただのcopyで良いと思うけど、 問題ありそうなのはフォルダ指定じゃないのか? (半角空白があるけど""で括ってないとか) 一度エラーになったbatをさらしてみたら?
655 :
649 :2011/11/27(日) 00:22:34.36 ID:1krBEMlR
>653,654 ありがとう、出来たよ! 原因はパスだった。 隠しフォルダにアクセス出来ないんじゃなくてパスが間違ってた。 Sleipnir2.* とSleipnir3はAPPDATA内のパスが違うみたい。
具体的に要件を言えよ
658 :
名無し~3.EXE :2012/01/10(火) 09:22:57.61 ID:IzsMUOFe
教えてください。 フォルダ内のすべてのファイルのファイル名を 頭三文字を削除したファイル名にリネームしたいのですがどのようにしたらよいでしょうか? 例 リネーム前 01_ほげ.txt 02_hoge.bmp リネーム後 ほげ.txt hoge.bmp
for %%i in (*) do (set "x=%%i") & call ren "%%i" "%%x:~3%%"
>>660 ありがとうございます。
目的の作業が出来ました。
ただバッチファイルやリネームしたくないファイルもリネームされてしまうので
ファイル名の一文字目が数字の場合のみリネームするように改造できますか?
for %%i in (0* 1* 2* 3* 4* 5* 6* 7* 8* 9*) do (set "x=%%i") & call ren "%%i" "%%x:~3%%" for %%i in (??_*) do (set "x=%%i") & call ren "%%i" "%%x:~3%%"
if "%OS%" == "Windows_NT" ( echo This system is echo running on NT technology. ) else ( echo This system is NOT echo running on NT technology. ) 上記の記述だと問題はないけれど, 環境変数中に「()」が含まれる場合,エラーになるのだけれど回避する方法はあるのかいな
エラーにならんぞ
間違えた。 「if...()」で囲まれるブロック中の環境変数に()が含まれる場合だった。
^^付けてあげるとか駄目かな。比較部分も書き換えなきゃいけなくなるけど。 それじゃあ困るんだよ !って言われても僕には分かりません set string=^^(ab^^)c echo %string% if "%~1" == "" ( if "%string%" == "^(ab^)c" echo equal echo %string% echo . )
")"でエスケープ または !遅延展開!
ラベルをコールするとか
ラブコール
TWEETコマンドを使ってツイートしてるのですが、 ツイートの改行方法が分かりません。 winのコマンドで文字列を改行するのはどうしたらいいんでしょうか?
インターネットテンポラリフォルダにあるクッキー以外のファイルを一括で 削除したいのですがバッチファイルの記述など教えていただけませんでしょうか? ゴミ箱にいれずに直接削除できたら便利なのですが batファイルをファイル名を指定して実行から起動しようと思っています ccleanerなどで削除するのをもっと手軽に出来たらなと思いまして よろしくお願いします。
ClearMyTracksByProcess
>>673 おぉ 見事に解決しました ありがとうございました
>>673 解決はしたんですが 作成したリンクファイルのフルパスを
ファイル名を指定して実行する事が出来ない・・
.likだからだろうけど ちょっとだけ残念
.lnkを付ければええだろ
>>676 うーん もしかしてショートカットはデスクトップからうつしたらだめで
ファイル名変更もだめなのかな
リンクつけるとファイルノプロパティが開いてしまうんです。
あれ、もしかしてキャッシュのパスかえたからおかしくなったのかも・・
ちょっと試行錯誤してきます
?
すいません。誘導されて来ました。
WindowsXP質問スレ 212ページ目
http://toro.2ch.net/test/read.cgi/win/1323269626/548 548 名前:名無し~3.EXE[sage] 投稿日:2012/02/21(火) 12:11:40.50 ID:0LZ9ETD9
dosのバッチファイルで「あるコマンド実行後0.5秒休止」をループで繰り返したいときには
どうバッチファイルを記述すればよいのでしょうか?ループの中でコマンドを二回する方法がわかりません。
また休止コマンドは「ping localhost」を使えと言われたのですが・・
FOR %%F IN (*.拡張子) DO コマンド 0.5秒休止 %%F
1秒以下・1秒以下単位のスリープは不可能。専用ツールでもあれば別。
Usage: sleep time-to-sleep-in-seconds sleep [-m] time-to-sleep-in-milliseconds
使用法: ping [-t] [-a] [-n 要求数] [-l サイズ] [-f] [-i TTL] [-v TOS] [-r ホップ数] [-s ホップ数] [[-j ホスト一覧] | [-k ホスト一覧]] [-w タイムアウト] [-R] [-S ソースアドレス] [-4] [-6] ターゲット名 オプション: -n 要求数 送信するエコー要求の数です。 -w タイムアウト 応答を待つタイムアウトの時間 (ミリ秒) です。
203.0.113.0とか使うのが適当?
684 :
名無し~3.EXE :2012/02/25(土) 23:36:19.58 ID:yy3S+6gu
slmgr.vbs -dlvってなんすか?
メモ帳で開いてみれば分かるだろw
>>685 ライセンス関係だからわかってても答えない
保守
バッチファイルにドラッグ&ドロップで、ファイル名にスペースのある物を使いたいのですが "でくくっても正常に表示されないのですがどうしたらいいんでしょうか? ドラッグ&ドロップしたファイル名 「a #01.gl」 echo %1 echo "%1" pause C:\>echo C:\a C:\a C:\>echo "C:\a" "C:\a" C:\>pause
echo %* echo "%*"
>>690 ありがとうございます。
スペースが、あったり、なかったりする、複数ファイルを扱うことはできないんでしょうか?
>>691 D&Dをエクスプローラ以外のファイラーでやってない?
エクスプローラではスペースあっても""でくくられているので %1 で問題ないのだが
ファイラーによってはくくられずにスペースで分割されてしまう。
>>691 全角スペースじゃなく半角スペースならいけるはず。
コマンドプロンプトだけじゃなく他のプログラムでも問題を起こす場合があるから
ファイル名の全角スペースはできるだけ避けた方が無難かと。
%*だと、%~nx1とかも使えないんですね・・
>>692 windows7で普通にドラッグ&ドロップしているだけなんですが・・・
>>692 他のソフト(TvRock)で自動に作られてしまうのでどうしようも・・・
自動でスペース消したりする方法とかありますかね?
>>694 リネームツールを使えば簡単に変更できるはずだけど
このスレ的にやるなら↓こんなん?
正直あんまり自信ないから
もし使うなら空のテキストファイルあたりに同じファイル名を付けて
ちゃんとリネームされるかどうか確認してからの方がいいと思う。
::実行ディレクトリ内にあるファイル名の全角スペースを半角スペースに置換する
::全角スペースを含むファイルをリネーム処理に送る
for /f "delims=" %%a in ('dir /a:-d /b "* *"') do call :sub "%%a"
::終了処理へジャンプ
goto :eof
::リネーム処理
:sub
set f=%1
ren %f% %f: = %
::終了処理
:eof
>>695 いけそうです。ありがとうございました。
なことせんでも半角スペースのあるフォルダに置いてそこからD&Dすればオッケーよ
引数って、全角スペースでも区切られるのかぁ 長年コマンドプロンプト使ってるつもりだったけどぜんぜん気付いてなかった 勉強になった
仕様じゃないよ単なるバグよ直らんけど
いったん半角スペースのあるフォルダにおいて、でもいいので ファイル名の全角スペースと半角スペースをアンダーバーに変えたいのですが、 バッチファイルにD&Dだけで、 しているのですが、以下を2回かけるしかないのでしょうか? 2つの条件でrenや、renした後のものを確認できますか? (2つとも可能なのでしたらやり方も教えていただけるとありがたいです。) for %%a in (%*) do call :sub %%a goto :eof :sub set f=%~nx1 echo %f% ren "%f%" "%f: =_%" ren "%f%" "%f: =_%" :eof
そうだね
全部置換した名前を生成後、最後にrenじゃダメなのか? 一応、半角スペースのフォルダに置かなくても以下のようにすれば大丈夫じゃないかな? @echo off set pname=%* if not defined pname echo ファイル名を指定してください&pause&&goto :eof set pname="%pname:"=%" call :sub %pname% echo 置換:^<%r%^> %pname% ===^> %fname% rem if %r% equ ON if exist %dir%%fname% echo 既存ファイルがあって置換できない ren %pname% %fname% pause goto :eof :sub set dir="%~dp1" set f="%~nx1" set fname=%f: =_% set fname=%fname: =_% if %f% neq %fname% (set r=ON) else (set r=OFF) goto :eof
よくあることだが、半角スペースがあるとわかりきってるのに ""でくくらないとボロボロだろそれ
>>703 そもそもの原因は「全角スペースに対して自動的に""が付加されない」ことにある。
変数をそのままくくっちゃうと、全角スペースだけの場合は正常に動くけど
半角スペースを含んでいる場合は「""C:\ho ge\ho ge.avi""」となって失敗する。
>>702 では一旦「"」を置換処理で除去してからくくってるみたいだから
どのケースでも問題なく動くと思う。
>>703 一応簡単にはテストしてアップしたわけだからボロボロってほどでも無いと思いたいが、
ダメなケースってどういう場合だろ?
>>702 ありがとうございます。
どう置換しているのかあまりよくわかってないですが、複数ファイルをまとめてD&Dするなら、
フォルダ名に半角スペース入れて、こんな感じでしょうか?
@echo off
for %%a in (%*) do call :suba %%a
:suba
set pname=%*
if not defined pname echo ファイル名を指定してください&pause&&goto :eof
set pname="%pname:"=%"
call :sub %pname%
echo 置換:^<%r%^> %pname% ===^> %fname%
rem if %r% equ ON if exist %dir%%fname% echo 既存ファイルがあって置換できない
ren %pname% %fname%
pause
goto :eof
:sub
set dir="%~dp1"
set f="%~nx1"
set fname=%f: =_%
set fname=%fname: =_%
if %f% neq %fname% (set r=ON) else (set r=OFF)
goto :eof
>>706 「%*」って全ての引数を表示するって意味だから、複数ファイルをD&Dすると
それら全てが1つのファイル扱いになって失敗すると思う。
ていうか、「call :suba %%a」じゃ:subaに渡す時にスペースのところで分割される。
半角スペースのあるフォルダでないとダメって言ってる理由がわかった。
BAT環境にファイル名が正常に渡ってこない場合があることを忘れてたよ。
俺も
>>586 (以降の一連のレス)で忠告したことがあったのに、自分自身がそれに引っかかっちゃった。orz
(例 a b&c.txtとか)
>>706 半角スペースを含むフォルダを指定するとして
for %%a in (%*) do call :suba %%a
を
for /r %1 %%a in (*) do call :suba %%a
pause
goto :eof
に変えて、下にあるpauseを取れば一応は動作と思うが、半角スペースを含む場合なら
無駄なことをしてるので自分で考えて改造してよ。
さらにパラメタがフォルダかどうかチェックすればもっといい。
(ルートでない場合、"c:\hoge"なら"c:\hoge\."が存在するかどうか)
フォルダ名じゃなくて複数ファイルのD&Dなら、次のような感じで。 :loop for %%a in (%1) do call :suba %%a shift if exist %1 goto loop
いやfor文の変わりに単に、call :suba %1 でいいや。
なにやってんだかあほか
コマンドラインで漢字交じりの文をローマ字変換したいのだけど kakasiを使ってみたら「ん」の後に母音が来ると「ん」が「n'」に変換されてしまうので困っている。 元文が「'かんおん'」というような''で囲まれた文なので中身に「'」が入るのは困る。 平仮名だけなら簡単に事前置換等で対応できそうだけど、漢字の読みがそうなる時がある… 総計10GB位のテキストなので手作業なんて非現実的なにかいい方法はないだろうか?
>>712 元文の「'」を絶対に一致しない文字に置き換えるのが無難のような気がする。
やっぱりそれしかないか… ちょっと誤爆が怖いけど。
お前らがアスペっていうのは昔から聞いてたけどほんとなんだな この流れはどうみても「ラーメンは何味が好き?」だろ こんなこともわからないとかやっぱりアスペだなお前ら
誤爆か遅レスか知らんがこれほど天唾乙と言えるレスもないな
「a+b.txt」というファイル名をバッチファイルで記述するときはどうやるのでしょうか? +をエスケープ文字で回避すると思うのですが。。 copy C:\a+b.txt C:\
> copy C:\a+b.txt C:\ ディレクトリーを変えないといけなかった。 copy C:\a+b.txt C:\d コピーじゃなくてファイル移動だと move C:\a+b.txt C:\d でうまくいくのですが。
copy C:\"a+b.txt" C:\d で出来ました。
cmd/? 引用符が必要な特別な文字は次のとおりです: <スペース> &()[]{}^=;!'+,`~
コマンドプロンプトについての質問なんですが、日本語入力をON,OFFするコマンドはありませんか? バッチファイルに書き込んで使いたいと思っています。
createobject("wscript.shell").sendkeys "%{kanji}"
>>722 .NETの関数でしょうか。
VBSファイルを作ってバッチファイルから呼び出してみましたがうまくいきませんでした。
どうやって使えばいいのですか?
VBAのsendkeysかWin32APIのkeybd_eventを使うんだな
725 :
名無し~3.EXE :2012/05/15(火) 10:11:19.08 ID:4YpaanVg
WindowsXP Homeを使っています ネットワークドライブを使うとき、起動ごとにパスワードを聞かれます netコマンドでどうにかなりませんか?
test.txtが aaa bbb ccc という内容の時に cmd /v:on for /F %i in ('type test.txt') do @set s=!s!%i echo %s% とやると !s!aaabbbccc と改行が削除された状態で表示されますが、最初の!s!を入れないようにすることは出来ないのでしょうか?
for /F %i in ('type test.txt') do @if defined s (set s=!s!%i) else (set s=%i)
>>728 出来ました。ありがとございます!
しかしこのような即レスをされる方がゴロゴロいるなんて、ここは梁山泊みたいなスレですね・・・
set s=s for /F %i in ('type test.txt') do @set s=!s!%i set s=!s:~1!
「梁山泊」は反社会的なゴロツキのアジトみたいな意味に受け取られる 理由は反社会的なゴロツキが自分達のアジトを「梁山泊」と命名したがる傾向にあるからだ 誉める時の喩えにはあまり使わない方がいい
>>731 ?
そうともいえないような気が。つ水滸伝
触るなよ
環境変数の遅延展開を使いこなす山賊のアジトはここですか?
ファイル作成の仕方について教えてください。 @ipconfig > tmp.txt Atmp.txtを開き、一行目Windows IP Configurationをコピー Btmp.txtをWindows IP Configuration.txtに変更 この例としてipconfigを挙げました 現状ABを手動でやっているのですが、@〜Bの流れをコマンドで実行したいです
コマンドの出力結果の1行目の文字列をファイル名にしたいってこと?
ipconfig>tmp.txt for /f "delims=" %i in (tmp.txt) do if exist tmp.txt rename tmp.txt "%i.txt" ・・・これだと厳密には、コマンドの出力結果の1行目というより、ファイル名として使える文字列の行のうち、最初の行の文字列にリネームされるけど。
あと、
>>738 だと、文字列の先頭3文字以内に「?」があると、「?」が元ファイル名「tmp」のどれか1文字に置換されちゃうかも。
>>738 XPだとエラーになってしまう
ipconfigの出力が変だからなので普通のファイルならいけるだろうけど
>>738 できましたー ありがとうございmす
300行ぐらいあるtxtなので全行にわたって処理が流れますが、運用上問題ありません
また、一行目に日本語が入ってるので、出力したファイルが文字化けしてしまいますが、
対策もしくは運用回避できそう
>>740 ごめんなさい
ipconfigは一行目が空白?半角スペース?で2行目にWindows〜でした
例として適さなかったですね
いや、一行につき、改行コードが0Aのと0D0Aのと二つ付いてそれでダメなんだけど
0Dと0D0Aの二つの訂正
>>738 は見ての通り、すごく乱暴なロジックだから、使うとき気をつけてね。
もし1行目の文字列.txtってファイル名が既存だったら2行目の文字列のファイル名になるし、
ファイルの中身によっては
>>739 とか
>>740 さんみたいに意図しない結果になるかも。
何千行、何万行あっても延々とif exist 〜ってやり続けるからCPU食いまくったりするかもしれないし、
全行の処理が終わる前に、たまたま誰か別のプログラムがtmp.txtってファイルを作って
それも何か変な名前にリネームしちゃったりすることもあるかも。
1行目だけで良いなら set /p nanika=<tmp.txt も場合によっては便利では。
747 :
729 :2012/06/02(土) 17:15:21.15 ID:s4AwXJTk
>>731 サンデーのケンイチって漫画の読みすぎです。すみませんw
ところでまた質問があるのですが・・・
例えば「テンプレ.txt」の内容が
商品コード:@ID 商品名:@商品名
内容量:@容量 ml 小売価格:@価格 円
で、「10001.csv」の内容が
@ID,10001
@商品名,スコッチ
@容量,700
@価格,1200
である時に「テンプレ.txt」の内容を
商品コード:10001 商品名:スコッチ
内容量:700 ml 小売価格:1200 円
のように書き換えて「10001.txt」に出力したいのですが、どのように記述したらよいでしょうか?
あまりにも複雑で検討もつきません・・・。WSHとかでも大丈夫です。
素直に他の言語使え。
>>747 csvの内容が4つまでで簡単なエラーチェックしかしてないが、以下を参考に
@echo off
set target_dir=%~dp0
set c=0
for /f "tokens=1,2 delims=," %%i in (1001.csv) do (
call :sub1 %%i %%j
)
call :create_rep_bat
type nul>"%target_dir%%data0%.txt" 2>nul
if not exist "%target_dir%%data0%.txt" goto :error
for /f "delims=" %%i in (テンプレ.txt) do (
call rep.bat %%i
)
goto :end
:sub1
set name%c%=%1
set data%c%=%2
set /a c += 1
goto :eof
:create_rep_bat if %c%==0 goto :eof echo @echo off> rep.bat echo set line=%%*>> rep.bat echo set line0=%%line:%name0%=%data0%%%>> rep.bat if %c%==1 goto :eof echo set line0=%%line0:%name1%=%data1%%%>> rep.bat if %c%==2 goto :eof echo set line0=%%line0:%name2%=%data2%%%>> rep.bat if %c%==3 goto :eof echo set line0=%%line0:%name3%=%data3%%%>> rep.bat if %c% gtr 4 goto :error echo if "%%line0%%" neq "%%line%%" echo %%line0%%^>^> %target_dir%%data0%.txt>> rep.bat goto :eof :error echo エラーだよ [count=%c% filename=%data0%.txt] :end del rep.bat>>nul goto :eof
>>746 ありがとうございます
set /p nanika=<tmp.txt
rename tmp.txt %nanika%.txt
これで
>>738 さんの方法と同様かつシンプルに動作しました。
またアドバイスいただきたくてきたのですが、
一行目に日本語文字があり上記のコマンドでファイル名をセットすると文字化けすることが
解決できずにいるのですが何か方法はありますか
「c:\data」というフォルダを丸ごとバックアップするために xcopy c:\data c:\data_bak\ /e /d /y というコマンドを定期的に実行しているのですが、 このコマンドだと2回目以降のバックアップは差分バックアップで高速なのはいいのですが、 「c:\data」から削除されたファイルが「c:\data_bak」に残ってしまいます。 2つのフォルダの内容を同一にする方法はないでしょうか?
753 :
752 :2012/06/16(土) 15:58:41.91 ID:8ul3taaL
robocopyで出来ました。お騒がせしました。
テキストファイルの内容を書き換えて1行1レコードにしたいのですが、例えば [Name]あああ [Age]10 [Tel]1111-1111 [Name]いいい [Age]20 [Tel]2222-2222 [Name]ううう [Age]30 [Tel]3333-3333 という内容のテキストファイル(Kaiin.txt)を [Name]あああ [Age]10 [Tel]1111-1111 [Name]いいい [Age]20 [Tel]2222-2222 [Name]ううう [Age]30 [Tel]3333-3333 のように1行1レコードに書き換えることはできるのでしょうか? ちなみにレコードは[Name]から始まることは確実なのですが、 情報は3項目とは限らず、あるレコードには[E-Mail]という4つ目の項目があったりします。 「delims=[Name]」とか色々やってみたのですが、改行の扱い方がよくわかりませんでした・・・
type hoge.txt|tr -d \r|tr -d \n|sed "s/\[Name\]/\n[Name]/g"
>>754 setlocal ENABLEDELAYEDEXPANSION
del Kaiin_fix.txt
for /f "delims==" %%A in (Kaiin.txt) do (
set t=%%A
if "!t:~0,6!" == "[Name]" (
if not "!r!" == "" (
echo !r!>>Kaiin_fix.txt
)
set r=%%A
) else (
set r=!r!%%A
)
echo !r!
)
echo %r%>>Kaiin_fix.txt
>>755 実行したら
'tr' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
というメッセージが出てしまいました。
うちのPCが古い(WinXP-Home)からでしょうか?
>>756 そのまんまバッチファイルに保存して実行したら一発でうまく行きました〜!(>_<)
本当にありがとうございます。明日仕事で使うので助かりました!
echoの直後にスペースも開けずにピリオドやセミコロンつける書き方あるけどあれってなんの意味があるの?
一行開けたい時に使う
>>760 いや前スレのレスNo.223に
for /F "tokens=1* delims=" %i in ('ipconfig /all') do @(echo.%i)>>IPconfig.txt
みたいな記述があるんだが、ここのechoの直後にあるピリオドは何か意味があるのかなと思ったんだ。
. は 半角スペースの意味 echo (半角スペース)を入れても echo は on ですとか表示されるだけだから
%i は空文字列の場合がある、から
>>761 読み込むテキストで空行の場合、%iは空となって、echo %iだとechoと展開されちゃうのでね
まあカッコで括ってるのには別段意味は無いと思われるけど
765 :
761 :2012/06/23(土) 10:04:48.19 ID:CNQPEC6l
みなさんありがとう。
試しに
for /F "tokens=1* delims=" %i in ('ipconfig /all') do @(echo.%i)
ってやると
'echo.' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ってエラーが大量に表示され、
for /F "tokens=1* delims=" %i in ('ipconfig /all') do @(echo;%i)
ってやるとipconfig /allってやった時と同じ結果が表示される。
コマンドのバージョンの違い?と思ってググったら環境によって使える記号が違うんですね。↓
http://www.k-tanaka.net/windows/cmd/echo.html お騒がせしました。
echo>echo echo. echo; ってやってみるとわかるよ
DOS上でHDD1からHDD2に xcopy を使ってシステムファイルをコピーしようと思います。 USBメモリにDOS起動ディスクを作成して、 DOSを起動してみたんですが、 他のハードディスクのルートやそのディレクトリに移動できません。 コマンドプロンプトで練習したようにうまくいかない・・・。 ------------------------ cd D:\ cd E:\ cd F:\ 無効なデバイスです。 ------------------------ と言われます。
・NTFS ・cdはドライブ移動コマンドじゃない
NTFSはダメなんですか? きょうび、Windows XP以降は全部NTFSじゃないですか・・・・ じゃあ、どうやってDOS起動ディスクで HDDのファイルをサルベッジするんですか。
以前SysinternalsでNTFS読めるドライバだしてたと思う シェアだったような気もするが
そういう用途ならCDブートLinux使えばいい Knoppixが有名だけどUbuntuもライブCDになってる
もう関係ないけど cd の/dオプションはDOSには無い
>>770-775 そうなのかー、
PC自作してから10年くらい離れてたから
ぜんぜんわからんわー。
10年前なら今と大して変わらんダロ
Windows 95の頃からロングファイルネームの問題があったから、 DOSの起動ディスクで起動してxcopyでシステムファイルのバックアップって出来なかったからなぁ
コマンドラインで、引数の文字列に & を入れたいときは どうしたらよいでしょうか
^&
findstrでは文字コードがUTF8のテキストファイル内の全角文字を検索することは出来ないのでしょうか?
chcpでutf8にするか1252にするかすれば?
>>770 こういう情報って何の本で仕入れるんですか?
Windows PE っていう言葉自体を知らなかったです。
ファイル救出?とかWindowsトラブル?
とかそういうタイトルの書籍を読んだらいいですか?
785 :
名無し~3.EXE :2012/07/19(木) 00:49:38.11 ID:ZGZWnbQ/
>>767 そのドライブレター確認したOSとDOS起動ディスクが認識してるドライブレターは同じ?
>>783 chcp 1252
を実行してからUTF8のテキストファイルをfidstrで検索してみましたが
検索結果のうち全角文字については文字化けしてしまい正しく表示されませんでした。
というかそもそもchcp 1252を実行するとコマンドラインから全角文字が
入力できなくなりました。
1252はutf8じゃなかんべ
ふつうaかbかというときはaはbじゃなかんべ
789 :
名無し~3.EXE :2012/07/26(木) 11:29:20.04 ID:CcmXux6t
バッチファイル作成のIF EXIST構文について質問です。 IF EXIST F:\hoge\hogehoge\nul GOTO Label1 このように、指定したディレクトリが存在すればラベルにジャンプするようなことがしたいです。 上記のようなパス名なら問題ないのですが、 ディレクトリにスペースが入る場合は正常に動作しないです。(Documents And Settingsとか) 通常のパス名指定のように、""で囲う方法も駄目でした。 うまく指定する方法があったら教えてください。
790 :
789 :2012/07/26(木) 11:39:55.62 ID:CcmXux6t
自己解決しました
普通に有効だろ?
職場でコマンドに詳しい人が「forとcallを併用すれば遅延展開と同じことできるよ」みたいなこと言ってたんですが、どういう意味なのでしょうか? ググっても全然意味がわかりません・・・
>>793 サンキューです!
echoの前にcallつけるだけでいいんですね。
(1ループ毎のサブプローシージャ呼び出しみたいに展開されてるのだろうか?)
ありがとうございました。
Evalみたいなもんだ
Evalな
Evalかよ
テキストファイルが1つあるのですが、これの改行を全部取り除いて1行にしてしまうコマンドってありますか?
1コマンドはない nコマンドで作れる
@echo off (for /f "delims=" %%I (テキストファイル) do set /p dummy=%%I) > 新テキストファイル
>>801 ありがとうございます!
色々試行錯誤して以下のようにしたら1行で出来ました。
(for /f "delims=" %%i in ('type in.txt') do @set /p dummy=%%i<nul) > out.txt
ところで「%%」を「%」にしてバッチファイルではなく直接コマンドプロンプトから入力すると
set文の実行内容がいちいちタイトルバーに表示されてパフォーマンスがものすごく落ちますね。
これってどうにもならないのでしょうか?まあバッチファイルでやればいいのですが、若干面倒なので…
cmd /c (for /f "delims=" %i in ('type in.txt') do @set /p dummy=%i<nul) > out.txt
>>803 ありがとうございます。
教えていただいたものをコマンドプロンプトに入力して実行すると
「指定されたファイルが見つかりません。」というエラーになります…
↓のように色々変えて試しましたがやはり同じエラーになりました。
何か原因がおわかりになるでしょうか?
cmd /c (for /f "delims=" %i in ('type in.txt') do @set /p dummy=%i<nul) > out.txt
cmd /c (for /f "delims=" %i in (type c:\in.txt) do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "delims=" %i in ('type c:\in.txt') do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "delims=" %i in ("type c:\in.txt") do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "usebackq delims=" %i in (`type c:\in.txt`) do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "delims=" %i in (c:\in.txt) do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "delims=" %i in ('c:\in.txt') do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "delims=" %i in ("c:\in.txt") do @set /p dummy=%i<nul) > c:\out.txt
cmd /c (for /f "usebackq delims=" %i in (`c:\in.txt`) do @set /p dummy=%i<nul) > c:\out.txt
ちなみに cmd /c "type in.txt" > out.txt と入力するとin.txtと同一内容のout.txtが作成されるので in.txtはきちんと存在しています。
806 :
名無し~3.EXE :2012/08/07(火) 00:16:01.54 ID:1JXfprE0
cmd /c for /f "delims=" %i in ('type in.txt') do @set /p dummy=%i<nul > out.txt
807 :
805 :2012/08/07(火) 00:53:51.87 ID:ouQbeSLg
>>806 括弧取ればいいだけでしたか…orz
助かりました。どうもありがとうございます。
ごめんね確認しないで書いてるもんで
809 :
805 :2012/08/09(木) 00:46:01.43 ID:CvGiPjbA
>>808 いえいえ見返りもないのにレス頂けただけでもありがたいです。
お手数をお掛けしてすみませんでした。
こんなところでこんな質問していいのかわかりませんけど・・・ コマンドプロンプトでNICの正常性を確認したい場合 どんなコマンドを使えばいいんでしょうか systeminfoコマンドのみででわかるものなんでしょうか
ping 127.0.0.1
>>811 TP線抜いたりデバイスマネージャでNIC無効にして試してみて
テキストファイルを長さゼロの行、又はスペース・タブ以外の文字が無い行を除外して表示させることは出来るのでしょうか? 以下のようなコマンドを考えましたが、これだと長さゼロの行は除外されるのですが、タブしか無い行が表示されてしまいます・・・ findstr "[^]" test.txt
findstr /v "[ \t]*"
>>814 やってみましたが、スペース1個だけの行もタブ1個だけの行も表示されてしまいます…
色々試したら↓でスペースだけの行も非表示にすることが出来ました。 findstr "[^]" test.txt | findstr /v /c:" " タブの非表示方法は見つけられませんでした…
cmd /f
@if (0)==(0) echo off cscript //nologo /e:jscript "%~f0" <test.txt goto :eof @end var stdin=WScript.StdIn; while(!stdin.AtEndOfStream) { var data=stdin.ReadLine(); if (!data.match(/^[ \t]*$/)) WScript.StdOut.WriteLine(data); };
819 :
816 :2012/08/12(日) 22:27:36.56 ID:dDRqHhz6
>>818 それでばっちりうまくいきました。ありがとうございます!
一応↓のようにしたら希望に近い動作にはなったのですが、
これだと内容のある行のタブも全てなくなってしまうという欠点があったので助かりました。
コマンドラインはタブの扱いは苦手なようですね…
more /t0 /s test.txt | findstr "[^]"
あれ? 今やり直して見たら↓でうまくいくような気が・・・ more /s test.txt | findstr "[^]"
821 :
820 :2012/08/13(月) 00:28:40.47 ID:CN/4Vl7Y
たびたびすみません。やはり
>>820 のやり方だとダメですね。
結果をテキストファイルに出力してみるとタブが全て複数個のスペースに変換されていました。
findstr /r /c:"[^ ]" test.txt ↑^空白タブ
それ、バッチファイルからでないと動作せんだろ? それとも拡張機能だとかをオフにすればコンソールから叩けるのか?
あほだなw more|cmd
ちがった type con|cmd
>>825 それって「cmd /f:off」と意味同じ?
どうでもいいけど「cmd /f:off」と「cmd /f:on」ってどちらかを一度でも実行すると
ファイル名のタブ補完機能が無効になってタブが入力できるようになるけど、
コマンドプロンプトを起動しなおさない限り有効に戻せなくなるね。
(「cmd /f:on」を実行してもタブ補完機能が有効にならず相変わらずタブが入力できる状態のまま)
これって仕様?
たぶんバグなんだろう、もはや仕様ってことになるんだろうと思う けれども、ファイル名フォルダ名入力の補完機能は一応ちゃんと切り替わってるようだよ ([Ctrl]+[D],[Ctrl]+[F]) cmdの新たなインスタンスを作成しネストした場合、親アプリケーションの環境を継承する ことにはなっているが、パラメタを指定した場合、全く同じというわけではないようだ 個人的には、[Tab]の補完はレジストリ参照だから/fオプションが指定されて 一旦リセットした時にその部分までリセットされちゃって引き継ぐことを忘れちゃっているんだろう (/fじゃない別のオプションだとちゃんと引き継がれてるから) あと、子インスタンスを終了して親インスタンスに戻るにはexitコマンドを使う cmd /f:on の後、exitとやってやれば親に戻ってこられる 当然ながら子インスタンスの環境は破棄されるので子インスタンスで設定した環境変数は継承されない (setlocal/endlocalと同じだと思えばいい) ただ、親インスタンスに戻ってきても[Tab]での補完は無効になっちゃうのは何故なのか分からない (誰かこの辺の動作を教えて下され) 最後に type con|cmdを使うのは俺はどうかと思う なぜこんなのを使うのかその理由が聞きたい 動作的には、con特殊ファイルの内容をパイプすることになるわけだが エコー機能をoffにしないと(cmd /q)、タイプした文字(つまりconファイルの中身に相当する) がそのまま表示されちゃうし、いろいろと不都合が発生しそうだ (exitで戻れるが存在しないファイルに書き込もうとしたとかエラーが出るし、 exitじゃなくて、[Ctrl]+[C]で中止しちゃえばこのエラーは見なくて済むけど for /?でヘルプを見ようとしたら...固まっちゃったぞ) なお環境はXPでのことだから7なら違うのかも知れんけど
for /f "delims=N" %I in ('cmd /u /c echo 三') do findstr /r /c:"[^ %tab%]" test.txt
ミス for /f "delims=N" %I in ('cmd /u /c echo 三') do findstr /r /c:"[^ %I]" test.txt
>>829 UNICODEの「三」はANSIでは「<TAB>+N」な訳か。すごい妙技だなw
dir c:\windows\*2.txt /s/b とかやると拡張子が「txta」のものも表示されたり、8.3形式側のファイル名で合致するものも表示されたりしますが、 みなさんはいちいち dir c:\windows\*2.txt /s/b | findstr "2\.txt$" とかやってるんでしょうか? とても面倒です。何かもっと簡単な方法があれば教えて下さい。
なし
>>834 CH12_0047.txtの8.3形式はCH3013~1.TXTだから
「del /q CH30*.txt」を実行するとCH12_0047.txtも消えちまうのか。震えが止まらんな。
del *.xls てやれば *.xlsx も消してくれるわな
>>836-837 なるほど、有名な話なんですね。
>>838 1.abc
1.abcde
123456789012345678901234567890.abc
123456789012345678901234567890.abcde
という4つのファイルがあって「del ????????.abc」ってやると全部消えるw
8.3形式のこと知らないと1番目のファイルだけ消えると考えちゃいそうだけど。
これって最初はワイルドカード使った時だけの問題かと思ってたけどそうじゃないんだね。
ただ単にファイルは2つの名前を持ってるというだけのことか。
それにも関わらずMSはオフィスとかVisualStudioとかで3バイト以上の拡張子をバンバン使って
この問題を複雑化させてるね…
Litst1.csv(商品コード、商品名)----- 100,商品1 200,商品2 300,商品3 400,商品4 Litst2.csv(商品コード、価格)----- 100,5000 200,10000 400,20000 Litst3.csv(商品コード、商品名、価格)----- 100,商品1,5000 200,商品2,10000 300,商品3, 400,商品4,20000 Litst1.csvとLitst2.csvからLitst3.csvを作ることは出来ますか? Litst1.csvには全ての商品が載っていますが、Litst2.csvには値段の無い商品(試供品など)は載っていません。 2つとも商品コード順になっています。 今は価格改定がある度にエクセルにインポートして手作業で編集しているのですごく不便です・・・
エクセルの表ならコマンドラインでわざわざやらんでもエクセルの関数使えばいいだろ。 升目のある表だけのソフトじゃないんだからさ…
>>840 俺はコマンドライン知らんが、原始的な方法としてはlist1とlist2を結合してソートして
正規表現置換で整形してしまえばいいんじゃね
list3で管理するようにして、必要に応じてlist1やlist2を吐くようにするのが根本的な
解決だろうけど
エクセルにはこういうことに使うためにあるVLOOKUPっていう便利な関数があるんです。
844 :
840 :2012/08/28(火) 06:56:55.52 ID:8ve8hln+
本当はエクセルなんて使いたくないんです。 最終的にはcsvにしたいだけなので。 バッチコマンドでどうにかならないでしょうか?
>>843 vlookupって集計用じゃなかったっけ
list1とlist2からvlookupでlist3を作成。list3の表自体を直接修正はできないので結果を
csvで出力してから修正。修正後のデータをexcelで読み込んで、list1とlist2の形で出力
てことになるのか?
@echo off (for /f "tokens=1,2* delims=," %%I in (list1.csv) do (set /p=%%I,%%J,<nul for /f "tokens=2 delims=," %%K in ('set /p"=^%%I,"^<nul^|findstr /r /g:/ list2.csv') do set /p=%%K<nul echo;))>list3.csv
やめとけ powershellなら簡単にできるぞ(たぶん) そっちで聞け
>>846 ありがとうございます!上手くlist3.csvが作成されました。
教えて頂いたバッチは1行目以外は全く理解不能で謎の呪文にしか見えませんけど・・・(笑)
今のところ項目が増える予定はないのでこのままで問題ないです。
本当にありがとうございました。
>>845 私にはやり方の手順がうまくイメージ出来ないです。
でも今後のためにvlooupという関数については調べて見ますね。
しかしなんでわざわざよりによって最も不向きなWindowsコマンドスクリプトで こんな処理をさせなくてはならんのか。
商品名や価格にカンマが入っているとすべてが崩壊
まぞだな
UTF8のテキストファイルをShift-JISに変換して保存することは出来ますか?
powershell なら余裕だが cmd だと難しいな
難しいな
857 :
853 :2012/09/07(金) 21:44:49.77 ID:JTeClmc8
>>855 ありがとうございます。試しにメモ帳を開いて「あああいいいううう」と入力してファイル名をutf8.txt、
文字コードをUTF8として保存し、以下のスクリプトを実行しました。
set f1=utf8.txt
set f2=sjis.txt
set t=tmp.txt
start /min /wait cmd /c chcp.com 65001 ^& ^( set /p x="��"^<nul ^& cmd /u /c type %f1% ^) ^>%t%
start /min /wait cmd /c chcp.com 932 ^& cmd /c type %t% ^>%f2%
作成されたsjis.txtを開いて見ると文字コードはSJISになっているのですが、
内容が「?あああいいいううう」となって先頭に「?」がついてしまいました。
なぜなんでしょう?どなたか原因をご存知ないでしょうか?
ちなみに4行目で文字コードをUTF8からUnicodeに変換し、5行目でUnicodeからSJISに変換しています。
utf8にbomがあるんじゃねーか start /min /wait cmd /c chcp.com 65001 ^& ^( cmd /u /c type %f1% ^) ^>%t% でやってみ
859 :
857 :2012/09/08(土) 12:29:57.18 ID:zYwdbrke
>>858 ありがとうございます。bomなんて知りませんでした。(昔ゲーセンでやった「1942」というシューティングゲームが思い浮かびましたw)
つまり私が
>>857 に書いたのはbom無し用であり、bomを付加してしまっているのですね。
そしてメモ帳はUTF8で保存するとbomを付加する仕様なのでダブったbomが「?」と表示されてしまうと。
おかげでコマンドでUTF8→SJIS変換が出来るようになりました。ありがとうございます。
860 :
857 :2012/09/08(土) 16:12:45.33 ID:zYwdbrke
ちなみに5行目は type %t% >%f2% でもよいみたいです。
すみません、また質問なんですが、bomってコマンドプロンプト上からキーボードで入力できるのでしょうか?
>>857 の「set /p x="��"」の部分なんですが、キーボードでは厳しいですか?
alt+テンキー255 alt+テンキー254
バッチ中に一時ファイル用としてramdiskを作れるようなの無いですかね?
環境変数で代替しろ
環境変数で代替?どういうこっちゃ。 バッチで画像処理するツールの為の数十MBの 作成削除書き換えが頻繁な一時ファイル置き場が 欲しいわけなんだけど。
>>865 環境変数には8KB弱の文字列を入れることができるから
と書こうと思ったが数十MBか。 面白い展開だな。
/Eオプションでどこまで広げられるか、で決まるな。
ぶっちゃけディスクアクセスを減らしたい。あとフラグメント防止も兼ねて。
気持ちはわかる
一時的じゃなくて恒久的にRAMDISKを作成しておくのはダメなのか?
恒久的なのはメモリの無駄遣いなんだよなぁ…
871 :
cmd :2012/09/17(月) 22:36:52.59 ID:EwsykKiH
Windows 7 超初心者です。レジストリの設定の進み方を教えてください。 HKEY_CLASSES_ROOT\.bat\ShellNewです。
872 :
cmd :2012/09/17(月) 22:52:35.61 ID:EwsykKiH
HKEY_CLASSES_ROOTから\.bat\ShellNewに進みたいのですが、ツリーが多く長いので探せません。
思い切りスレ違いでその名前って…釣り?
そもそもこのスレ住人は、日本語かコマンドで説明してもらえないと理解できません
【環境】 OS:windows vista business SP2 64bit 上記OSに付属しているコマンドプロンプトで、以下の処理をさせたいと考えています。 【やりたい事】 複数ファイル(128文字程度の日本語ファイル名)の、サイズゼロのダミーファイルを 作成するバッチファイルを作りたいと考えています。 【詰まっている事】 以下のコマンドで、ディレクトリ配下の全ファイル名の取得とダミーファイルの作成は 出来る事まで調べられたのですが、これらをどう組み合わせればいいのかが判りま せんでした。 ディレクトリ配下のファイル名取得:dir /b サイズゼロのダミーファイルの作成:fsutil file createnew <ディレクトリパス\ファイル名> 0 パイプを使ってファイル名のデータを受け渡しをすれば良いと思うのですが(あるいは それをファイル数分ループさせる?)、コマンドラインでそれを実現する能力が今の 自分にはありませんでした。 上記につきまして、ご教示いただければ幸いです。
type nul > ファイル名
RoboCopy /CREATE
回答ありがとうございました。 手元で試したところ、robocopy /CREATE で簡易に意図通りの動作をさせる事ができました。 こちらを使用させていただきます。 五月雨な質問になって申しわけありませんが、もう一点質問させてください。 「サイズが0でないファイルのみを別ディレクトリにコピー or 移動させる方法」は 有りますでしょうか。 copyやmoveコマンドのオプションを調べてみましたが、さすがにこのような機能は 無い様で、googleセンセに問い合わせても解決できておりません。 お手数ですがよろしくおねがいいたします。 # やりたい事は、実体のあるファイルとダミーファイルが混在しているディレクトリから # 実体のあるファイルを取り出したい(≒ダミーファイルを削除したい)となります。
RoboCopy /MIN:1 /MOV
御礼が遅くなりましたが、意図したとおりの動作をするスクリプトを作れました。 ご教示ありがとうございました。
スクリプト中の処理が失敗したらそこでスクリプト自体が終了するような事って出来ます? bashで言うところのset -sのような
-e じゃね?
各行 || exit /b 各行 || goto :eof
1 3 6 7 10 って内容のテキストファイルを 1 3 6 7 10 に書き換えることって出来る?
すみません、間違えてたのでもう一度書きます。 1,AAA,あああ,111 3,BBB,いいい,222 6,CCC,ううう,333 7,DDD,えええ,444 10,EEE,おおお,555 という内容のテキストファイルを 1,AAA,あああ,111 3,BBB,いいい,222 6,CCC,ううう,333 7,DDD,えええ,444 10,EEE,おおお,555 に書き換えることは出来ますでしょうか? つまりカンマで区切られた最初の項目で番号がとんでいるところに改行を入れたいのです。
確実にデータがその形式でかつ昇順だとすれば @echo off set cnt=2 for /f "tokens=* delims=," %%I in (list.txt) do ( call :insert_lines %%I echo. %%I set /a cnt+=1 ) goto :eof :insert_lines for /l %%s in (%cnt%,1,%1) do @echo.&set /a cnt+=1 goto :eof
訂正 @echo off set cnt=2 for /f "tokens=*" %%I in (list.txt) do ( call :insert_lines %%I echo %%I set /a cnt+=1 ) goto :eof :insert_lines for /l %%s in (%cnt%,1,%1) do @echo.&set /a cnt+=1 goto :eof
889 :
886 :2012/10/02(火) 02:14:43.47 ID:O1uaudI+
>>887-888 返事が遅れてすみません。
うまくいきました。ありがとうございます!
スクリプトまで書いて頂いて申し訳ないです。
父がデジカメを趣味にしていて、撮った写真をパソコンに保存しています。 それでパソコンが壊れた時に備えて定期的にUSBメモリにバックアップしたいと頼まれました。 バックアップ対象のフォルダは決まっているので「robocopy c:\aaa g:\aaa /mir」というコマンドで出来そうなのですが、 例えばUSBメモリの挿し忘れや、USBメモリのドライブレターがずれた時などに備えて USBメモリのドライブ直下に「abcxyz.txt」などというファイルを作り、ドライブ直下にこのファイルが 存在するドライブがある場合のみそのドライブにコピーを行い、そういうドライブが無い場合は 「USBメモリが挿入されていません」とメッセージを出してバッチを終了させるようにしたいのです。 そこで「AからZまでをループさせてうんたらかんたら・・・」で出来そうだなと思ったのですが、 実現方法が全然わかりません(^^;) Forコマンドとか使えばいいんでしょうか? ちなみにUSBメモリは大容量なので容量不足の心配はありません。
すみません、追記です。 今調べたら父のパソコンは「Windows XP Home」で、robocopyコマンドが無いようです。 いきなり詰んでしまいました・・・(T_T)
>>890 そういうのは素直にGUI付きのバックアップツールを使った方が楽だと思われ。
バッチだとパス指定ミスってても気付きにくいから
いざ壊れて復元しようと思ったらバックアップできてなかった!
なんてことにもなりかねないし。
>>892 ありがとうございます。おかげでrobocopyが使えるようになりました。
一応今日丸一日費やしてなんとか自力で作ってみました。
非常に冗長ですが、一応動きましたw
(ちなみにドライブAを指定すると変な動きをしたのでAは省きました)
-------------------------------------------------------
@echo off
set drv=
if exist b:\abcxyz.txt set drv=b
if exist c:\abcxyz.txt set drv=c
if exist d:\abcxyz.txt set drv=d
if exist e:\abcxyz.txt set drv=e
if exist f:\abcxyz.txt set drv=f
if exist g:\abcxyz.txt set drv=g
if exist h:\abcxyz.txt set drv=h
if exist i:\abcxyz.txt set drv=i
if exist j:\abcxyz.txt set drv=j
if exist k:\abcxyz.txt set drv=k
if exist l:\abcxyz.txt set drv=l
if exist m:\abcxyz.txt set drv=m
if exist n:\abcxyz.txt set drv=n
if exist o:\abcxyz.txt set drv=o
if exist p:\abcxyz.txt set drv=p
続く〜
〜続き if exist q:\abcxyz.txt set drv=q if exist r:\abcxyz.txt set drv=r if exist s:\abcxyz.txt set drv=s if exist t:\abcxyz.txt set drv=t if exist u:\abcxyz.txt set drv=u if exist v:\abcxyz.txt set drv=v if exist w:\abcxyz.txt set drv=w if exist x:\abcxyz.txt set drv=x if exist y:\abcxyz.txt set drv=y if exist z:\abcxyz.txt set drv=z if not defined drv echo USBメモリが差し込まれていません。差し込んでからもう1度実行して下さい。& set /p a=& goto :eof robocopy c:\aaa %drv%:\aaa /mir echo. echo. if %errorlevel% gtr 1 echo バックアップが失敗しました。もう1度やり直して下さい。& set /p a=& goto :eof echo バックアップが完了しました。何かキーを押して下さい。& set /p a=
if文をforで回すなら for %%a in (b c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a:\abcxyz.txt set drv=%%a
そういう機能があるバックアップソフト使えよ
898 :
894 :2012/10/08(月) 11:52:03.09 ID:IznETznk
>>896 めちゃくちゃ短くなりました。ありがとうございます!
ちょっと話が逸れるけど USBメモリじゃなくてUSBマルチメモリリーダライタでSDカードを刺した場合に 同じことをやるとカードを刺してないドライブの場合にエラーのメッセージボックスが 開いてそこでbatが一時停止してしまった (Windows - ディスクがありません Exception Processing Message c0000013) そこで、カードを刺してないドライブの場合を回避出来ないかとチャレンジしてみた するとdiskpartコマンドでvolume一覧が取得できることが分かった(管理者権限が必要) (ただ、XPの場合) Volume一覧でTypeが"リムーバプ(pu)ル"になってるのはバグだな for /f "skip=9 tokens=3,4" %%a in ('echo list volume^|diskpart') do if "%%b" neq "リムーバプル" if exist %%a:\abcxyz.txt set drv=%%a
diskpart に echo で単発コマンドを渡すのはなんとなくキモイな…… diskpart は exit で終わっておきたいから、手間でも /s でスクリプトを 渡してやったほうが落ち着く 個人的な感想でスマン あと、「リムーバブル」の表示が化けるならそれはそのPCの問題 普通は化けたりしない
いや、diskpart.exeにpuで書かれてるんだよ
そういう誤字は多いな、XP
>>901 ああぁ、把握した、ブ であるべきが プ になっているってことか、
pu で化けているってことかと勘違いした、すまん
お知恵をお借りいたしたく。 OS: windows vista 64bit やりたい事: キーワードが列挙されているリストAがあります。 任意のファイルBが入力された場合、そのファイルBのファイル名とリストAのキーワードを比較して、 ファイル名にキーワードが含まれていた場合に処理Cを実行するような処理を作ろうとしています。 その処理の中の「ファイル名にキーワードが含まれているか」の判定文の書き方がわかりません。 この部分、どのようにすれば良いでしょうか? させたい処理の例: リストAの記述 hoge[aaa] hoge[bbb] hoge[CCC] ファイルBのファイル名 hoge[aaa]20120101.txt バッチ例: setlocal enabledelayedexpansion for /f "delims=" %%A in (リストA) do ( if (ファイル名にキーワードが含まれているかの判定) ( 真の処理 ) ) 上記例だと、リストAの1行目の文字列はファイルBのファイル名に含まれる為に"真の処理"が実施され、 リストAの2〜3行目の文字列はファイル名に含まれない為に何も実施されないのが、期待値となります。
ggrセンセと先達の知恵で解決できました。 ご協力ありがとうございました --- echo ファイル名 | find "リストから取ってきた文字列" > NULL IF NOT ERRORLEVEL 1 ( 真の処理 )
OS:windows7 64bit ファイル名を変数に入れ、その変数で示されるファイルのサイズが ゼロかどうかで処理を分岐させるバッチを作ろうとしていますが、 上手くいきません。 set F=z:\aaa if %~zF==0 goto SIZE_ZERO :SIZE_ZERO 〜 上記を実行すると"バッチ パラメータの置き換えで、パス演算子の 次の使用法は無効です.有効な形式については、CALL /? または FOR /? と入力してください。"と表示されますが、ヘルプを見ても具体的 にどうすべきなのかが分かりませんでした。 解決方法をご教示ください。
CALLを使うとこんな感じ set F=z:\aaa call :CHECK_ZERO %F% goto :eof :CHECK_ZERO if %~z1%==0 goto SIZE_ZERO goto :eof :SIZE_ZERO 〜 FORを使うとこんな感じ set F=z:\aaa for %%a in (%F%) do if %%~za==0 goto SIZE_ZERO
出来ました。ありがとうございます。 一度別の変数に入れなおしてから比較するのですね…
>>908 普通の環境変数には修飾子が使えないわけで...(別変数に入れなおしてもダメ)
修飾子が使えるのは、バッチパラメタとfor参照変数だけ
誤 for参照変数 正 for変数参照
912 :
名無し~3.EXE :2012/10/20(土) 22:44:27.52 ID:duQLcIVJ
一行にセミコロンがいくつかあるテキストファイルをセミコロンを改行に置き換えたい バッチファイル作ってみたがちゃんと動作しない 行途中のセミコロンが削除され、最後のセミコロンだけLFに置き換わる たすけて ====test_inpput.txt==== AAA; BBB; CCC; DDD; EEE; =====作ってみたバッチファイル============== @echo off set output=test_output.txt type nul >%output% setlocal ENABLEDELAYEDEXPANSION for /f "delims=" %%A in (test_input,txt) do ( set line=%%A echo !line:;=!LF!>>%output% ) endlocal
@if (0)==(0) echo off cscript.exe //nologo //e:jscript "%~f0" < test_inpput.txt goto :EOF @end WScript.Echo(WScript.StdIn.ReadAll().replace(/;/g,"\r\n"));
>>914 それに出力ファイル指定すればできました!
ありがとうございます(_ _)
同じ内容を書くなら、きっと俺も
>>913 のように書くな…
>>913 の何が悪いのか、ご教授頂ければ幸いです。
見てすぐわかる !line:;=!LF! これは変数の置換 !line:;=! と 文字列 LF! だから。
setlocal enableextensions enabledelayedexpansion set out=out.txt type nul>%out% set LF=^ rem 改行抜かさない事 for /f "delims=" %%i in (in.txt) do call :sub "%%~i" goto :eof :sub set line=%~1 echo %line:;=!LF!%>>%out% goto :eof
変数が展開されるし特殊文字でおかしくなる ちゃんとやると面倒
まあね。文字列扱うならバッチに拘ることはない。
丸投げですみませんがどのように記述すればよいのか教えてください。 以下のようなinput.txtをoutput.txtのように変換したいと思っています。 output.txtはエクセルで読み込む事を想定しています。 input.txtは{}で括った2段階の階層構造となっています。 ({,や},のコンマはinput.txtを作る段階で付随してしまいました) また、"見出し","値"という形式で並んでおり、 見出しのTITLE,SUBTITLE,AAA,BBB,CCC,DDDは完全に固定された文字列ですが、 値のtest1,test2,aa,dddなどは数値だったり文字列だったりします。 以下のサンプルのinput.txtファイルは2つのTITLEを持ちますが、 ファイルによってはTITLEが3つ以上ある場合もあります。 まずはTITLE〜TITELの直前まで1つのtxtファイルとして切り出してみようとして、 くじけてしまいました。。。
===input.txt========================= {, TITLE,test1 SUBTITLE,test2 {, AAA,aa BBB,bb CCC,CC }, {, DDD,ddd }, }, {, TITLE,test3 SUBTITLE,test4 {, AAA,aaaa DDD,dddd }, }, ====================================== ===output.txt====================== TITLE,SUBTITLE,AAA,BBB,CCC,DDD test1,test2,aa,bb,cc, test1,test2,,,,ddd test3,test4,aaaa,,,dddd ====================================
@if (0)==(0) echo off cscript.exe //nologo //e:jscript "%~f0" < input.txt > output.txt goto :EOF @end n=['TITLE','SUBTITLE','AAA','BBB','CCC','DDD'];v={};s=0; for (i=0;i<n.length;i++) v[n[i]]=''; WScript.Echo(n); while (!WScript.StdIn.AtEndOfLine){ line=WScript.StdIn.ReadLine().split(','); switch(line[0]){ case '{' : s++; break; case '}' : if(s--==2){ for (i=0,tmp=[];i<n.length;i++) tmp.push(v[n[i]]); WScript.Echo(tmp); for (i=2;i<n.length;i++) v[n[i]]=''}; break; default: v[line[0]]=line[1]; break; }}
スペースとか特殊文字とかがあるとダメになるけど、batコマンドだけでやるなら @echo off set index=0&set t0= for /f "tokens=1,2 delims=," %%a in (input.txt) do if "%%b" neq "" call :sub %%a %%b set t=%t1%&for /l %%a in (2,1,%index%) do call set t=%%t%%,%%t%%a%% echo %t% set nest=0&set k1=&set k2=&for /l %%a in (1,1,%index%) do set d%%a= for /f "tokens=1,2 delims=," %%a in (input.txt) do call :next %%a %%b goto :eof :sub set hit=-1&for /l %%s in (0,1,%index%) do call :sub2 %%s %1 %%t%%s%% if %hit% neq -1 set d%hit%=%2&call set k%nest%=%%k%nest%%% %hit%&goto:eof set /a index+=1 set t%index%=%1 goto :eof :sub2 if "%2"=="%3" set hit=%1 goto :eof :next if %1 equ { set /a nest+=1&set disp=on&goto :eof if %1 neq } call :sub %*&goto :eof if %disp%==off goto :next2 set d=%d1%&for /l %%c in (2,1,%index%) do call set d=%%d%%,%%d%%c%% echo %d% :next2 call :del %%k%nest%%%&set /a nest-=1&set disp=off&goto :eof :del (for %%c in (%*) do set d%%c=)&set k%nest%=&goto :eof
925 :
921 :2012/10/30(火) 00:59:08.31 ID:1w0mYBgn
>>923 >>924 お二人ともありがとうございました
>>923 WHSは理解が乏しいですが、C言語のように配列を使えるのは読み易いですね
実際に組み込んでみたところ、ほぼ思い通りの動作が実現できました
見出しの"SUBTITLE"が階層の1層目にも2層目にもあり、出力では1層目の値に2層目の値が入ってしまいました
前段階のinput.txtを出力するときに、区別つけることで回避できそうです
>>924 データ構造の情報提供不足でした
"値"にはスペースやコロン、全角文字を含むものもありました
実際に組み込んでみたところ、ループから抜け出せない&出力をどこに挿入していいかわかりませんでした
batだけでできるのはすごい魅力的です
ディスクトップみたい
>>925 修正版を作ってみた(但し、input.txtはSJISコードのファイルとする)
使える記号やSJIS漢字に制限はなし(スペース!#$&'()^<>^?_~|=%\@[]+*;:./" は大丈夫)
各層ごとに項目チェックするようにした
(1層目と2層目の両方に同じTITLEがあっても別物として取り扱う)
bat中に出力ファイル名を記述するようにした
なお参考までに、あるbatの標準出力(画面表示)をファイルに書き出すには
test.bat>output.txt
のようにしてファイルにリダイレクトすればよい
仕様が不明だけど、
1層目の項目データに抜けがあった場合、当ブロックだけの項目とし前のブロックの項目は引き継がない
1層目だけで2層目が無い場合もデータは出力する
もし万一2層目のデータ中にカンマが存在したらカンマは削除する(例 10,000 → 10000)
なお、3層目以降があっても構わないが、変数(k3,n3,k4,n4等)を初期化してないので同じ環境上2度目以降の実行は動作保証されない
@echo off set INPUT_FILE="input.txt" set OUTPUT_FILE="output.txt" set INPUT_TMP=tmp_in.tmp set OUTPUT_TMP=tmp_out.tmp (for /f "usebackq tokens=*" %%a in (%INPUT_FILE%) do set data=%%a&call :conv)>%INPUT_TMP% call :main %INPUT_TMP%>%OUTPUT_TMP% (for /f "usebackq tokens=*" %%a in (%OUTPUT_TMP%) do set data=%%a&call :reconv)>%OUTPUT_FILE% del %INPUT_TMP% %OUTPUT_TMP% goto :eof :conv set data="%data:"=鳬”%" set data=%data:^=鳬^% set data=%data:&=鳬&% set data=%data:|=鳬|% set data=%data:<=鳬<% set data=%data:>=鳬>% call :conv_ex echo %data:"=% goto :eof :conv_ex rem もしデータ中に","があったら削除する for /f "tokens=1* delims=," %%a in (%data%) do set data1=%%a&set data2=%%b if defined data2 set data2=%data2:,=% set data=%data1%,%data2% goto :eof
:reconv set data="%data:鳬<=^<%" set data=%data:鳬>=^>% set data=%data:鳬|=^|% set data=%data:鳬&=^&% set data=%data:鳬^=^^% set data=%data:鳬”="% echo %data:~1,-1% goto :eof :main set index=0&set nest=0&set nest_max=0&set t0=++dummy++&set k1=&set k2=&set n1=&set n2= for /f "usebackq tokens=1* delims=," %%a in (%*) do set data1=%%a&set data2=%%b&call :sub set t=&for /l %%a in (1,1,%nest_max%) do call :sub_make_title %%a echo %t:~1% set nest=0&set k0=&for /l %%a in (1,1,%index%) do set d%%a= for /f "usebackq tokens=1* delims=," %%a in (%*) do set data1=%%a&set data2=%%b&call :next goto :eof :sub_make_title call set forlist=%%n%1%% for %%b in (%forlist%) do call set t=%%t%%,%%t%%b%% goto :eof
:sub if "%data1%" == "{" set /a nest+=1&goto :eof if "%data1%" == "}" set /a nest-=1&goto :eof if %nest% gtr %nest_max% set nest_max=%nest% set hit=-1 call set forlist=%%n%nest%%% for %%s in (%forlist%) do call :sub2 %%s "%%t%%s%%" if %hit% neq -1 set d%hit%=%data2%&call set k%nest%=%%k%nest%%% %hit%&goto:eof set /a index+=1 set t%index%=%data1% call set n%nest%=%%n%nest%%% %index% goto :eof :sub2 if "%data1%" equ %2 set hit=%1 goto :eof :next if "%data1%" equ "{" set /a nest+=1&set disp=on&goto :eof if "%data1%" neq "}" call :sub&goto :eof if %disp%==off goto :next2 set data=%d1%&for /l %%c in (2,1,%index%) do call set data=%%data%%,%%d%%c%% echo %data% :next2 call :del %%k%nest%%%&set /a nest-=1&set disp=off goto :eof :del (for %%c in (%*) do set d%%c=)&set k%nest%= goto :eof
バッチでやるもんじゃない
バッチで無理するとばっちい
馬鹿なこと言ってんなよ こっちにとばっちりくるだろ
正論だな
ん? そか! 力作のバッチを褒めて欲しかったのか? 褒めてやろうか? ご苦労。 お疲れ。
10行以上のバッチは見る気がしないな
私はすごいと思ってます。
なにがすごいんだ? どうせ碌でもないものしかできないのにか?
>>940 自分の実力でモノを量るクセは直した方がいいぞ
何それ自戒?
ここで貶してる奴って嫉妬?
wshで作れば完全なものが何分の一かの行数でできるわ
ココはツールの優劣を語るスレではないという認識だけど?
>>944 それってほとんど無意味な貶しに見えるね
ここはBATメインなスレなんだからBATでも出来るって所に意味を見出すべきだろう
それより、その程度の理由で文句つけてたなんて驚きだ もっとちゃんとした理由でもあるのかと思ってた 例えば、こうやればもっとスマートにできるのに不細工だなあ程度の理由はあると思ってたよ
948 :
名無し~3.EXE :2012/11/08(木) 18:53:23.35 ID:bkdEOyUb
質問させてください。OSはXPです ラムディスクをzドライブにしております スタートアップでアプリを起動する最後にスクリプトやバッチなどで G:\FREESOFT\X-Iron_22.0.1250.0_rev10のフォルダをZのルートにコピーし それが完了したらイロンを起動するというものがほしいのですが こちらで作成お願いしても良いのでしょうか? もし可能でしたらよろしくお願い申し上げます。
作成代行じゃねーんだ少しは勉強しろ
ムロンだめ
なるほど異論は許さぬと
面白い「質問」がきたなあw
あいやーん
>>952 > もし可能でしたらよろしくお願い申し上げます。
これが質問なんだろう。 答えはNoだ!
質問はこっちだろ? >こちらで作成お願いしても良いのでしょうか?
スマホでカーネルパニック発生して起動しなくなった・・・ セーフモードでコマンドラインとかも無いし、不便やね。
robocopyコマンドのログ出しと画面表示を両方させる /TEEっていうスイッチ いったいどういう略称なんでしょうか 気になってしょうがないです
大昔からUNIXのコマンドにteeというものがあり、そこから来てる DOSにもこの機能が要望する人は多かったので、unixライクな拡張コマンドにも入っていた teeとは、Tの字のこと(あまりにもそのままだけど) Tの字のように、1つの流れを2つに分岐させることから、teeというコマンドが生まれた Tの字、T字管、T継手 T字路のこともT-junctionと言う
>>958 ありがとうございます、すっきりしました!
素で「へぇ〜」っていったの久しぶりですwww
ファイル内の文字列は置換ってどうやんの? sed的なコマンドはないの
無い。 ていうか文字列をそのまま扱うコマンドが無いね。 ダメ文字がありすぎる。
powershellコマンドがあるよ
のっとりってどうやんの? 直でくれや
@echo このPCは、のっとられました。
それは、さすがに JP1 に失礼だよ (w
ついったでは大絶賛されてるね
>>965 コマンドラインを使わず、GUIでぽいぽい出来るから便利だよ
バッチでファイル一括処理する時は、 ちょっとしたアホなミスで大切なファイルが全て消滅って危険性と隣り合わせだけど そのツールならそういう危険性は無いのかな?
if exist ("%ProgramFiles(x86)%\Windows Resource Kits\Tools\sleep.exe"|%CD%\sleep.exe) goto ROBOCOPY else goto ERROR if existで「〜または…にsleep.exeが存在する場合」ってどう書くんでしょうか これだと【|】の使い方が誤っています、とエラー 【OR】もだめでした
無い事菊名
and も or も概念が存在しない
AND if if OR if if
パスが通ってるなら sleep /? 1>nul 2>&1 if not errorlevel 1 なにか ところでリソースキットの sleep って 「/? 」、それとも 「--hekp」 ?
hekp ってw ずれたw
「神様ヘクプ!」
論理をひっくり返して if not exist A if not exist B goto skipped echo どっちかはあるよ〜 :skipped が素直かね
980 :
979 :2012/12/11(火) 13:54:55.42 ID:PWqhlQxJ
あ
い
う
次スレは?
985 :
972 :2012/12/11(火) 21:47:44.17 ID:AbjQndC8
>>973-979 返答ありがとうございます
robocopyのミラーリングである程度のミス防止になると思い
存在すればsleepで30秒待たせて警告文をゆっくり読ませてrobocopy
という処理をしたいと思ってました
ただ、自分自身にpingを30回打つやりかたのほうが
インストールされてるかの確認も要らないようなので
そちらにすることにしました
ちなみにVista以降なら標準でtimeoutコマンドがあってsleep代わりに使える
うめ
ウメ
うに
990
梅
うめ
次スレは?
うめ
うめ
梅
埋め
梅干し
fin.
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。