编写批处理文件来复制网络文件并打开它然后关闭并循环

编写批处理文件来复制网络文件并打开它然后关闭并循环

我们在网络上有一个定期更新的文件,我需要打开它并保持最新,但是当它打开时,没有其他人可以访问它来为我更新它。

所以我想我可能有一个脚本可以:

  • 将文件复制到我的桌面
  • 打开文件并等待一个小时
  • 关闭 winword (仅关闭该实例而非全部)
  • 删除文件
  • 回到开始。

我找不到只关闭文件而不是关闭每个 winword 的方法。

以下是目前的脚本(已删除所有私人内容)

echo off
cls
echo.
TIMEOUT /T 10 /NOBREAK
echo.

:start

echo.
echo Updating File...
echo.

copy "T:\Shared\file.doc" "C:\Users\USERNAME\Desktop"

echo.
echo.

TIMEOUT /T 2

echo.
echo Opening File
echo.

start "File" "file.doc"

echo.
echo Waiting For One Hour... 
echo.

TIMEOUT /T 3600

echo.
echo Deleting Old File
echo.

del "C:\Users\USERNAME\Desktop\file.doc"

goto start

答案1

你可以捕捉PID要调用的进程或要打开的文件西米利都并设置进程 ID数字赋值给一个变量,然后使用该变量任务终止使用/PID我在下面发布的开关示例批处理脚本,然后根据您的逻辑在下面发布另一个脚本,我认为这需要如何适应它,但根据需要进行相应调整。

此逻辑使用以下方式创建几个动态临时文件:为/F解析通过管道传输到临时文件的进程 ID,以捕获将要使用的数值任务终止杀死该特定的进程ID(即/PID开关)。

此逻辑执行以下操作:

  1. 打开进程\文件
  2. 等了一个小时
  3. 仅关闭进程\打开的文件的那个实例


批处理脚本示例

(启动一个进程,捕获该进程的 [PID] 进程 ID,然后根据相同的进程 ID 终止该进程)

此脚本设置应用程序变量,可能需要是计算机上应用程序的完整路径(SET App=),以及该应用程序将打开的文件的完整路径等(SET AppFile=)。

@ECHO ON

:::SET App=C:\Program Files\Microsoft Office 15\root\office15\WINWORD.EXE
SET App=%windir%\%Notepad.exe
:::SET AppFile=C:\Users\User\Desktop\Test\ENTER_EXIT_List.docx
SET AppFile=C:\Users\User\Desktop\Test\List.txt

SET DynamicTempFile1=%temp%\~tmpProcessID1_%~nx0.dat
SET DynamicTempFile2=%temp%\~tmpProcessID2_%~nx0.dat
IF EXIST "%DynamicTempFile1%" DEL /Q /F "%DynamicTempFile1%"
IF EXIST "%DynamicTempFile2%" DEL /Q /F "%DynamicTempFile2%"

::start a process and pass it a file, etc. to open or process and then pipe the process ID to a temp file
WMIC PROCESS CALL CREATE "%App% %AppFile%" | FIND "ProcessId">>"%DynamicTempFile1%"

::parse out unneeded characters for only numeric values from temp file
FOR /F "DELIMS==; TOKENS=2" %%F IN (%DynamicTempFile1%) DO ECHO %%~F >> "%DynamicTempFile2%"

::sets the PID to a variable with the value in the temp file
SET /P processid= < %DynamicTempFile2%

::wait 3600 seconds or one hour and then run the taskkill command
PING /n 3600 127.0.0.1 > nul

::kill process by PID from the previously set variable
TASKKILL /PID %processid%

GOTO EOF

更多资源



根据您的逻辑编写脚本示例

这假设您正在打开并终止已复制的文件,但只需在顶部设置变量。

ECHO OFF

::://Set application full path and the app file full path that the app will open
:::SET App=%windir%\%Notepad.exe
:::SET AppFile=C:\Users\User\Desktop\Test\List.txt

SET App=C:\Program Files\Microsoft Office 15\root\office15\WINWORD.EXE
SET DesktopFolder=C:\Users\<USERNAME>\Desktop
::SET AppFile=%DesktopFolder%\file.doc
SET AppFile=C:\Users\<USERNAME>\Desktop\file.doc
SET CopyFile=T:\Shared\file.doc

SET DynamicTempFile1=%temp%\~tmpProcessID1_%~nx0.dat
SET DynamicTempFile2=%temp%\~tmpProcessID2_%~nx0.dat
IF EXIST "%DynamicTempFile1%" DEL /Q /F "%DynamicTempFile1%"
IF EXIST "%DynamicTempFile2%" DEL /Q /F "%DynamicTempFile2%"

CLS
ECHO.
TIMEOUT /T 10 /NOBREAK
ECHO.

:start

ECHO.
ECHO Updating File...
ECHO.

COPY /Y "%CopyFile%" "%DesktopFolder%"

ECHO.
ECHO.

TIMEOUT /T 2

ECHO.
ECHO Opening File
ECHO.

:::START "File" "file.doc"
::start a process and pass it a file, etc. to open or process and then pipe the process ID to a temp file
WMIC PROCESS CALL CREATE "%App% %AppFile%" | FIND "ProcessId">>"%DynamicTempFile1%"

::parse out unneeded characters for only numeric values from temp file
FOR /F "DELIMS==; TOKENS=2" %%F IN (%DynamicTempFile1%) DO ECHO %%~F >> "%DynamicTempFile2%"

::sets the PID to a variable with the value in the temp file
SET /P processid= < %DynamicTempFile2%

ECHO.
ECHO Waiting For One Hour... 
ECHO.

TIMEOUT /T 3600

ECHO.
ECHO Deleting Old File
ECHO.

::kill process by PID from the previously set variable
TASKKILL /PID %processid%

DEL /Q /F "%AppFile%"

GOTO start

答案2

我的一个想法是在写字板中打开该文件,然后只需使用任务终止功能,这样就不会干扰打开的 Word 文档!

编辑无效,打开的是乱码。

编辑 2:. 使用 wordviewer.exe 和我的想法工作。

我现在在 wordviewer 上使用任务终止功能,而我的其他 word 文档则保持不变!

然后每小时循环一次,生成文件的新副本!

相关内容