Windows批处理文件 - 检查文件是否已被修改

时间:2009-10-05 15:02:11

标签: windows powershell batch-file

我正在配置一台Windows机器来连续运行powerpoint演示。 ppt文件位于samba共享(Windows文件共享)上,并将定期更新。我需要一种方法来制作批处理文件,如果文件已被更改,将重新启动ppt幻灯片放映。批处理脚本将定期运行,并希望检查文件是否已更新,并重新启动幻灯片显示(如果有)。

如果有一种方法可以在powershell中执行此操作,那也可以。

3 个答案:

答案 0 :(得分:4)

好吧,在一个批处理中,我想到的最简单的方法是定期检查文件的最后修改日期和/或其大小是否已经改变。

您可以通过以下方式获得两者:

for %%X in (myfile) do set size=%%~zX&set filetime=%%~tX

然后,您可以缓存这些值并比较它们自上次迭代后是否已更改。使用延迟(可能是几秒钟)

ping -n 11 localhost >nul 2>nul

(延迟10秒)有助于不经常检查。

所以,它可能看起来有点像:

@echo off
setlocal
set FileName=MyPresentation.pptx
set FileTime=-
:loop
for %%X in (%FileName%) do (
    if %FileTime% NEQ %%~tX (
        rem just an example
        taskkill /f powerpnt.exe
        start %FileName%
    )
    set FileTime=%%~tX
)
rem wait 5 seconds before checking again
ping -n 6 localhost >nul 2>nul
goto :loop

在PowerShell中,代码看起来并没有太大差异,除了您更容易获得相关属性:

$FileName = "MyPresentation.pptx"
$FileTime = Get-Date

# endless loop
for () {
    $file = Get-Item $FileName
    if ($FileTime -ne $file.LastWriteTime) {
        Get-Process powerpnt* | Stop-Process
        Invoke-Item $file
    }
    $FileTime = $file.LastWriteTime
    Start-Sleep 5
}

答案 1 :(得分:0)

发现这个:

@echo off
if not "%~1"=="" echo Modified date of %~1 is %~t1
<{3>} Experts exchange。也许是一个很好的起点。

答案 2 :(得分:0)

尝试下面的代码。它检查当前时间并检查文件的最后修改时间。如果两个值相同,则认为文件已更改。

@echo off &setlocal

TITLE File Monitor

Set file=Test.txt

:CheckforAlter
Set modif_time=
Set allm=

cls
for /f "tokens=1-3 delims=:,. " %%A in ("%time%") do (
  set "Hour=%%A"
  set "Min=%%B"
  set "Sec=%%C"
)

set /a Hour = Hour %% 12
if %Hour%==0 set "Hour=12"

set "Allm=%Hour%:%Min%:%Sec%"

for /f %%i in ('"forfiles /m %file% /c "cmd /c echo @ftime" "') do set modif_time=%%i
echo.
echo.
IF %modif_time%==%Allm% (
echo File was altered.
start "" "%file%"
Timeout /t 1 >nul
)
echo file wasn't modified.
GOTO CheckforAlter