2013-06-21 102 views
3

我已经看到这个问题(没有太多回答)java和linux,但不是Windows命令行批处理操作。我将使用Windows命令行描述我想要做什么。我正在试图弄清楚这件事。文件完成写入后处理文件Windows命令行.bat

多媒体文件正在转换为文件夹X.一旦文件转换完成,它将使用winSCP进行ftp'd。 winSCP命令行语法我大概可以弄清楚。这是等待文件完成转换,这让我很困扰。

一种方法我已经概述将使用一个像这样的循环:

文件大小被写入到一个变量

暂停使用FTP NUL平技巧5秒(如在回答1此处描述:Batch file to download a file from FTP

然后检查文件大小是否与以前的变量相同,如果是..停止循环检查并启动winSCP。 (我使用winSCP而不是windows命令行ftp,因为windows ftp不能被动地运行)。

问题是我还没有找到一种方法来将文件大小写入变量。另外,我必须确保一旦文件已经启动到ftp,它会停止查看该文件并等待注意新的多媒体文件进入该文件夹。

我想这样做的真正原因是我等待所有文件完成转换,然后通过ftp上传,这为流程增加了更多时间,我真的希望通过自动化过程来实现这个过程蝙蝠,但另外它会节省我的时间。

在此先感谢您的帮助。

编辑: 我刚刚发现这个链接获取文件的文件大小:Windows command for file size only? 它没有回答我的问题,但绝对是一个关键部分方程。

+0

什么是您使用转换?你是从批处理文件中产卵吗?如果是这样,那么处理会自动转到下一行而不等待转换完成? – Tony

+0

不,转换是从.exe程序完成的,没有在转换完成后执行任何操作的选项。 – julesverne

回答

13

将文件大小放入变量很简单 - for %%F in (filePath) do set "size=%%~zF"

但我相信我可以给你一个更好的解决方案。

与Unix不同,大多数Windows进程在写入文件时会获得对文件的独占锁定。连续假设转换进程锁定在加工过程中的输出文件,那么你可以简单地使用以下方法来测试,如果文件被锁定(仍在处理中),或者没有锁定(成品加工):

((call) >>outputFile.ext) 2>nul && (
    echo The file is unlocked and ready for transfer 
) || (
    echo The file is still being created 
) 

(call)语法只是一个非常快速的命令,什么都不做 - 实际上是一个空操作。这个命令保证没有任何输出,所以当你将命令的结果附加到你的文件时,保证不会改变任何东西。

如果文件已被锁定,因为它仍在被转换程序处理,那么重定向将失败。由于重定向失败,2>nul只是隐藏任何错误消息,并且&&||运算符根据先前命令的成功或失败条件执行命令。

更新

的空间中(call)是至关重要的,从而允许 “空操作” 不返回一个错误(错误代码= 0)。拿走空间(call),命令返回一个错误(错误代码= 1),这将打破锁定检测算法。有趣的是没有空格的表单在不产生错误信息的情况下返回一个错误。我相信这两个命令是清除或设置批错误代码的最有效方法。

+0

非常不错的一段代码;) –

+1

不错的把戏。它甚至不会触摸文件日期/时间戳。但是它会创建一个文件,如果它不存在。 – Stephan

+0

@Stephan - 好点。如果您不想在不存在的情况下创建文件,则可以使用'if exists outputFile.exe'命令该命令。 – dbenham

2

感谢@dbenham,我能够想出一个基本的脚本,这是公认的非常丑陋的代码,但它现在正在为我所需要的工作。随着时间的推移,我打算使用一个更具用户友好性的脚本来捕获错误。目前为了运行脚本,您必须使用正在使用的文件夹编辑.bat文件,而不是用户启动的变量。我也没有问过这个问题,在WinSCP中userlogin和pw是什么,但现在已经将它嵌入到脚本中了,而不是那么安全。显然,这也将最终成为用户问的问题。

@echo off 

SETLOCAL ENABLEEXTENSIONS 
SETLOCAL ENABLEDELAYEDEXPANSION 

:checkformovfile 
REM Check if a .mov file has been added to the folder 

for %%I in (*.*) do (if exist "H:\converted\*.mov" GOTO:checkfilecreation) 

Goto :checkformovfile 

:checkfilecreation 
REM Now that a .mov file has been added to the folder check to see if the file has 
REM completed the conversion or copying to the folder before starting ftp 

CLS 

for %%I in (*.mov) do ((call) >>%%I) 2>nul && (cls && set b=%%I && @echo !b! 
is completed and transfer is ready && GOTO :fileready 
) || (cls && echo %%I is still being created 
) 

:ContinueCheck 
REM Go back to checkfilecreation module 
GOTO :checkfilecreation 


:fileready 
REM copy completed file to uploaded folder 
move /Y "H:\converted\!b!" "H:\uploaded\!b!" 
echo 
REM start ftp and upload file to home user folder on ftp site and write log 
C:\WinSCP\WinSCP.exe /console /command "option batch on" "option confirm off" 

"open ftp://someuserlogin:[email protected]:21" "put H:\uploaded\!b! /home/user/!b!" "exit"||echo !b! uploaded successfully>log.txt 

GOTO:checkformovfile 

:eof 
0

一种解决方案是在另一个进程正在使用文件的同时尝试访问该文件(例如用于复制的explorer.exe)。

这里是一个示例代码立交桥是:

@echo OFF 
rem Let say the file you are copying is named BIGFILE.txt 
:Loop 
set /p test=<BIGFILE.txt >nul || (Timeout 5 & goto Loop) 
echo File ended copying 
pause 
相关问题