2015-02-13 3 views
0

В настоящее время я использую скрипт для загрузки pdf-файла, изменения его в txt-файл, извлечение информации из txt-файла для переименования pdf-файла и сохранения его в определенной папке. Помимо VBA я использую пару пакетных скриптов для этого. Временный pdf-файл сначала сохраняется в папке, а затем удаляется из папки.VBA batch script - обновить папку

Если я иду в папку, мне нужно обновить его вручную, тогда я больше не буду видеть файл. Я посмотрел в Интернете, чтобы узнать, есть ли пакетный скрипт или vba для обновления или обновления папки, но я не нашел ничего полезного. Есть ли кто-то, кто знает, как это можно сделать через VBA или пакетный скрипт?

С уважением, Richard

Отредактировано здесь в 22:18 @Rojo и другие: Я ищу код, который освежит папку в фоновом режиме. Приведенный ниже код перейдет в папку, если он открыт, обновите его и верните в Outlook. Не используйте его из редактора VBA в Outlook, потому что он перейдет в раздражающий цикл, который вы можете просто остановить, нажав на Outlook. Но используйте кнопку или какой-либо другой код для выполнения кода.

Sub ActivateOutlook() 
    On Error Resume Next 
    Set objOutlook = GetObject(, "Outlook.Application") 
    If err.Number = 429 Then 
     MsgBox "Outlook is not running" 
    Else 
     AppActivate objOutlook.ActiveExplorer.Caption 
    End If 
End Sub 

Sub RefreshSavedFiles() 
Dim oShellObject 
Set oShellObject = CreateObject("Wscript.Shell") 
strFolder = "C:\Users\User\Documents\PDF files saved" 
oShellObject.AppActivate strFolder 
oShellObject.SendKeys "{F5}" 
ActivateOutlook 
End Sub 
+0

Как насчет отправки обновления клавишу F5 в открытое окно проводника с помощью [SendKeys] (https://msdn.microsoft.com/en-us/library/office/gg278655 (v = office.15). aspx) –

+0

@DavidRuhmann Спасибо за предложение, но окно не должно быть открытым, обновление папки должно выполняться в фоновом режиме. Извините, что было неясно. – RHBerendsen

+0

@RHBerendsen Вы имеете в виду, что Explorer отображает * старое * содержимое папки, даже если оно не открыто во время запуска сценариев, и вы не посещаете эту директорию до тех пор, пока она не появится? – rojo

ответ

0

Глядя на ответы от Рохо, а также Дэвид Ruhmann и не будучи в состоянии найти что-нибудь полезное в Интернете по этому вопросу, а также не на известных сайтах, как переполнение стека, то код ниже будет лучшей альтернативой моему вопросу.

Код ниже обновит папку почти незаметно, я говорю почти потому, что иногда сообщение покажет, что папка не открыта, это произошло два раза, когда я ее протестировал. Редактировать 23.02.2015: Я добавил Do .. Loop. Пока не доводилось доводить сообщение до сих пор, я еще не получил сообщение, что папка не открыта. Таким образом, код улучшился по моему вкусу и решил, что мой собственный ответ - ответ на мой вопрос.

Что делает код? Из Outlook он откроет окно проводника в предопределенном каталоге, не показывая его, не обновит и не закроет окно за секунду и не вернется в Outlook. Я собрал и изменил код, который я нашел здесь и там, чтобы сделать его полезным для меня. Возможно, он также может быть вам полезен.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 
Const WM_CLOSE = &H10 

Private Sub CloseExplorer() 
Dim GetOpenWindow As Long 
Dim OpenFolder As String 
Dim WindowSuccesfullyClosed As Boolean 
OpenFolder = "C:\Users\User\Documents\PDF files saved" 
GetOpenWindow = FindWindow(vbNullString, OpenFolder) 
Do 
WindowSuccesfullyClosed = False 
Counter = Counter + 1 
Sleep (5) 'milliseconds 
If GetOpenWindow <> 0 Then 
PostMessage GetOpenWindow, WM_CLOSE, 0&, 0& 
WindowSuccesfullyClosed = True 
Exit Do 
End If 
Loop While Not GetOpenWindow <> 0 And Counter < 100 
If WindowSuccesfullyClosed = False Then 
MsgBox OpenFolder & " is not open." 
Else 
End If 
End Sub 

Sub ActivateOutlook() 
    On Error Resume Next 
    Set objOutlook = GetObject(, "Outlook.Application") 
    If err.Number = 429 Then 
     MsgBox "Outlook is not running" 
    Else 
     AppActivate objOutlook.ActiveExplorer.Caption 
    End If 
End Sub 

Sub RefreshSavedFiles() 
Set wsh = VBA.CreateObject("WScript.Shell") 
    Dim waitOnReturn As Boolean: waitOnReturn = True 
    Dim windowStyle As Integer: windowStyle = 0 'windowStyle = 1 when visible 
    Dim OpenFolder As String 
OpenFolder = "C:\Users\User\Documents\PDF files saved" 
wsh.Run "%windir%\explorer.exe /n," & OpenFolder, windowStyle, waitOnReturn 
wsh.AppActivate OpenFolder 
wsh.SendKeys "{F5}" 
CloseExplorer 
ActivateOutlook 
Set wsh = Nothing 
End Sub 
0

Вы просто хотите F5 окно, в принципе, не так ли? Это легко. Просто сосредоточьте его, используя WshShell.AppActivate и отправьте F5 с WshShell.SendKeys.

Возвращение фокуса к окну консоли может быть немного сложным. Самый простой способ сделать это - установить заголовок окна консоли, а затем переориентироваться на основе заголовка после выполнения обновления.

@if (@CodeSection == @Batch) @then 

:: begin batch portion 

@echo off 
setlocal 

set "focustitle=foldername" 

:: use JScript hybrid code to perform focus/sendkeys wizardry 
title Refreshing 
cscript /nologo /e:Jscript "%~f0" "%focustitle%" 
title Command Prompt 

:: Refresh complete. Put the rest of your script here. 

goto :EOF 
:: end batch portion/begin JScript chimera 
@end 

var oShell = WSH.CreateObject('Wscript.Shell'); 

oShell.AppActivate(WSH.Arguments(0)); // focus window by title 
WSH.Sleep(100); 
oShell.SendKeys('{F5}'); // F5 = refresh 
WSH.Sleep(100); 
oShell.AppActivate('Refreshing'); // re-focus console window 

Если вы не хотите возиться с вашей консоли заголовка окна, вы можете сосредоточиться на PID вместо. Однако это не так просто. Если у вас открыто несколько окон консоли, как вы определяете, какой PID принадлежит активной консоли?

Этот пример .bat скрипт, который демонстрирует нерест дочерний процесс, а затем идти по ParentProcessID линии, пока процесс корневые CMD не найден и использовать что PID. Это займет пару секунд, так как запросы WMI до Win32_Process медленны, но это то, что есть. * shrug *

С известным ПИД-индикатором cmd, все остальное легко. Активируйте свое окно, которое хотите обновить, отправьте F5, затем повторно активируйте PID.

@if (@CodeSection == @Batch) @then 

:: based on http://stackoverflow.com/a/27514649/1683264 
:: begin batch portion 

@echo off 
setlocal 

set "focustitle=code" 

:: use JScript hybrid code to perform focus/sendkeys wizardry 
cscript /nologo /e:Jscript "%~f0" "%focustitle%" 

:: Refresh complete. Put the rest of your script here. 

goto :EOF 
:: end batch portion/begin JScript chimera 
@end 

var oShell = WSH.CreateObject('wscript.shell'), 
    johnConnor = oShell.Exec('%comspec% /k @echo;'); 

// returns PID of the direct child of explorer.exe 
function getTopPID(PID, child) { 
    var proc = GetObject("winmgmts:Win32_Process=" + PID); 
    return (proc.name == 'explorer.exe') ? child : getTopPID(proc.ParentProcessID, PID); 
} 

var PID = getTopPID(johnConnor.ProcessID); 
johnConnor.Terminate(); 

oShell.AppActivate(WSH.Arguments(0)); // focus window by title 
WSH.Sleep(100); 
oShell.SendKeys('{F5}'); // F5 = refresh 
WSH.Sleep(100); 
oShell.AppActivate(PID); // re-focus console window 

С уважением, Не Ричард

+0

благодарит за код. Это кажется немного сложным. Обычно я перехожу из Outlook в папку, если она открыта. Если он не открыт, я открываю окно, чтобы проверить папку и посмотреть, находится ли временный файл в папке или нет. Разве нет способа обновить папку в фоновом режиме? – RHBerendsen

+0

Насколько мне известно, если программа специально не предназначена для прослушивания какого-то программного триггера. [Далее] (http://stackoverflow.com/questions/1220820/). – rojo

+0

Я добавил код, который я бы использовал, чтобы обновить папку и вернуться в Outlook. Ваш код слишком сложный для меня, чтобы иметь возможность изменить его на мои нужды. Я прочитал ссылку, которую вы положили, кстати. – RHBerendsen