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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2011/08/30(火) 22:52:22.14
set x=%~1
という処理で
%1がaaa&bbbだった場合
set x=aaa
bbb
というふうに&で分かれてしまいます
xに%1の値をセットするにはどう書けばいいんですか。
set x="%~1"
だとxに""が入ってしまいます。
953デフォルトの名無しさん:2011/08/31(水) 00:52:50.58
set "x=%~1"
954デフォルトの名無しさん:2011/09/02(金) 01:29:12.63
>set x=%~1
>という処理で
>%1がaaa&bbbだった場合
>set x=aaa
>bbb
>というふうに&で分かれてしまいます

どのバージョン?
955デフォルトの名無しさん:2011/09/02(金) 14:47:58.67
そんなバージョンないわ
956デフォルトの名無しさん:2011/09/02(金) 14:56:41.04
for変数だとならんがcall変数だとなるよ
957デフォルトの名無しさん:2011/09/03(土) 20:31:44.88
んじゃ

for %%1 in (%1) do set x=%%~1

でいいよ
958デフォルトの名無しさん:2011/09/03(土) 23:22:01.15
call set x=%%~1
959デフォルトの名無しさん:2011/09/04(日) 14:01:11.63
1日1個出来るファイル(yyyymmdd.log)を、60日たったものから削除するバッチを作ることになりました。
タスクで毎日起動させて削除したいのですが、ヒントはいただけないでしょうか?
960デフォルトの名無しさん:2011/09/04(日) 14:09:51.27
dir/?
for/?
del
で十分だろ
961デフォルトの名無しさん:2011/09/04(日) 14:19:23.04
とりあえずこんなの見つけたけど、
ttp://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html
計算なんてやってられんから、

ファイルが毎日できるのが確実なら、
yyyymmdd.logを新しいもの順にソートして
上から60個以降を削除、というアプローチはどうだろうか。
dir /b /o-dとかをテンポラリファイルに書いて、
for でskip=60とかやってテンポラリファイルの60行以降をdelとか。
962デフォルトの名無しさん:2011/09/05(月) 02:16:10.25
まず日本語文法を勉強して下さい。
963デフォルトの名無しさん:2011/09/05(月) 07:07:04.09
>>962
墓穴を掘るだけだぞ
964デフォルトの名無しさん:2011/09/05(月) 08:44:52.12
>>960-961
レスありがとうございます。
何分バッチ作成初体験なので戸惑っております。

とりあえず
dir *.log /o-d
でファイルを表示させるところまではわかったのですが、
その後のfor文とdel文の書き方がよくわかりません……。
965デフォルトの名無しさん:2011/09/05(月) 08:46:26.23
ソーランソーラン
966デフォルトの名無しさん:2011/09/05(月) 08:47:27.50
「特定のフォルダの中から半年以上更新されていないファイルを探し出して、該当するファイルを削除する」
http://www.atmarkit.co.jp/fwin2k/operation/psh01/psh01_01.html

Get-ChildItem | Where-Object {$_.LastWriteTime -lt (Get-Date).AddMonths(-6)} | ForEach-Object {$_.Delete()}
 
967デフォルトの名無しさん:2011/09/05(月) 11:10:46.88
すなおにPowerShellつかうのがよさそうだけど…

dir /b /o-d *.log > temp.$$$
for /f "skip=30" %%i in (temp.$$$) do del %%i
del temp.$$$

バッチファイルはこんな感じか。
このサンプルだとログのおいてるフォルダにバッチファイルが
あることになってるけど、そこは適宜置き換えて。
968デフォルトの名無しさん:2011/09/05(月) 11:52:20.52
おれがいつも使ってるヤツ↓
for /f "skip=30" %%i in ('dir /o-d /b *.log') do del %%i
969デフォルトの名無しさん:2011/09/05(月) 12:23:40.75
unixのshellのバッククォートみたいな事できるんだな、初めて知った。
helpにちゃんと載ってたけどw
970デフォルトの名無しさん:2011/09/05(月) 19:20:57.94
unixのshellのバッククォートみたいな事
for /f "usebackq skip=30" %%i in (`dir /o-d /b *.log`) do del %%i
971デフォルトの名無しさん:2011/09/06(火) 02:28:07.48
みなさんレスありがとうございました。
>>968とほぼ同じ感じで提出したところ、
「やっぱ日付を取得して30日前以前のを削除するようにして」
と言われたので今度は日付の取得にチャレンジしたいと思います。
動作的には変わらないはずなのに何なんだ_| ̄|○
972 忍法帖【Lv=9,xxxP】 ◆IFQSknf/N. :2011/09/06(火) 05:38:35.19
1日にログが2個以上できてたら、だめじゃん。(←何なんだ)
973 忍法帖【Lv=9,xxxP】 ◆IFQSknf/N. :2011/09/06(火) 06:32:02.93
60日前以前は、ほんとの日付けか、それともファイル名の日付か悩みどころ>仕様<
なので、とりあえず、ファイル名は必ずファイルの日付と合ってると仮定しよう。
しかしそれでも、YYYYMMDD.txtは file1_YYYYMMDD.txt とか YYYYMMDDhhmmss.txt に変わってくる。
974デフォルトの名無しさん:2011/09/06(火) 06:59:44.74
ガチでやるなら
・今日の日付とファイルのタイムスタンプを文字列で取得
・文字列を切り貼りし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
975デフォルトの名無しさん:2011/09/06(火) 14:48:02.44
俺もVBSを使うほうが無難だと思う。
976デフォルトの名無しさん:2011/09/06(火) 15:33:05.72
959はバッチファイルじゃなきゃいけないんだろうか?
日付計算プログラムを作ってそれを使うとか。

例のブランコの絵が思い浮かぶな…。
977 忍法帖【Lv=10,xxxPT】 ◆IFQSknf/N. :2011/09/06(火) 16:31:09.51
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)
978デフォルトの名無しさん:2011/09/12(月) 20:08:55.72
batにA.txtドロップ
@ren A.txt B.txt
B
C
Dren C.txt A.txt
E

このようにしたいのですが
Dでどう打てばC.txtをA.txtにリネームできるでしょうか?
ちなみにAの名前には半角スペースや()-色々入る可能性があります。
bat初心者で恐縮ですが、どうかアドバイスのほどよろしくお願いします。
979デフォルトの名無しさん:2011/09/12(月) 20:11:44.29
すいません、修正です。今@は↓にしています。
ren *.txt B.txt
980デフォルトの名無しさん:2011/09/12(月) 20:47:24.78
>>978
ren C.txt A.txt
>>979
ren *.txt A.txt
981デフォルトの名無しさん:2011/09/12(月) 20:52:44.27
>>980
作成したいファイル名がAではなくて
ドロップしたファイル名を総称してAのつもりで書きました。
Aの名前はドロップしたファイルによって様々です。

これを1ファイル毎にbatで書きなおすのは大変です。
なので質問をさせて頂きました。よろしくお願いします。
982デフォルトの名無しさん:2011/09/12(月) 20:53:58.19
set fname="%~nx1"
ren %fname% B.txt
ren C.txt %fname%
983デフォルトの名無しさん:2011/09/12(月) 20:55:59.49
@ren %1 B.txt
B
C
Dren C.txt "%~nx1"
E
984デフォルトの名無しさん:2011/09/12(月) 21:00:51.65
>>982
ありがとうございます!できました!
985デフォルトの名無しさん:2011/09/12(月) 21:07:23.92
凄い!
986デフォルトの名無しさん:2011/09/12(月) 21:08:10.70
>>983
これも試した事あったんですがDをまた%1だけ書いて失敗してました。
ありがとうございます、勉強になります。


もしよかったらもう1つ伺いたいのですが
このbatと編集したいtxtファイル全てが同一フォルダにあったとして
batを押したら全てのtxtが、@〜Eを1ファイルづつ処理するように
組むにはどう書けばよいでしょうか?
987デフォルトの名無しさん:2011/09/12(月) 21:24:44.64
Aが無いのには誰も突っ込まないのか
988デフォルトの名無しさん:2011/09/12(月) 21:31:48.53
for %%a in (*.txt) do (
set fname="%%a"
@〜E
)
989デフォルトの名無しさん:2011/09/12(月) 21:35:05.32
setlocal enabledelayedexpansion
990デフォルトの名無しさん:2011/09/12(月) 21:55:47.15
>>987
Aは書き忘れました。実際には他のプログラム、exeが入ります。
ごめんなさいです。

>>988
ありがとうございます!ちょっとまだ成功はしてないですが
@〜Eを1ファイルづつやってくれてるみたいでこの構文でいけそうです!
forについても%%変数名やDOの展開が分からなかったのでまた勉強になりました。

この度は本当にありがとうございました。
991デフォルトの名無しさん:2011/09/12(月) 21:58:47.00
使わんでもいいもの使うからだろ
for %%I in (*.txt) do (
@ren %%I B.txt
B
C
Dren C.txt "%%~nxI"
E
)
992デフォルトの名無しさん:2011/09/12(月) 22:00:35.43
あと数回トラブルだろな
993デフォルトの名無しさん:2011/09/12(月) 22:55:29.31
>>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さんがいう使わんでもいいものを使ってない?
かもしれないので出来ると思ったんですが難しい・・・

何度もしつこくて恐縮なんですが
どうかヒントだけでも教えてもらえないでしょうか?
何度もすいません
994デフォルトの名無しさん:2011/09/12(月) 23:00:34.36
ファイル名に空白があるとか

@ren "%%~I" B.txt
995デフォルトの名無しさん:2011/09/12(月) 23:12:33.79
うおおおおおおおおおおおおおおおおおおおできたあああああああああああああああああああああああああああ

>>994
はい、あります!ありがとうございます!
けど何で>>993の1行目と2行目は複数処理になって急に出来なかったんだ…
ちょっと削りながら試してみます。

皆様どうもありがとうございました!!
996995:2011/09/12(月) 23:29:51.47
特に変更なければ>>1のテンプレで次スレ立てちゃうけど良いですか?

拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

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

【.cmd】 バッチファイルスクリプト %6 【.bat】
http://hibari.2ch.net/test/read.cgi/tech/1277465356/
【.cmd】 バッチファイルスクリプト %5 【.bat】
http://pc12.2ch.net/test/read.cgi/tech/1242268171/
【.cmd】 バッチファイルスクリプト %4 【.bat】
http://pc12.2ch.net/test/read.cgi/tech/1229955189/
【.cmd】 バッチファイルスクリプト %3 【.bat】
http://pc11.2ch.net/test/read.cgi/tech/1217860043/
【.cmd】 バッチファイルスクリプト %2 【.bat】
http://pc12.2ch.net/test/read.cgi/tech/1197881068/
【.cmd】 バッチファイルスクリプト %1 【.bat】
http://pc11.2ch.net/test/read.cgi/tech/1178281991/
997デフォルトの名無しさん:2011/09/13(火) 00:56:25.24
>>996
よろしく
998デフォルトの名無しさん:2011/09/13(火) 02:08:16.90
ドロップのときはドロップハンドラが空白があると""を付けてくれるが、
forのときは、空白があっても""を付けてくれない
仮令for in ("*.txt")とやっても駄目
999デフォルトの名無しさん:2011/09/13(火) 03:20:03.62
1000デフォルトの名無しさん:2011/09/13(火) 04:03:56.41
んこ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。