我有一个.bat文件,在我输入cmd中的日期后执行一些代码:
test.bat包含:
- set /P PWeekday=asofdate:
因为我总是进入上一个工作日,所以我想编写一些能够做到这一点的代码。但是我发现作为批处理脚本的一部分很难做到,我读到在excel中创建一个宏并将值传递到命令行以便运行批处理脚本要容易得多。所以我这样做了:
VBA中的PWeekday功能
Public Function PWeekday() As String
Dim offset Day As Integer
If Weekday(Date) = 1 Then ' Monday
offsetDay = 3
End If
PWeekDay = Format(Date - offsetDay, "YYYYMMDD")
End Function
问题:
我必须添加到批处理文件中,以便在运行它时,它使用vba函数中的Pweekday值而不是我的用户输入?
非常感谢,任何帮助或建议都将不胜感激。
答案 0 :(得分:2)
前一个工作日的计算不是很困难"作为批处理脚本的一部分;它有点大:
@echo off
setlocal
REM Reference: http://www.hermetic.ch/cal_stud/jdn.htm#comp
rem Convert the Date in MM/DD/YYYY format to Julian Day Number and get the Day Of Week
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
set /A "a=(%%a-14)/12, JDN=(1461*(%%c+4800+a))/4+(367*(%%a-2-12*a))/12-(3*((%%c+4900+a)/100))/4+%%b-32075, DOW=(JDN+1)%%7"
)
if %DOW% equ 1 set /A JDN-=3
rem Convert the Julian Day Number back to Date in YYYYMMDD format
set /A "l=JDN+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447"
set /A "dd=100+l-(2447*j)/80,l=j/11,mm=100+j+2-(12*l),yyyy=100*(n-49)+i+l"
set "PWeekDay=%yyyy%%mm:~1%%dd:~1%"
echo %PWeekDay%
当%date%
变量的格式为MM/DD/YYYY
时,这是一种可以正常工作的简单方法。如果您的日期格式不同,只需相应更改%%a
表达式中的%%b
和set /A
值即可。如果您希望程序以任何日期格式运行,可能会略微修改以从wmic
命令获取日期。
注意:我担心这个例子中使用的公式会让我感到困惑。恕我直言,如果当天不是星期一,应该从当天减去一天;否则使用的日期是相同的日,而不是前一天:
if %DOW% equ 1 (set /A JDN-=3) else set /A JDN-=1
答案 1 :(得分:1)
虽然你可以在你的bat文件中完成所有这些,但我可以看到为什么你想在混合脚本中这样做。因此,我没有使用VBA,而是使用VBScript来获得所需的结果
VBScript代码
Dim AsOfDate
If WeekDay(Date,2) = 1 Then 'WeekDay(Date,2) = 2 to ensure monday as start of week because default of vbs function is sunday
AsOfDate=DateAdd("d",-3,Date)
Else
AsOfDate=Date
End If
WScript.Echo DatePart("yyyy",AsOfDate,2) & DatePart("m",AsOfDate,2) & DatePart("d",AsOfDate,2) 'DatePart(xxx,AsOfDate,2) = 2 to ensure monday as start of week
批代码
for /f "delims=" %%r in ('cscript //nologo C:\Users\pankaj.jaju\Desktop\Test.vbs') do set result=%%r
echo %result%
答案 2 :(得分:0)
我同意VBA通常是构建这些自定义函数的更简单的工具,但正如其他人所指出的那样,它需要Excel或其他VBA程序的开销来运行该函数。这是可能的,但在这种情况下你的潜在需求可能有点过分。
虽然VBScript缺少VBA的良好Echo
功能,但您可以编写与VBScript中运行非常相似的东西,并使用Dim offsetDay
Dim returnDate
If Weekday(Date) = 1 Then ' Monday
offsetDay = 3
End If
returnDate = Date - offsetDay
' Build return format with leading zeros
WScript.Echo DatePart("yyyy", returnDate) & _
Right("0" & DatePart("m", returnDate),2) & _
Right("0" & DatePart("d", returnDate),2)
函数将返回输出回批处理文件。您将看到我必须在函数中进行很少的更改才能在VBScript中运行它。
echo 'setInterval(function(){$.post(\'/refreshTheSession.php\');},90000);';
要测试它,您可以双击VBScript文件并在消息框中查看返回。当您从批处理文件中调用它时,它会将结果输出到批处理程序中。
以下是一些链接,可帮助您开始从批处理文件中调用VBScript: pass value from vbscript to batch和Pass variable from a vbscript to batch file
希望有所帮助!!
答案 3 :(得分:0)
以下是使用PowerShell执行此操作的另一种方法。这也通过使用-$weekday - 2
作为偏移来处理星期日和星期一。
powershell -NoProfile -Command "$weekday = (Get-Date).DayOfWeek.value__;" ^
"$offset = -1;" ^
"if ($weekday -lt 2) { $offset = -$weekday - 2 };" ^
"((Get-Date).AddDays($offset)).ToString('yyyyMMdd');" >y.txt
SET /P "PWeekday=" <y.txt