我已经看到这个问题(没有那么多回答)的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? 它没有回答我的问题,但绝对是这个等式的关键部分。
答案 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