2016-03-30 2 views
1

Я ищу способ в vbscript найти любые открытые экземпляры notepad.exe, скопировать текст из них и создать новый файл, который содержит содержимое всех из них и сохранить его.Используйте VBScript для слияния всех открытых экземпляров Notepad.exe и сохранения в txt-файле

Я разработал код, чтобы на самом деле найти исполняемые экземпляры, просто не могу найти способ скопировать текст из них!

Dim objWMIService, objProcess, colProcess,WshShell 
Dim strComputer, strList 
strComputer = "." 
Set WshShell = WScript.CreateObject("WScript.Shell") 
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process") 
For Each objProcess in colProcess 
    if objProcess.Name = "notepad.exe" then 
     msgbox objProcess.processID 
     WshShell.AppActivate (objProcess.processID) 
     'copy the text from notepad into a new file.... 
    end if 
Next 

ответ

0

Я создал что-то, что работает - это немного грубо, но делает работу! Он по существу использует sendkeys для восстановления каждого блокнота по очереди, копирует текст, закрывает файл без сохранения, а затем вставляет содержимое во вновь созданный «мастер» текстовый файл. Однако должен быть лучший способ!

Dim objWMIService, objProcess, colProcess,WshShell 
Dim strComputer, strList 
strComputer = "." 
Set WshShell = WScript.CreateObject("WScript.Shell") 
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process") 
dim counter 
counter=0 
dim newid 
For Each objProcess in colProcess 

    if objProcess.Name = "notepad.exe" and objProcess.processID<>newid then 
     counter=counter+1 
     if counter=1 then 
      Dim fso, MyFile 
      Set fso = CreateObject("Scripting.FileSystemObject") 
      strPath = WshShell.SpecialFolders("Desktop")&"\"&serial&".txt" 
      Set MyFile = fso.CreateTextFile(strPath, True) 
      MyFile.Close  
      Set EngineRun = WshShell.exec("notepad.exe " & strPath) 
      newid=EngineRun.ProcessID 
      WshShell.AppActivate(newid) 
     end if 
     'msgbox objProcess.processID 
     WshShell.AppActivate (objProcess.processID) 
     WScript.Sleep 500 
     WshShell.sendkeys "% r" 

     WScript.Sleep 500 
     WshShell.sendkeys "%E"     ' edit 
     WScript.sleep 500 
     WshShell.sendkeys "a" 
     WScript.sleep 500 
     WshShell.sendkeys "%E"     ' edit 
     WScript.sleep 500 
     WshShell.sendkeys "c" 
     WScript.sleep 500 

     WScript.sleep 500 
     WshShell.sendkeys "%F"     ' edit 
     WScript.sleep 500 
     WshShell.sendkeys "x" 
     WScript.sleep 500 
     WshShell.sendkeys "n" 
     WScript.sleep 500 

     WshShell.AppActivate (newid) 

     WScript.sleep 500 
     WshShell.sendkeys vbNewLine & " --- " & objProcess.CommandLine & " --- " & vbNewLine 

     WScript.sleep 500 
     WshShell.sendkeys "%E"     ' edit 
     WScript.sleep 500 
     WshShell.sendkeys "p" 
    end if 
Next 
WshShell.AppActivate (newid) 

WScript.sleep 500 
WshShell.sendkeys "%F"     ' edit 
WScript.sleep 500 
WshShell.sendkeys "s" 
WScript.sleep 500 
WScript.sleep 500 
WshShell.sendkeys "%F"     ' edit 
WScript.sleep 500 
WshShell.sendkeys "x" 
WScript.sleep 500 


function serial() 
    strSafeDate = DatePart("yyyy",Date) & Right("0" & DatePart("m",Date), 2) & Right("0" & DatePart("d",Date), 2) 
    strSafeTime = Right("0" & Hour(Now), 2) & Right("0" & Minute(Now), 2) & Right("0" & Second(Now), 2) 
    strDateTime = strSafeDate & strSafeTime 
    serial=strDateTime 
end function 
+1

Использование 'SendKeys' всегда плохой подход к вещам, но с VBScript нет лучшего для того, что вы хотите сделать (хотя вы могли бы использовать '^ a','^c' вместо использования меню). –

+0

Я сделал это изменение, и он, безусловно, работает намного гладко! – Andrzej

1

Просто дать попробовать и сказать мне результат:

Option Explicit 
Dim Title,colItems,objItem,FilePath,ws 
Dim MyProcess,LogFile,fso,Contents 
MyProcess = "Notepad.exe" 
Title = "Merge all open instances of "& DblQuote(MyProcess) &" and save it to a text file" 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set ws = CreateObject("WScript.Shell") 
LogFile = Left(Wscript.ScriptFullName, InstrRev(Wscript.ScriptFullName, ".")) & "txt" 
If fso.FileExists(LogFile) Then 
    fso.DeleteFile(LogFile) 
End If 
Set colItems = GetObject("winmgmts:").ExecQuery("Select * from Win32_Process " _ 
& "Where Name like '%"& MyProcess &"%' AND NOT commandline like '%" & wsh.scriptname & "%'",,48) 
For Each objItem in colItems 
    FilePath = Mid(objItem.CommandLine,InStr(objItem.CommandLine,chr(34)) + 33) 
    FilePath = Replace(FilePath,chr(34),"") 
    FilePath = Trim(FilePath) 
    If Len(FilePath) > 0 Then 
     Contents = ReadFile(FilePath,"all") 
     Call WriteLog(Contents,LogFile) 
    End If 
Next 
If fso.FileExists(LogFile) Then 
    ws.run DblQuote(LogFile) 
Else 
    MsgBox "No running instances found for this process " &_ 
    DblQuote(MyProcess),vbExclamation,Title 
End If 
'************************************************** 
Function DblQuote(Str) 
    DblQuote = Chr(34) & Str & Chr(34) 
End Function 
'************************************************** 
Function ReadFile(path,mode) 
    Const ForReading = 1 
    Dim objFSO,objFile,i,strLine 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objFile = objFSO.OpenTextFile(path,ForReading) 
    If mode = "byline" then 
     Dim arrFileLines() 
     i = 0 
     Do Until objFile.AtEndOfStream 
      Redim Preserve arrFileLines(i) 
      strLine = objFile.ReadLine 
      strLine = Trim(strLine) 
      If Len(strLine) > 0 Then 
       arrFileLines(i) = strLine 
       i = i + 1 
       ReadFile = arrFileLines 
      End If 
     Loop 
     objFile.Close 
    End If 
    If mode = "all" then 
     ReadFile = objFile.ReadAll 
     objFile.Close 
    End If 
End Function 
'*************************************************** 
Sub WriteLog(strText,LogFile) 
    Dim fso,ts 
    Const ForAppending = 8 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set ts = fso.OpenTextFile(LogFile,ForAppending,True,-1) 
    ts.WriteLine strText 
    ts.Close 
End Sub 
'*************************************************** 

Редактировать на 31/03/2016 @ 10: 45

Я думаю, что это второй код может быть используется для обнаружения и редактирования любого вида vbscript, работающего на фоне!

Представьте, что VBScript работает на фоне является вирус, поэтому мы можем найти свой путь, редактировать и копировать его источник (-_ °)

Option Explicit 
Dim Title,colItems,objItem,FilePath,ws 
Dim MyProcess,LogFile,fso,Contents 
MyProcess = "wscript.exe" 
Title = "Search for all instances of "& DblQuote(MyProcess) &" and save it to a text file" 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set ws = CreateObject("WScript.Shell") 
LogFile = Left(Wscript.ScriptFullName, InstrRev(Wscript.ScriptFullName, ".")) & "txt" 
If fso.FileExists(LogFile) Then 
    fso.DeleteFile(LogFile) 
End If 
Set colItems = GetObject("winmgmts:").ExecQuery("Select * from Win32_Process " _ 
& "Where Name like '%"& MyProcess &"%' AND NOT commandline like '%" & wsh.scriptname & "%'",,48) 
For Each objItem in colItems 
    FilePath = Mid(objItem.CommandLine,InStr(objItem.CommandLine,chr(34)) + 33) 
    FilePath = Replace(FilePath,chr(34),"") 
    FilePath = Trim(FilePath) 
    If Len(FilePath) > 0 Then 
     Contents = ReadFile(FilePath,"all") 
     Call WriteLog(DblQuote(FilePath) & vbCrlf & String(100,"*") & vbCrlf &_ 
     Contents & vbCrlf & String(100,"*") & vbCrlf,LogFile) 
    End If 
Next 
If fso.FileExists(LogFile) Then 
    ws.run DblQuote(LogFile) 
Else 
    MsgBox "No running instances found for this process " &_ 
    DblQuote(MyProcess),vbExclamation,Title 
End If 
'************************************************** 
Function DblQuote(Str) 
    DblQuote = Chr(34) & Str & Chr(34) 
End Function 
'************************************************** 
Function ReadFile(path,mode) 
    Const ForReading = 1 
    Dim objFSO,objFile,i,strLine 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objFile = objFSO.OpenTextFile(path,ForReading) 
    If mode = "byline" then 
     Dim arrFileLines() 
     i = 0 
     Do Until objFile.AtEndOfStream 
      Redim Preserve arrFileLines(i) 
      strLine = objFile.ReadLine 
      strLine = Trim(strLine) 
      If Len(strLine) > 0 Then 
       arrFileLines(i) = strLine 
       i = i + 1 
       ReadFile = arrFileLines 
      End If 
     Loop 
     objFile.Close 
    End If 
    If mode = "all" then 
     ReadFile = objFile.ReadAll 
     objFile.Close 
    End If 
End Function 
'*************************************************** 
Sub WriteLog(strText,LogFile) 
    Dim fso,ts 
    Const ForAppending = 8 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set ts = fso.OpenTextFile(LogFile,ForAppending,True,-1) 
    ts.WriteLine strText 
    ts.Close 
End Sub 
'*************************************************** 
+0

Привет. Если вы добавите WScript.Sleep 500 после того, как файл журнала впервые создан, он выполняет некоторую работу. Он скопирует содержимое любого открытого экземпляра notepad.exe, у которого открыт ранее сохраненный документ. Он не поднимает тех, которые никогда не были сохранены или изменений, которые не были сохранены. Приятно и быстро! – Andrzej

+0

Привет. К сожалению, это все еще только тянет текст из экземпляров notepad.exe, которые ранее сохраняли txt-файлы открытыми - не если они только что запущены и никогда не были сохранены. – Andrzej

+1

Я понятия не имею, как вы можете поймать то, что никогда не было спасено? ? ? – Hackoo

Смежные вопросы