3

我已经看到针对 java 和 linux 提出了这个问题(没有得到太多回答),但对于 Windows 命令行批处理操作却没有。我将描述我想使用 Windows 命令行执行的操作。我正在拔头发试图弄清楚这一点。

一个多媒体文件正在转换到文件夹 X。一旦文件转换完成,它就会使用 winSCP 进行 ftp'​​d。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? 它没有回答我的问题,但绝对是等式的关键部分。

4

3 回答 3

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简单地隐藏由于重定向失败导致的任何错误消息,and&&运算||符根据先前命令的成功或失败有条件地执行命令。

更新

in 的空间(call )很关键,允许“null op”不返回错误(errorcode=0)。去掉空格,(call)命令返回一个错误(errorcode=1),这将破坏锁定检测算法。有趣的是,没有空格的表单会返回错误而不会生成错误消息。我相信这两个命令是清除或设置批处理错误代码的最有效方法。

于 2013-06-21T02:46:03.543 回答
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:someuserpw@someftpsite.com:21" "put H:\uploaded\!b! /home/user/!b!" "exit"||echo !b! uploaded successfully>log.txt

GOTO:checkformovfile

:eof
于 2013-06-23T18:03:27.160 回答
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
于 2017-01-25T13:53:04.253 回答