2

У нас есть файл в сети, который регулярно обновляется, и мне нужно, чтобы он был открыт и обновлен, но после его открытия никто другой не сможет получить к нему доступ, чтобы обновить его для меня.

поэтому я подумал, что у меня может быть скрипт, который будет:

  • скопировать файл на мой рабочий стол
  • откройте файл и подождите час
  • закрыть 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

2 ответа2

1

Вы можете захватить PID вызываемого процесса или файл, который нужно открыть с помощью WMIC, и установить идентификатор процесса в переменной, а затем использовать эту переменную с TASKKILL с помощью переключателя /PID который я разместил в примере пакетного сценария ниже, а затем еще один ниже, основанный на вашей логике, как я думаю, это должно вписываться в него, но корректировать соответственно по мере необходимости.

Эта логика создает пару динамических временных файлов, используя FOR /F для анализа идентификатора процесса, который передается во временный файл, чтобы захватить только числовое значение, которое будет использоваться с TASKKILL для уничтожения этого конкретного идентификатора процесса (т.е. переключатель /PID ).

Эта логика делает следующее:

  1. Открывает процесс \ файл
  2. Ждет час
  3. Закрывает только тот экземпляр процесса \ открытый файл


Пример пакетного скрипта

(Запустите процесс, запишите идентификатор процесса [PID] этого процесса, а затем уничтожьте этот процесс на основе того же идентификатора процесса)

Этот сценарий устанавливает переменную приложения и может потребоваться указать полный путь к приложению на компьютере (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
0

У меня есть одна идея - открыть файл в WordPad, а затем просто использовать задачу для уничтожения, которая не будет мешать открытию документов Word!

Редактировать не сработало, открыл бред.

Редактировать 2:. Использовал wordviewer.exe и моя идея сработала.

Теперь я использую задачу kill для wordviewer, и это оставляет мои другие документы word в покое!

Затем каждый цикл возвращается к новой копии файла!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .