标题: [文件操作] 批处理FOR命令运行过程中容易挂掉的求助 [打印本页]
作者: odinliu 时间: 2015-1-21 08:48 标题: 批处理FOR命令运行过程中容易挂掉的求助
- @echo off
- set /a tm1=%time:~0,2%*1
- if %tm1% LSS 10 set tm1=0%tm1%
- set filename=%username%%date:~0,4%-%date:~5,2%-%date:~8,2%-%tm1%%time:~3,2%%time:~6,2%
- set timename=%date:~0,4%/%date:~5,2%/%date:~8,2% %tm1%:%time:~3,2%:%time:~6,2%
- set folder=D:\%username%\FCCCache\%username%
- set savefolder=D:\%username%\FCCCache
-
- for /f "delims=""" %%i in ('dir /a-d /b /s %folder%\*.*d* 2^>nul') do (
- for /f "tokens=1,2" %%j in ('dir /a /tc "%%i" ^| findstr "%%~nxi"') do (
- echo %%j %%k##%%~ti##%%~nxi##%computername%##%username%##%timename%>>%savefolder%\%filename%.txt
- ))
- exit
复制代码
代码如上,这个代码的作用是调取指定目录下(D:\%username%\FCCCache\%username%) 所有子目录里面的文件名,因为我只需要调用DWG和PDF格式的文件,所在后辍里面用了*d*这个后辍进行筛选,需要收集文件名,文件的创建和修改时间等一些信息。所以导致FOR的语句有点长。
那么问题来了:这个批处理在部分电脑上有运行过程中停用的问题,电脑问题基本可以排除,@echo off 改成 on可以发现运行时代码运行中可能会停下来,不走了。所以求助高手帮忙看下问题是出在哪个地方,谢谢!
作者: DAIC 时间: 2015-1-21 08:59
看看出问题的时候正在处理哪个文件
@echo on
set /a tm1=%time:~0,2%*1
if %tm1% LSS 10 set tm1=0%tm1%
set filename=%username%%date:~0,4%-%date:~5,2%-%date:~8,2%-%tm1%%time:~3,2%%time:~6,2%
set timename=%date:~0,4%/%date:~5,2%/%date:~8,2% %tm1%:%time:~3,2%:%time:~6,2%
set folder=D:\%username%\FCCCache\%username%
set savefolder=D:\%username%\FCCCache
for /f "delims=" %%i in ('dir /a-d /b /s %folder%\*.*d* 2^>nul') do (
echo 外层for循环正在处理文件 %%i
for /f "tokens=1,2" %%j in ('dir /a /tc "%%i" ^| findstr "%%~nxi"') do (
echo 内层for循环 %%j %%k##%%~ti##%%~nxi##%computername%##%username%##%timename% %savefolder%\%filename%.txt
echo %%j %%k##%%~ti##%%~nxi##%computername%##%username%##%timename%>>%savefolder%\%filename%.txt
))
pause
作者: odinliu 时间: 2015-1-21 09:13
批处理停用停在哪个文件没有特征,在同一台电脑上面,这个代码能偶尔能全部执行完,但大部分是在中间过程就停了。非常苦恼!
作者: DAIC 时间: 2015-1-21 09:21
回复 3# odinliu
用2楼的代码,找个停掉的例子,截图看看。
作者: 慕夜蓝化 时间: 2015-1-21 14:00
- @echo off&setlocal enabledelayedexpansion
- set/a tm1=%time::=%*1 >nul 2>nul
- for /f %%i in ("%date:/=%") do (
- if %time:~,2% lss 10 set tm1=0%tm1%
- set filename=%username%%%i-!tm1!
- for /f %%a in ("%date%") do (
- set timename=%%a !tm1!%time:~2,-3%
- )
- )
- call :a "d:\%username%\fcccache\%username%" "d:\%username%\fcccache"
- pause&exit
-
- :a
- (for /f "delims=" %%i in ('dir /s/b/l/aa "%~1\*.*d*"') do (
- for /f "tokens=1-2" %%a in ('dir /tc "%%~i"^|findstr "%%~nxi" ') do (
- echo,%%a %%b##%%~ti##%%~nxi##%computername%##%username%##%timename%
- )
- )) >%~2\%filename%.txt
- goto :eof
复制代码
我这里测试部分完好,另外,再补充一下你的问题。还有for 挂掉?那是什么。
作者: odinliu 时间: 2015-1-21 15:05
我这里测试部分完好,另外,再补充一下你的问题。还有for 挂掉?那是什么。
慕夜蓝化 发表于 2015-1-21 14:00
额,可能是我表述不清,我的代码里面出问题的就是FOR语句这一段,但也不是完全不用能,只是部分机器运行的时候出问题,但是机器本身也没问题,所以只能拎着代码来求助了。你的代码我再细看一下。谢谢!
作者: amwfjhh 时间: 2015-1-21 15:18
每台电脑的%username%值不一样?涉及路径的变量最好用""引起来,在set语句中使用""转义是个好习惯。
作者: odinliu 时间: 2015-1-21 15:38
每台电脑的%username%值不一样?涉及路径的变量最好用""引起来,在set语句中使用""转义是个好习惯。
amwfjhh 发表于 2015-1-21 15:18
非常感谢,%username%这个变量在我这边电脑上的设定,因为都是加过域的计算机,这个变量都是八位的数字,比较统一,所以就没考虑用“”号引起来,这样做是不太严谨,我下次在代码里面修改回来。感谢!
作者: amwfjhh 时间: 2015-1-21 16:01
代码看不出大问题来。如路径可排除的话看看你的批处理文件名,是否命名成了代码中其个命令或关键字的名字了,还有就是在重定向符的使用上,%timename%中存在数字,最好与>>之间有空格,避免被错误解析。把重定向符提到行首,后面跟回显内容是个不错的选择。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |