bat的執行





頁 : 1 2 [3] 4 5

vvcvc
2011-01-24, 10:17 AM
if /I %th% GEQ 24 set /A th=%th%-24 && goto check1
可否詳細說明

我現在有個需求是
當目前的時間是早上10點前
在command模式下輸入echo %time%得到的時是個位數
我想要在前方自動補一個0
但若小時已經是十位數...就不補0
我該怎麼在批次檔裡下判斷
讓他判斷完之後自動跑我需要的程式碼

我的程式碼如下(想要使用批次檔自動export registry裡的資料)
判斷式不知該怎麼寫及加在那裡

@ECHO OFF
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%0%TIME:~1,1%%TIME:~3,2%%TIME:~6,2%.reg

reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.reg




FYI
2011-01-24, 05:23 PM
當目前的時間是早上10點前
在command模式下輸入echo %time%得到的時是個位數
我想要在前方自動補一個0
但若小時已經是十位數...就不補0
FOR /F "tokens=1* delims=:" %%i IN ('ECHO %time%') DO SET t=%%i:%%j && FOR /L %%n IN (0,1,9) DO IF %%i.==%%n. SET t=0%%i:%%j
ECHO %t%
nircmd.exe cmdwait
nircmd.exe waitprocess (http://www.nirsoft.net/utils/nircmd.html)

bx2aa
2011-01-24, 07:17 PM
if /I %th% GEQ 24 set /A th=%th%-24 && goto check1
可否詳細說明

我現在有個需求是
當目前的時間是早上10點前
在command模式下輸入echo %time%得到的時是個位數
我想要在前方自動補一個0
但若小時已經是十位數...就不補0
我該怎麼在批次檔裡下判斷
讓他判斷完之後自動跑我需要的程式碼

我的程式碼如下(想要使用批次檔自動export registry裡的資料)
判斷式不知該怎麼寫及加在那裡

@ECHO OFF
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%0%TIME:~1,1%%TIME:~3,2%%TIME:~6,2%.reg

reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.reg


去年底剛好寫了兩個自動下載衛星雲圖(中央氣象局和日本衛星雲圖)有考慮到
if %before2% leq 9 set before2=0%before2%

test.bat
setlocal EnableDelayedExpansion
set th=25
if /I %th% GEQ 24 set /A th=%th%-24 && if !th! leq 9 set th=0!th!
echo %th%
goto

vvcvc
2011-01-24, 11:28 PM
糟糕2個回答都沒看懂
更慘的是直接套用也不知要放在那裡才行

為什麼要設定th=25
這樣比較一定會大於24
所以接下來一定會做25-24的動作
那th不就固定是1
和9做比較後被設定成01
回傳%th%也就是回傳01
接著goto那裡?
我的理解應該是錯了
因為SET /A這個我完全不知是什麼意思
可否解釋這個算式?

vvcvc
2011-01-24, 11:44 PM
我好像用了很簡單的語法解決自己的問題了
不知這方法會不會有什麼問題...也不知道這樣的語法是不是很蠢

@ECHO OFF
if /I %time:~0,2% GEQ 10 goto double else single
:single
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%0%TIME:~1,1%%TIME:~3,2%%TIME:~6,2%.reg
:double
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.reg

bx2aa
2011-01-25, 02:20 AM
我好像用了很簡單的語法解決自己的問題了
不知這方法會不會有什麼問題...也不知道這樣的語法是不是很蠢

@ECHO OFF
if /I %time:~0,2% GEQ 10 goto double else single
:single
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%0%TIME:~1,1%%TIME:~3,2%%TIME:~6,2%.reg
:double
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.reg

@echo off
cls
set time=10:16:40.40
set /a th=%time:~0,2%
if %th% leq 9 set th=0%th%
rem reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%th%%TIME:~3,2%%TIME:~6,2%.reg

echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%th%%TIME:~3,2%%TIME:~6,2%.reg

set time= 2:16:40.40
set /a th=%time:~0,2%
if %th% leq 9 set th=0%th%
echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%th%%TIME:~3,2%%TIME:~6,2%.reg
pause

FYI
2011-01-25, 03:19 AM
@ECHO OFF
if /I %time:~0,2% GEQ 10 goto double else single
:single
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%0%TIME:~1,1%%TIME:~3,2%%TIME:~6,2%.reg
:double
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.reg
好方法! 但是只有一個小小小問題在於三個DATE & TIME 指令所回報的時間有百萬分之一的機率不一致, 例如0:59:59.99 -> 1:00:00.00, 所以最好先儲存於環境變數再處理, 例如:
@ECHO OFF
FOR /F "tokens=1-3,5-7 delims=/:. " %%i IN ('ECHO %DATE% %TIME%') DO IF /I %%l GEQ 10 (SET t=%%i%%j%%k%%l%%m%%n) ELSE (SET t=%%i%%j%%k0%%l%%m%%n)
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%t%.reg
然而除非透過其他單一指令取得時間, 否則DATE & TIME 並非同時執行, 所以理論上還是會有千萬分之一的機率導致日期比實際晚一天, 例如23:59:59.99 -> 0:00:00.00

vvcvc
2011-01-25, 11:27 AM
這個程式碼看起來比我的好太多了
而且把我沒想到的問題都解決
感謝FYI的回覆

我如果想再加入一個功能
就是備份檔案控制在500個以內
今天查del指令的用法(說明滿簡單的)
del /Q filename
當檔案數達到500個時我想刪除一個最舊的檔案後再重新建立新備份檔
該怎麼讓程式自己去比較並刪除?

bx2aa
2011-01-25, 01:04 PM
好方法! 但是只有一個小小小問題在於三個DATE & TIME 指令所回報的時間有百萬分之一的機率不一致, 例如0:59:59.99 -> 1:00:00.00, 所以最好先儲存於環境變數再處理, 例如:
@ECHO OFF
FOR /F "tokens=1-3,5-7 delims=/:. " %%i IN ('ECHO %DATE% %TIME%') DO IF /I %%l GEQ 10 (SET t=%%i%%j%%k%%l%%m%%n) ELSE (SET t=%%i%%j%%k0%%l%%m%%n)
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%t%.reg
然而除非透過其他單一指令取得時間, 否則DATE & TIME 並非同時執行, 所以理論上還是會有千萬分之一的機率導致日期比實際晚一天, 例如23:59:59.99 -> 0:00:00.00

您上面說的 "有千萬分之一的機率導致日期比實際晚一天"
不管是 ECHO %DATE% %TIME% 或是 ECHO %TIME% %DATE% 我感覺一樣存在日期時間不一致, 要用同一個 ctime 1970 年1月1日開始的數字才不會有這個問題.

datetime.cs
----------------------------------------------------
using System;

class Datetime
{
static void Main()
{
DateTime dt = DateTime.Now;
Console.WriteLine(string.Format("{0:yyyyMMddHHmmss}",dt));
///Console.WriteLine(string.Format("{0:yyyyMMddHHmmssffff}",dt));

}
}
----------------------------------------------------

C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe csc datetime.cs
20110125131621

for /F %i in ('datetime.exe') do echo %i
20110125132351

for /F %%i in ('datetime.exe') do reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%%i.reg
for /F %%i in ('datetime.exe') do reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run D:\help\%%i.reg

FYI
2011-01-25, 07:23 PM
當檔案數達到500個時我想刪除一個最舊的檔案後再重新建立新備份檔
FOR /F "skip=500 tokens=1" %%i IN ('DIR /B /O-N 20????????????.reg') DO IF NOT "%%i"=="" DEL "%%i"
其實取得時間的另一個方法則是從檔案資訊, 也就是先建立檔案, 再取得檔案建立的時間, 然後重新命名, 不過DIR 無法看見秒數, 否則此法應該最方便且準確, 然而免費工具也是很多, 例如以下:
Freeware Windows command-line, (DOS style), utilities (http://www.jfitz.com/dos/index.html#DOFF) - DOFF - Print Date/Time With Offset
Print time and date from command line | Windows Command Line Tips (http://www.windows-commandline.com/2010/05/print-time-and-date-from-command-line.html) - NOW.EXE
Batch Function Library for Windows NT4/2000/XP/2003 (http://www.commandline.co.uk/lib/treeview/index.php)