使用 VBScript 合并 Notepad.exe 的所有打开实例并保存到 txt 文件
Use VBScript to Merge all open instances of Notepad.exe and save to txt file
我正在寻找一种在 vbscript 中查找 notepad.exe 的任何打开实例的方法,从中复制文本并创建一个包含所有这些内容的新文件并保存。
我已经编写出实际找到 运行 个实例的代码,只是无法找到从中复制文本的方法!
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
我创造了一些有用的东西 - 它有点粗糙,但可以完成工作!它本质上是使用 sendkeys 依次恢复每个记事本,复制文本,关闭文件而不保存然后将内容粘贴到新创建的 "master" 文本文件中。不过一定有更好的方法!
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
试一试,告诉我结果:
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
'***************************************************
编辑于 2016 年 3 月 31 日 @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
'***************************************************
我正在寻找一种在 vbscript 中查找 notepad.exe 的任何打开实例的方法,从中复制文本并创建一个包含所有这些内容的新文件并保存。
我已经编写出实际找到 运行 个实例的代码,只是无法找到从中复制文本的方法!
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
我创造了一些有用的东西 - 它有点粗糙,但可以完成工作!它本质上是使用 sendkeys 依次恢复每个记事本,复制文本,关闭文件而不保存然后将内容粘贴到新创建的 "master" 文本文件中。不过一定有更好的方法!
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
试一试,告诉我结果:
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
'***************************************************
编辑于 2016 年 3 月 31 日 @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
'***************************************************