2016-04-20 7 views
2

から日付のリスト以下のコードを考えてみてください:バッチ与え用/ Lパラメータ

@echo off 
setlocal enabledelayedexpansion 

FOR /L %%G IN (0,1,19) DO (
set /a "Dday=%_day%+%%G" 

if %mth% equ sml (
    if !Dday! gtr 30 (
     set "_day=1" 
     set /a "_month+=1"   
    ) 
    if !_month! gtr 12 (
     set "_month=1" 
     set /a "_year+=1" 
    ) 

) else (
    if %mth% equ big (
     if !Dday! gtr 31 (
      set "_day=1" 
      set /a "_month+=1" 
     ) 
     if !_month! gtr 12 (
      set "_month=1" 
      set /a "_year+=1" 
     ) 
    ) 
) 

echo !Dday!/!_month!/!_year!.txt 
) 

は次の日付考えてみましょう:20/04/2016

_day = 20を。 _month = 04; _year = 2016; mth=sml;

と私の出力はこれです:

それは私が間違って何をしたか、私は知ることができ、これを1に変更するのではなく、30から毎日増加

enter image description here

?お知らせ下さい。ありがとう

+2

'%_day%'は '!_day! 'にする必要があります – SomethingDark

+0

ありがとう、私の最初の問題を解決しました。 – NewbieCoder

答えて

3

このスクリプトには2つの問題があります。まず@SomethignDarkが指摘したように、%_day%の代わりに!_day!を使用する必要があります。

セカンドDdayが30以上である、%%Gだからあなたは純粋なバッチがあり、あなたが知っている

... 
FOR /L %%G IN (0,1,19) DO (

set /a "Dday=!_day!+%%G" 

if !_day! equ 1 set /a "Dday=!_day!+%%G-12" 
... 
+0

ありがとうございます! SomethingDarkは私が第2の問題に繋がるよりも最初の問題を解決しました。あなたのおかげです。 – NewbieCoder

3

ようなものが必要ですから、!_day!+%%Gの表現ではなく、1

の13になります12です本当に日付の数学では扱いにくいです。あなたは31日間何ヶ月間何をしますか? 2月のために?うるう年?適切な日付オブジェクトを持つ別の言語に切り替えていない場合は、少なくとも1つのものから借用することを考慮する必要があります。

<# : batch portion 
@echo off & setlocal 

if "%~1"=="" (
    echo usage: %~nx0 startdate 
    goto :EOF 
) 

set "startdate=%~1" 
set "daysToAdd=19" 

rem # evaluate PowerShell hybrid code and capture output as %%I 
for /f "delims=" %%I in ('powershell -noprofile "iex (${%~f0} | out-string)"') do (

    rem # do something useful with %%I here 
    echo %%I.txt 
) 

goto :EOF 
: end batch/begin PowerShell hybrid code #> 

# cast "startdate" environment variable value as a datetime object 
[datetime]$d = $env:startdate 

for ($i = 0; $i -le $env:daysToAdd; $i++) { 
    $d.addDays($i).toString("dd-MM-yyyy") 
} 

をそれとも、VBScriptの速度を好む場合は、ここではバッチ+ VBScriptのハイブリッド例です。ここではバッチ+ PowerShellのハイブリッド例です。その許可された日付入力は、おそらくPowerShellほど柔軟ではありませんが、ほとんど即座に実行されます。

<!-- : batch portion 
@echo off & setlocal 

if "%~1"=="" (
    echo usage: %~nx0 startdate 
    goto :EOF 
) 

set "startdate=%~1" 
set "daysToAdd=19" 

rem # evaluate VBScript hybrid code and capture output as %%I 
for /f "delims=" %%I in ('cscript /nologo "%~f0?.wsf" "%startdate%" "%daysToAdd%"') do (

    rem # do something useful with %%I here 
    echo %%I.txt 
) 

goto :EOF 
: end batch/begin VBScript --> 
<job> 
    <script language="VBScript"> 
     if not IsDate(WSH.Arguments(0)) then 
      WSH.StdErr.WriteLine("Not a valid date.") 
      WSH.Quit(1) 
     end if 

     d = CDate(WSH.Arguments(0)) 
     For i = 0 to WSH.Arguments(1) 
      d2 = DateAdd("d", i, d) 
      WSH.Echo(Day(d2) & "-" & Month(d2) & "-" & Year(d2)) 
     Next 
    </script> 
</job> 

それとも、JavaScriptの構文でより快適にしている場合は、バッチ+ JScriptのハイブリッドソリューションを行うことができます。

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

if "%~1"=="" (
    echo usage: %~nx0 startdate 
    goto :EOF 
) 

set "startdate=%~1" 
set "daysToAdd=19" 

rem // evaluate VBScript hybrid code and capture output as %%I 
for /f "delims=" %%I in (
    'cscript /nologo /e:JScript "%~f0" "%startdate%" "%daysToAdd%"' 
) do (

    rem // do something useful with %%I here 
    echo %%I.txt 
) 

goto :EOF 
@end // end batch/begin JScript 

Date.prototype.addDays = function(num) { 
    this.setDate(this.getDate() + num); 
    return this; 
} 

for (var i=0; i<WSH.Arguments(1); i++) { 
    var d = new Date(WSH.Arguments(0)).addDays(i); 
    WSH.Echo([d.getDate(), (d.getMonth() + 1), d.getFullYear()].join('-')); 
} 

いずれかの方法で、VBScriptの、JScriptの、およびPowerShellは、すべての日付オブジェクトにn個日を追加できるようになると、その日付オブジェクトが自動的にあなたが明示的に彼らのためにスクリプトを必要とせずにカレンダー癖を処理します。

関連する問題