我正在配置一台Windows机器来连续运行powerpoint演示。 ppt文件位于samba共享(Windows文件共享)上,并将定期更新。我需要一种方法来制作批处理文件,如果文件已被更改,将重新启动ppt幻灯片放映。批处理脚本将定期运行,并希望检查文件是否已更新,并重新启动幻灯片显示(如果有)。
如果有一种方法可以在powershell中执行此操作,那也可以。
答案 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