2013-07-02 172 views
2

运行我,如果我在命令提示符下运行它运行良好的批处理文件,但如果它是从任务计划程序调用或通过浏览器运行时会引发错误。看起来,FOR逻辑出现语法错误。命令的语法不正确,如果不是从CMD线

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

pause 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    pause 
    set tempfile=%%I 
    if exist %tempfile% (
    del car_report.txt 
    ren %tempfile% car_report.txt 
) 
) 

del mic_car*.txt 
copy /y car_report.txt ..\car_report.txt 

pause 

如果我跑这从资源管理器或任务计划,我看到这些文件通过FTP转移,其次是语法错误。如果我通过命令行运行它,我会看到每个正在处理的文件的回显,最大的文件被复制到更高级别的目录。

回答

3

即使在命令行中,您的代码也无法正常工作。

你的问题是你的设置tempfile和扩展%tempfile%在同一个代码块内。分析行时该值将展开,并且FOR语句的所有行都将在一次传递中解析。因此,您的IF和REN语句会看到循环进入之前存在的值。

您的代码失败,语法错误时,不定义tempfile。扩展后,IF语句变为无效:if exist (...,因此是错误。

你觉得它在命令行工作的原因是因为你可能遇到的代码,一旦它失败了,但完成的情况下,tempfile变量被设置,因此该脚本会出现运行正常运行它下一次。

通常,我建议使用延迟扩展的,以使设置一个循环内扩大的变量。但是,你没有任何理由使用tempfile在所有 - 只使用FOR变量直接。

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    if exist "%%I" (
    del car_report.txt 
    ren "%%I" car_report.txt 
) 
) 

del mic_car*.txt 
copy /y car_report.txt ..\car_report.txt 

pause 

其实,我不明白为什么你需要的,如果在所有的,因为你的循环只返回现有文件。和所有mic_car * .txt文件将被重新命名为car_report.txt(最后一个获胜),所以不应该有任何需要您的最终DEL命令。

您可以组合DEL和REN利用MOVE

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    move /y "%%I" car_report.txt >nul 
) 

copy /y car_report.txt ..\car_report.txt 

pause 
+0

那么,你有它!它一直在工作,因为它已经运行了两次......我从来没有用过很多批处理文件,这些信息真的很有帮助! –

1

您使用的是哪个版本的Windows?

我已经改变了脚本来调用一个子程序,从您的目录列表中提取数据。

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

pause 

for /F %%I in ('dir /b/os mic_car*.txt') do call :blue %%I 
goto exit 

:blue 
    echo -- processing %1 ------------- 
    pause 
    set tempfile=%1 
    if exist %tempfile% (
    del car_report.txt 
    ren %tempfile% car_report.txt 
    echo -- renamed %tempfile% to car_report.txt ------------- 
) 


del mic_car*.txt 
copy /y car_report.txt ..\car_report.txt 
echo -- finished %1 ------------- 
pause 

goto :eof 

:exit 

有一个在Windows资源管理器和调度之间默认目录的差异,因为这个原因,你应该考虑使用到其中的目标文件中找到的文件和目录显式路径。例如删除C:\ carfiles \ mi_car * .TXT

+0

感谢您的建议,并解释命令一个命令。 –

0

这些线是你错误的原因:

set tempfile=%%I 
if exist %tempfile% (

% - 变量在分析时都expandet,即当命令(在这种情况下for循环)被解释器解析。此时,循环变量没有值,所以%tempfile%为空,从而导致错误。

您需要启用延迟扩展并在循环内部使用! -variables。当循环变量包含实际值时,这些变量会在运行时扩展。

setlocal EnableDelayedExpansion 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    pause 
    set tempfile=%%I 
    if exist !tempfile! (
    del car_report.txt 
    ren !tempfile! car_report.txt 
) 
) 
+0

感谢您的信息! –