Мне нужно было что-то, что вычтет дни из текущей даты при проверке високосных лет и т. Д., И это сработало замечательно.
Я просто вызываю его из этих сценариев с необходимым параметром (количество дней, которое нужно вычесть), а затем заставляю его перезвонить вызывающему сценарию с подстановками и передать параметр обратно в исходный сценарий для измененной (вычтенной) даты.
Вот примеры:
Сценарий, требующий установки переменной для вычисления даты:
IF "%1"=="" goto modifydate
:modifydate
SET subtractdays=5
SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
CALL "%ModDateScript%" %subtractdays% "%~fnx0"
Скрипт, который вычислит и передаст параметр% moddate% исходному вызывающему скрипту, который будет установлен как переменная для его соответствующей обработки. Вы просто поместите это в конец скрипта, который вы вызываете, чтобы изменить / вычесть дни из текущей даты (ModDate.cmd).
SET moddate=%mm%/%dd%/%yyyy%
Call %2 %moddate%
GOTO EOF
Мне удалось протестировать и определить, что эти строки из исходного сценария опубликованы:
set yyyy=
set $tok=1-3
for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u
if "%$d1:~0,1%" GTR "9" set $tok=2-4
for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do (
set %%x=%%u
set %%y=%%v
set %%z=%%w
set $d1=
set $tok=))
if "%yyyy%"=="" set yyyy=%yy%
if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100
Может быть заменено только одной строкой, и она работает так же хорошо:
FOR /F "tokens=2-4 delims=/ " %%A IN ("%date%") DO SET "mm=%%A" DO (& SET "dd=%%B") DO (& SET "yyyy=%%C")
Пожалуйста, объясните, что эти строки (те, которые я поменял на одну строку с утверждениями) в любом случае делают, потому что я не могу быстро определить разницу при тестировании. Я вычитал еще в 19 веке, и это показалось мне точным. Я подумал, что, возможно, это помогло справиться с расчетами, когда модифицированный год будет меньше 2000 - но я этого не видел, если не упустил что-то.
В противном случае этот один сценарий можно легко вызвать и передать обратно% mm% /% dd% /% yyyy% в качестве параметра для нескольких сценариев, которые нуждаются в собственных вычислениях. Отличное и очень эффективное пакетное решение. Я могу передать аргумент как% 1,% 2,% 3 и т. Д. И все еще использовать setlocal в этом сценарии для текущей даты - просто сделайте переменную что-то вроде moddate =% 1 и т. Д.
Наконец, я призываю любого специалиста по пакетным сценариям еще больше оптимизировать этот сценарий и выкладываю результаты тестов для пакетных пользователей.
Спасибо,
P