Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file “错误”;此时0是意外的。”;批处理文件_Batch File_Command Prompt_Temporary Files - Fatal编程技术网

Batch file “错误”;此时0是意外的。”;批处理文件

Batch file “错误”;此时0是意外的。”;批处理文件,batch-file,command-prompt,temporary-files,Batch File,Command Prompt,Temporary Files,我有一个批处理文件,用于删除专用于临时文件的特定子文件夹中早于5分钟的文件 批处理不再工作,因此我尝试在命令提示符下运行它,并出现“此时意外”错误 以下是批处理文件: cd "c:\inetpub\website name\tempfolder" @ECHO OFF :: ------------ :: This is where you set the number :: of minutes you want subtracted :: from the current date/time.

我有一个批处理文件,用于删除专用于临时文件的特定子文件夹中早于5分钟的文件

批处理不再工作,因此我尝试在命令提示符下运行它,并出现“此时意外”错误

以下是批处理文件:

cd "c:\inetpub\website name\tempfolder"
@ECHO OFF
:: ------------
:: This is where you set the number
:: of minutes you want subtracted
:: from the current date/time.
:: ------------
SET MyMins=5

:: ------------
:: Get current date/time
:: ------------
FOR /F "TOKENS=2-4 DELIMS=/ " %%F IN ('DATE /T') DO (
 SET YYYY=%%H
 SET MM=%%F
 SET DD=%%G
)
FOR /F "TOKENS=5-6 DELIMS=: " %%F IN ('ECHO.^|TIME') DO (
 SET HR=%%F
 SET MN=%%G
)

IF %DD% LSS 10 (SET DD=%DD:~1%)
IF %MM% LSS 10 (SET MM=%MM:~1%)
IF %HR% LSS 10 (SET HR=%HR:~1%)
IF %MN% LSS 10 (SET MN=%MN:~1%)

: ------------
:: Subtract minutes from current time.
:: ------------
SET /A MN=%MN% - %MyMins%

:: ------------
:: Do the massively painful
:: reverse calculations.. :(
:: ------------
:LoopMins
IF /I %MN% GEQ 0 (GOTO LoopHrs)
SET /A MN=%MN% + 60
SET /A HR=%HR% - 1
GOTO LoopMins
:LoopHrs
IF /I %HR% GTR 0 (GOTO LoopDate)
SET /A HR=%HR% + 23
SET /A DD=%DD% - 1
GOTO LoopHrs
:LoopDate
IF /I %DD% GTR 0 (GOTO DONE)
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
if %mm%==12 goto SET31
goto ERROR
:SET31
set /A dd=31 + %dd%
goto LoopDate
:SET30
set /A dd=30 + %dd%
goto LoopDate
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto LoopDate
:SET29
set /A dd=29 + %dd%
goto LoopDate
:DONE
IF %dd% LSS 10 set dd=0%dd%
IF %mm% LSS 10 set mm=0%mm%
IF %HR% LSS 10 SET HR=0%HR%
IF %MN% LSS 10 SET MN=0%MN%


for %%i in (*.*) do (
 set FileName=%%i
 SET FTIME=%%~ti
 CALL :PROCESSFILE
)

set mm=
set yyyy=
set dd=
set thedate=
goto :EOF

:PROCESSFILE
set fyyyy=%FTIME:~6,4%
set fmm=%FTIME:~0,2%
set fdd=%FTIME:~3,2%
SET fhr=%FTIME:~11,2%
SET fmn=%FTIME:~14,2%

if /I %fyyyy% GTR 2069 set fyyyy=19%FTIME:~6,2%

:: --------
:: Deal with File times
:: reported as AM/PM vs.
:: calculated times as 24hr.
:: --------
IF /I "%FTIME:~17,1%" == "P" (
 IF %fhr% LSS 10 (
  SET /A fhr=%fhr:~1,1% + 12
 ) ELSE (
  IF %fhr% LEQ 11 (
   SET /A fhr=%fhr% + 12
  )
 )
)
IF /I "%FTIME:~17,1%" == "A" (
 IF %fhr%==12 (
  SET fhr=00
 )
)

:: +*************************************+
:: | This is where the files are deleted |
:: | Change the ECHO command to DEL to   |
:: | delete. ECHO is used for test.      |
:: +*************************************+
if /I %yyyy%%mm%%dd% GEQ %fyyyy%%fmm%%fdd% (
 IF /I 1%hr%%mn% GEQ 1%fhr%%fmn% (

  DEL %FileName%

 )
)
ECHO Calcdate=%yyyy%%mm%%dd%%hr%%mn%

set temp=
set fyyyy=
set fmm=
set fdd=

:EXIT
在命令提示符中运行它失败,甚至在它开始时还没有通过cd。在整个代码中添加暂停命令似乎无助于诊断失败的地方

编辑:感谢用户Stephan的建议,删除@echo off,这样我就可以看到代码失败的地方了。就在这里:

:LoopMins
IF /I %MN% GEQ 0 (GOTO LoopHrs)
SET /A MN=%MN% + 60
SET /A HR=%HR% - 1
GOTO LoopMins
EDIT2:问题似乎是此段:

IF %dd% LSS 10 set dd=0%dd%
IF %mm% LSS 10 set mm=0%mm%
IF %HR% LSS 10 SET HR=0%HR%
IF %MN% LSS 10 SET MN=0%MN%

因此,如果批处理文件在上午10点之前运行,HR将设置为null。

它将显示
MN
中的值为nothing,因此该行被解析为空

IF /I GEQ 0 (GOTO LoopHrs)
CMD
应为
IF[/i]字符串运算符字符串,其中*运算符*必须是比较运算符之一或
==`。这就是它抱怨的原因


在这样一段代码中,我不想去追踪流氓变量的设置,但是有很多很多关于如何从
%date%
%time%
魔术变量解析日期和时间的文章。您可能需要小心前导零被空格替换(提示:
set“var=%time:=0%”
可能会为您解决这个问题),然后处理前导零(08和09不太好;使用
set/a var=1%time:m,n%-100
转换为十进制)是另一个雷区。

看起来
MN
中的值为零,因此该行被解析为

IF /I GEQ 0 (GOTO LoopHrs)
CMD
应为
IF[/i]字符串运算符字符串,其中*运算符*必须是比较运算符之一或
==`。这就是它抱怨的原因


在这样一段代码中,我不想去追踪流氓变量的设置,但是有很多很多关于如何从
%date%
%time%
魔术变量解析日期和时间的文章。您可能需要小心前导零被空格替换(提示:
set“var=%time:=0%”
可能会为您解决这一问题),然后处理前导零(08和09不太好;使用
set/a var=1%time:m,n%-100
转换为十进制)是另一个雷区。

我想,我发现了您的问题:

FOR /F "TOKENS=5-6 DELIMS=: " %%F IN ('ECHO.^|TIME') DO (
在命令行上尝试:

FOR /F "TOKENS=5-6 DELIMS=: " %F IN ('ECHO.^|TIME') DO echo Hours:%F, Minutes:%G
然后看看输出

我建议使用:

    FOR /F "TOKENS=1,2 DELIMS=: " %%F IN ('time /t') DO echo Hours:%%F, Minutes:%%G
小心那些代币。对于我的计算机设置,它是“TOKENS=1,2”,但在其他语言环境设置中可能会有所不同

这是我的输出:

C:\>echo.|time
Aktuelle Zeit:  9:12:18,30
Geben Sie die neue Zeit ein:

C:\>time /t
09:12

C:\>FOR /F "TOKENS=3,4 DELIMS=: " %F IN ('ECHO.^|TIME') DO @echo Hours:%F, Minutes:%G
Hours:9, Minutes:12
Hours:die, Minutes:neue

C:\>FOR /F "TOKENS=1,2 DELIMS=: " %F IN ('TIME /t') DO @echo Hours:%F, Minutes:%G
Hours:09, Minutes:13

C:\>

我想,我发现了你的问题:

FOR /F "TOKENS=5-6 DELIMS=: " %%F IN ('ECHO.^|TIME') DO (
在命令行上尝试:

FOR /F "TOKENS=5-6 DELIMS=: " %F IN ('ECHO.^|TIME') DO echo Hours:%F, Minutes:%G
然后看看输出

我建议使用:

    FOR /F "TOKENS=1,2 DELIMS=: " %%F IN ('time /t') DO echo Hours:%%F, Minutes:%%G
小心那些代币。对于我的计算机设置,它是“TOKENS=1,2”,但在其他语言环境设置中可能会有所不同

这是我的输出:

C:\>echo.|time
Aktuelle Zeit:  9:12:18,30
Geben Sie die neue Zeit ein:

C:\>time /t
09:12

C:\>FOR /F "TOKENS=3,4 DELIMS=: " %F IN ('ECHO.^|TIME') DO @echo Hours:%F, Minutes:%G
Hours:9, Minutes:12
Hours:die, Minutes:neue

C:\>FOR /F "TOKENS=1,2 DELIMS=: " %F IN ('TIME /t') DO @echo Hours:%F, Minutes:%G
Hours:09, Minutes:13

C:\>

您是否已授予文件管理权限?是的,该文件正在以管理员身份运行。您是否尝试对cd命令进行注释,然后将该文件复制到目标文件夹并从该位置本身运行表单命令提示符?我仍然收到错误“0此时未预料到”。请删除
回显功能。这应该告诉你,它失败的地方。(提示:错误消息后会回显故障行)您能看到它吗?
if
语句中的空变量。(注意:
time
也有
/t
参数)您是否授予了文件管理权限?是的,该文件正在以管理员身份运行您是否尝试注释cd命令,然后将文件复制到目标文件夹并从该位置本身运行表单命令提示符?我仍然收到错误消息“0此时意外出现。请删除
回显关闭
。这将显示失败的位置。(提示:错误消息后会回显失败的行)您能看到它吗?
if
语句中的空变量。(注意:
time
也有
/t
参数)一定看了十几遍都没有意识到问题是什么。谢谢!一定看了十几遍都没有意识到问题是什么。谢谢!