【.cmd】 バッチファイルスクリプト %7 【.bat】 set x=%~1 という処理で %1がaaa&bbbだった場合 set x=aaa bbb というふうに&で分かれてしまいます xに%1の値をセットするにはどう書けばいいんですか。 set x="%~1" だとxに""が入ってしまいます。
set "x=%~1"
>set x=%~1 >という処理で >%1がaaa&bbbだった場合 >set x=aaa >bbb >というふうに&で分かれてしまいます どのバージョン?
そんなバージョンないわ
for変数だとならんがcall変数だとなるよ
んじゃ for %%1 in (%1) do set x=%%~1 でいいよ
call set x=%%~1
1日1個出来るファイル(yyyymmdd.log)を、60日たったものから削除するバッチを作ることになりました。 タスクで毎日起動させて削除したいのですが、ヒントはいただけないでしょうか?
dir/? for/? del で十分だろ
まず日本語文法を勉強して下さい。
>>960-961 レスありがとうございます。
何分バッチ作成初体験なので戸惑っております。
とりあえず
dir *.log /o-d
でファイルを表示させるところまではわかったのですが、
その後のfor文とdel文の書き方がよくわかりません……。
ソーランソーラン
すなおにPowerShellつかうのがよさそうだけど… dir /b /o-d *.log > temp.$$$ for /f "skip=30" %%i in (temp.$$$) do del %%i del temp.$$$ バッチファイルはこんな感じか。 このサンプルだとログのおいてるフォルダにバッチファイルが あることになってるけど、そこは適宜置き換えて。
おれがいつも使ってるヤツ↓ for /f "skip=30" %%i in ('dir /o-d /b *.log') do del %%i
unixのshellのバッククォートみたいな事できるんだな、初めて知った。 helpにちゃんと載ってたけどw
unixのshellのバッククォートみたいな事 for /f "usebackq skip=30" %%i in (`dir /o-d /b *.log`) do del %%i
みなさんレスありがとうございました。
>>968 とほぼ同じ感じで提出したところ、
「やっぱ日付を取得して30日前以前のを削除するようにして」
と言われたので今度は日付の取得にチャレンジしたいと思います。
動作的には変わらないはずなのに何なんだ_| ̄|○
1日にログが2個以上できてたら、だめじゃん。(←何なんだ)
60日前以前は、ほんとの日付けか、それともファイル名の日付か悩みどころ>仕様< なので、とりあえず、ファイル名は必ずファイルの日付と合ってると仮定しよう。 しかしそれでも、YYYYMMDD.txtは file1_YYYYMMDD.txt とか YYYYMMDDhhmmss.txt に変わってくる。
ガチでやるなら ・今日の日付とファイルのタイムスタンプを文字列で取得 ・文字列を切り貼りしset /aを駆使して0000(2000?)年1月1日からの経過日数を算出(当然閏年も考慮) ・引き算して30以上なら削除 なんだろうけどあまりにもだるすぎるな。バッチで日付操作は鬼門。 PowerShellとは言わないまでもせめて判定部分にVBS使えないのか。 >today = Now >d = DateSerial(Year(today), Month(today), Day(today)-30) forfiles使用可なら一発なんだけどそれも無理なんだろうな > forfiles /P "E:\logs" /M *.log /C "cmd /c if @isdir==FALSE del /s @path" /D -30
俺もVBSを使うほうが無難だと思う。
959はバッチファイルじゃなきゃいけないんだろうか? 日付計算プログラムを作ってそれを使うとか。 例のブランコの絵が思い浮かぶな…。
VBSでmain(){return 200;}とか出来るのか? >>日付計算プログラムを作ってそれを使うとか -- vbs1.vbs -- Set objfs = CreateObject("Scripting.FileSystemObject") Set objfolder = objfs.GetFolder("work") str1 = objfolder.Path & vbCR datetmp = DateAdd("h", -2, Date & " 16:49:00") str1 = str1 & datetmp & vbCR MsgBox(str1) For Each objfile In objfolder.Files datetmp1 = DateDiff("s", datetmp, objfile.DateCreated) If datetmp1 <= 53 Then str1 = objfile.DateCreated & " " & datetmp1 & " " & objfile.Name & vbCR res = MsgBox(str1, 1) If res = 2 Then ' = Cancel ? Exit For End If 'objfs.DeleteFile objfile End If Next 'MsgBox(str1)
batにA.txtドロップ @ren A.txt B.txt B C Dren C.txt A.txt E このようにしたいのですが Dでどう打てばC.txtをA.txtにリネームできるでしょうか? ちなみにAの名前には半角スペースや()-色々入る可能性があります。 bat初心者で恐縮ですが、どうかアドバイスのほどよろしくお願いします。
すいません、修正です。今@は↓にしています。 ren *.txt B.txt
>>980 作成したいファイル名がAではなくて
ドロップしたファイル名を総称してAのつもりで書きました。
Aの名前はドロップしたファイルによって様々です。
これを1ファイル毎にbatで書きなおすのは大変です。
なので質問をさせて頂きました。よろしくお願いします。
set fname="%~nx1" ren %fname% B.txt ren C.txt %fname%
@ren %1 B.txt B C Dren C.txt "%~nx1" E
凄い!
>>983 これも試した事あったんですがDをまた%1だけ書いて失敗してました。
ありがとうございます、勉強になります。
もしよかったらもう1つ伺いたいのですが
このbatと編集したいtxtファイル全てが同一フォルダにあったとして
batを押したら全てのtxtが、@〜Eを1ファイルづつ処理するように
組むにはどう書けばよいでしょうか?
Aが無いのには誰も突っ込まないのか
for %%a in (*.txt) do ( set fname="%%a" @〜E )
setlocal enabledelayedexpansion
>>987 Aは書き忘れました。実際には他のプログラム、exeが入ります。
ごめんなさいです。
>>988 ありがとうございます!ちょっとまだ成功はしてないですが
@〜Eを1ファイルづつやってくれてるみたいでこの構文でいけそうです!
forについても%%変数名やDOの展開が分からなかったのでまた勉強になりました。
この度は本当にありがとうございました。
使わんでもいいもの使うからだろ for %%I in (*.txt) do ( @ren %%I B.txt B C Dren C.txt "%%~nxI" E )
あと数回トラブルだろな
>>982 と
>>988 >>983 と
>>988 そして
>>991 全部やってみたのですが、全てB.txtが存在せず
コマンドの構文が違ってると出てしまいました。
それはつまり@のA→B.txtから出来ていないという事でしょうか・・・
for %%I in (*.txt) do (
ren %%I B.txt
プログラムのパス(B.txtからC.txtを新たに生成するもの)
del B.txt
ren C.txt "%%~nxI"
)
pause
これなら
>>991 さんがいう使わんでもいいものを使ってない?
かもしれないので出来ると思ったんですが難しい・・・
何度もしつこくて恐縮なんですが
どうかヒントだけでも教えてもらえないでしょうか?
何度もすいません
ファイル名に空白があるとか @ren "%%~I" B.txt
うおおおおおおおおおおおおおおおおおおおできたあああああああああああああああああああああああああああ
>>994 はい、あります!ありがとうございます!
けど何で
>>993 の1行目と2行目は複数処理になって急に出来なかったんだ…
ちょっと削りながら試してみます。
皆様どうもありがとうございました!!
996 :
995 :2011/09/12(月) 23:29:51.47
ドロップのときはドロップハンドラが空白があると""を付けてくれるが、 forのときは、空白があっても""を付けてくれない 仮令for in ("*.txt")とやっても駄目
う
んこ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。