文件写完Windows命令行.bat后处理文件

时间:2013-06-21 01:20:27

标签: windows command-line batch-file winscp

我已经看到这个问题(没有那么多回答)的java和Linux,但不是Windows命令行批处理操作。我将使用Windows命令行描述我想要做的事情。我把头发拉出来试图解决这个问题。

多媒体文件正在转换为文件夹X.文件转换完成后,使用winSCP进行ftp。我可能想到的winSCP命令行语法。这是等待文件完成转换,这让我感到不安。

我概述的一种方法是使用这样的for循环:

文件大小写入变量

使用ftp nul ping技巧暂停5秒(如答案1中所述:Batch file to download a file from FTP

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

问题是我还没有找到一种方法来将文件大小写入变量。另外,我必须确保一旦文件开始ftp就停止查看该文件并等待观察新的多媒体文件进入该文件夹。

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

提前感谢您的帮助。

编辑: 我刚刚找到此链接来获取文件的文件大小:Windows command for file size only? 它没有回答我的问题,但绝对是这个等式的关键部分。

3 个答案:

答案 0 :(得分:14)

将文件大小变为变量很简单 - 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 )中的空格至关重要,允许&#34; null操作&#34;不返回错误(errorcode = 0)。取走空间(call),命令返回错误(errorcode = 1),这将破坏锁定检测算法。有趣的是,没有空格的表单会返回错误而不会生成错误消息。我相信这两个命令是清除或设置批处理错误代码的最有效方法。

答案 1 :(得分:2)

感谢@dbenham我能够提出一个基本的脚本,它无疑是非常丑陋的代码,但它现在可以用于我需要的东西。随着时间的推移,我打算在一个更加用户友好的脚本中捕获错误。目前,为了运行脚本,您必须使用正在使用的文件夹编辑.bat,而不是用户启动的变量。我还没有问过用户登录和pw对于WinSCP是什么,而是在目前将其内置到脚本中时不安全。显然,最终也将是一个用户问的问题。

@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:someuserpw@someftpsite.com:21" "put H:\uploaded\!b! /home/user/!b!" "exit"||echo !b! uploaded successfully>log.txt

GOTO:checkformovfile

:eof

答案 2 :(得分: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