在批处理文件中返回变量的函数 [英] Function returning Variable in Batch File

查看:101
本文介绍了在批处理文件中返回变量的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个代码,它将根据文件名创建一个文件夹树,然后将其移至相应的文件夹中,最后一个子文件夹将位于Date中。
我遇到的问题是调用:SubtractDate%Year%%Month%%Day%-10 Ret
here ret 不会捕获函数传递的值。



至今创建的代码::

  @echo Off 
SetLocal
$ b $ set Path1 = d:\A
推送%Path1%

(*。*)做SETFName = %%〜ni
For / FTokens = 4-5 Delims = - %% A In(%FName%)Do
设置FoldOne = %% A
设置FoldTwo = %% B


IF%FoldTwo%== ABC(
echo每日
通话:GetDateTime年月日
通话:减去日期%年%%%月%%日%-10 Ret
回声%年%%%月%%日%
回声% Ret%%b $ b exit / b


(如果不存在)%Path1%\%FoldOne%\%FoldTwo%\%Ret%(
mkdir%Path1%\%FoldOne%\%FoldTwo%\%Ret%)
移动%Path1%\%FName%。*%Path1%\% FoldOne%\%FoldTwo%\%Ret%\

推送d:\

转到:EOF


:减去日期年份周一第二天 Ret
::改编自DosTips函数::
@echo off& setlocal& set a =%4
setyy =%〜1& setmm =%〜2& setdd =%〜3
set / ayy = 10000%yy %%10000,mm = 100%mm%%100,dd = 100%dd%%100
如果%yy%LSS 100 set / a yy + = 2000& rem将2000年添加到两位数年
set / a JD = dd-32075 + 1461 *(yy + 4800 +(mm-14)/ 12)/ 4 + 367 *(mm-2(mm-14)/ 12 * 12)/ 12 -3 *((yy + 4900 +(mm-14)/ 12)/ 100)/ 4
如果%a:〜0,1%equ +(set / a JD =%JD%+%a: 〜1%)else set a JD =%JD% - %a:〜1%
set / a L =%JD%+ 68569,N = 4 * L / 146097,L = L-(146097 * N + 3)/ 4,I = 4000 *(L + 1)/ 1461001
set / a L = L-1461 * I / 4 + 31,J = 80 * L / 2447,K = L-2447 * J / 80,L = J / 11
set / a J = J + 2-12 * L,I = 100 *(N-49)+ I + L
set / a YYYY = I ,MM = 100 + J,DD = 100 + K
设定MM =%MM:〜-2,2%&设置DD =%DD:〜-2%
set ret =%DD:= %% MM:= %% YYYY:=%
endlocal&设置%〜5 =%ret%
echo%ret%
退出/ b


:GetDateTime年月日小时分秒秒
@echo off &安培; setlocal
for / ftokens = 2 delims ==%% a in('wmic OS Get localdatetime / value')do setdt = %% a
setYY =%dt: 〜2,2%&设置YYYY =%dt:〜0.4%&设置MM =%dt:〜4,2%&设置DD =%dt:〜6,2%
设置HH =%dt:〜8,2%&设定Min =%dt:〜10,2%&设置Sec =%dt:〜12,2%
(ENDLOCAL
IF%〜1NEQ设置%〜1 =%YYYY%
IF%〜 2NEQ设置%〜2 =%MM%
IF%〜3NEQ设置%〜3 =%DD%
IF%〜4NEQ 设置%〜4 =%HH%
IF%〜5NEQ设置%〜5 =%最小%
IF%〜6NEQ设置 〜6 =%Sec%

exit / b


解决方案

根据我给出的最后一个回复,您似乎没有真正遵循,您可以尝试如下所示:

  @Echo Off 
设置Path1 = D:\A
设置RelDays = -10
Set_ =
If / I Not%CD%==%Path1%(Pushd%Path1%2> Nul& Set_ = T)||退出/ B
For / F UseBackQ %% A In(
`PowerShell(Get-Date).AddDays(%RelDays%)。ToString('ddMMyyy')`
)设置RDate = %% A
对于%% A In(* - * - * - * - *。*)做调用:Sub%% A
如果已定义_ PopD
超时-1
转到:EOF

:Sub
For / FTokens = 4-5Delims = - %% A In(%〜n1)如果不是%% A==(
如果%% B==ABC(如果不存在%% A \ %% B\%RDate%\MD %% A \ %% B\%RDate%
移动%1%% A\ %% B\%RDate%))



我使用powershell来计算日期,而不是您找到的函数。


I am trying to write a code which will create a folder tree depending on file name and then move it in respective folder last subfolder will be on Date. Problem I am facing is Call :SubtractDate %Year% %Month% %Day% -10 Ret here ret is not catching a passed value from function.

Code created so far::

@echo Off
SetLocal

set Path1= d:\A
Pushd %Path1%

for %%i in (*.*) do SET "FName=%%~ni"
For /F "Tokens=4-5 Delims=-" %%A In ("%FName%") Do (
Set "FoldOne=%%A"
Set "FoldTwo=%%B"
)

IF %FoldTwo% == ABC (
echo Daily
Call :GetDateTime Year Month Day
Call :SubtractDate %Year% %Month% %Day% -10 Ret
Echo %Year% %Month% %Day%
echo %Ret%
exit /b
)

if not exist %Path1%\"%FoldOne%"\"%FoldTwo%"\%Ret% (
  mkdir %Path1%\"%FoldOne%"\"%FoldTwo%"\%Ret% )
  move %Path1%\"%FName%".* %Path1%\"%FoldOne%"\"%FoldTwo%"\%Ret%\

Pushd d:\

GoTo :EOF


:SubtractDate Year Month Day <+/-Days> Ret
::Adapted from DosTips Functions::
@echo off & setlocal & set a=%4
set "yy=%~1"&set "mm=%~2"&set "dd=%~3"
set /a "yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100"
if %yy% LSS 100 set /a yy+=2000 &rem Adds 2000 to two digit years
set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3* ((yy+4900+(mm-14)/12)/100)/4
if %a:~0,1% equ + (set /a JD=%JD%+%a:~1%) else set /a JD=%JD%-%a:~1%
set /a L= %JD%+68569,     N= 4*L/146097, L= L-(146097*N+3)/4, I= 4000*    (L+1)/1461001
set /a L= L-1461*I/4+31, J= 80*L/2447,  K= L-2447*J/80,      L= J/11
set /a J= J+2-12*L,      I= 100*(N-49)+I+L
set /a YYYY=I, MM=100+J, DD=100+K
set MM=%MM:~-2,2% & set DD=%DD:~-2%
set ret=%DD: =%%MM: =%%YYYY: =%
endlocal & set %~5=%ret%
echo %ret%
exit /b


:GetDateTime Year Month Day Hour Minute Second
@echo off & setlocal
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
( ENDLOCAL
     IF "%~1" NEQ "" set "%~1=%YYYY%" 
     IF "%~2" NEQ "" set "%~2=%MM%" 
     IF "%~3" NEQ "" set "%~3=%DD%"
     IF "%~4" NEQ "" set "%~4=%HH%" 
     IF "%~5" NEQ "" set "%~5=%Min%"
     IF "%~6" NEQ "" set "%~6=%Sec%"
)
exit /b

解决方案

Based on the last reply I gave you, which you seem not to have really followed, you could try something like this:

@Echo Off
Set "Path1=D:\A"
Set "RelDays=-10"
Set "_="
If /I Not "%CD%"=="%Path1%" (Pushd "%Path1%" 2>Nul & Set "_=T") || Exit/B
For /F UseBackQ %%A In (
    `PowerShell "(Get-Date).AddDays(%RelDays%).ToString('ddMMyyy')"`
) Do Set "RDate=%%A"
For %%A In ("*-*-*-*-*.*") Do Call :Sub "%%A"
If Defined _ PopD
Timeout -1
GoTo :EOF

:Sub
For /F "Tokens=4-5Delims=-" %%A In ("%~n1") Do If Not "%%A"=="" (
    If "%%B"=="ABC" (If Not Exist "%%A\%%B\%RDate%\" MD "%%A\%%B\%RDate%"
        Move %1 "%%A\%%B\%RDate%"))

I used powershell to calculate the date instead of the function you had found.

这篇关于在批处理文件中返回变量的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆