对文件移动专家的更新,但是未必所有人喜欢,所以仍保留第一版在上面,另开一楼贴2.0版。
文件移动专家2.0
代码
#Requires AutoHotkey v2.0
#SingleInstance Force
global allcopyed
global activedir
global clipold
kk:=1
;获取当前文件的两重父文件夹
{
activedir:=Explorer_GetPath()
SplitPath activedir , , &activedirpapa
SplitPath activedirpapa , , &activediryaya
}
;获取选中的文件、文件夹列表
{
clipold:=A_Clipboard
A_Clipboard:=""
sendinput "^c"
allcopyed:=""
ClipWait(0.2)
ClipSaved := ClipboardAll()
A_Clipboard := ClipSaved
ClipSaved := ""
allcopyed:=A_Clipboard
A_Clipboard:=""
;msgbox(allcopyed activedir activedirpapa activediryaya)
}
{
global WinID := WinExist("A")
ContextMenu := Menu()
{ ContextMenu.insert(,"包裹到新文件夹", foldtonew)
;如要添加自定义路径,可复制本行和下一行,只修改其中路径即可
ContextMenu.SetIcon(kk "&", "shell32.dll", 301)
kk++
ContextMenu.insert(,activediryaya, MenuHandler) ;如要添加自定义路径,可复制本行和下一行,只修改其中路径即可
ContextMenu.SetIcon(kk "&", "shell32.dll", 147)
kk++
ContextMenu.insert(,activedirpapa, MenuHandler) ;如要添加自定义路径,可复制本行和下一行,只修改其中路径即可
ContextMenu.SetIcon(kk "&", "shell32.dll", 147)
kk++
ContextMenu.Add
kk++
}
;---------------资源管理器-------------------------
For openedwindows in ComObject("shell.Application").windows
{
This := openedwindows.Document.Folder.Self.Path
ContextMenu.insert(,This, MenuHandler)
ContextMenu.SetIcon(kk "&", "shell32.dll", 5)
kk++
}
openedwindows := "" ;清空变量
;去除当前文件夹
ContextMenu.Delete(activedir)
kk--
;---------------Total Commander-------------------
if WinExist("ahk_class TTOTAL_CMD")
{
TCPath := WinGetProcessPath("ahk_class TTOTAL_CMD")
cm_CopySrcPathToClip := 2029 ;Total Commander 内部代码
cm_CopyTrgPathToClip := 2030
ClipSaved := ClipboardAll()
A_Clipboard := ""
SendMessage(1075, cm_CopySrcPathToClip, 0, , "ahk_class TTOTAL_CMD")
ContextMenu.Add
kk++
ContextMenu.insert(,A_Clipboard, MenuHandler)
ContextMenu.SetIcon(A_Clipboard, TCPath, 1)
kk++
SendMessage(1075, cm_CopyTrgPathToClip, 0, , "ahk_class TTOTAL_CMD")
ContextMenu.insert(,A_Clipboard, MenuHandler)
ContextMenu.SetIcon(A_Clipboard, TCPath, 1)
kk++
A_Clipboard := ClipSaved
ClipSaved := ""
}
;--------------常用文件夹-------
ContextMenu.Add
ContextMenu.Add("常用路径", nothing)
KK:=kk+2
ContextMenu.insert(,"C:\miniapp", MenuHandler) ;如要添加自定义路径,可复制本行和下一行,只修改其中路径即可
ContextMenu.SetIcon(kk "&", "shell32.dll", 44)
kk++
ContextMenu.insert(,"G:\代码库\自写软件\clauch增强\ahks", MenuHandler)
ContextMenu.SetIcon(kk "&", "shell32.dll", 44)
kk++
;ContextMenu.Add("%UserProfile%\", MenuHandler) ;用户文件夹
;ContextMenu.SetIcon("%UserProfile%\", "shell32.dll", 44)
;------------------------------
;获取最近文件夹5个
ContextMenu.Add
kk++
{
k:=0
filesget:=""
Loop Files, "C:\Users\" A_UserName "\AppData\Roaming\Microsoft\Windows\Recent\*.lnk", "F"
{
vPath := A_LoopFilePath
FileGetShortcut(vPath, &vTarget)
vAttrib := FileExist(vTarget)
if InStr(vAttrib, "D")
{
if ! InStr(filesget, vTarget "`r`n")
{
ContextMenu.insert(,vTarget, MenuHandler)
ContextMenu.SetIcon(kk "&", "shell32.dll", 21)
kk++
k++
filesget.=vTarget "`r`n"
}
;msgbox(filesget)
}
if k-4>0
break
}
}
ContextMenu.Show
ContextMenu.Delete
}
#HotIf ;关闭上下文相关性
nothing(ItemName, ItemPos, MyMenu)
{
return
}
foldtonew(ItemName, ItemPos, MyMenu)
{
global activedir
global allcopyed
global clipold
if ! clipold
ItemName:=activedir "\新建文件夹"
else
{
clipold:= SubStr(clipold, 1 , 100)
clipold := RegExReplace(clipold, "[`t`"!@#$%^&*()\-+=<>?:{}|,\/;'\\[\]·~]+" , , , -1, 1)
clipold := StrReplace(clipold, "`r", , , , -1) ; 去除回车
clipold := StrReplace(clipold, "`n", , , , -1) ; 去除回车
ItemName:=activedir "\" clipold
}
dircreate ItemName
Loop parse, allcopyed, "`n", "`r"
{
if ! DirExist(A_LoopField)
FileMove A_LoopField, ItemName "\" , 0
else
{
SplitPath A_LoopField , &OutFileName
DirMove A_LoopField, ItemName "\" OutFileName, 0
}
}
}
MenuHandler(ItemName, ItemPos, MyMenu)
{
global allcopyed
WinActivate "ahk_id" WinID
errorfind:=0
if allcopyed
{
Loop parse, allcopyed, "`n", "`r"
{
try
{
;msgbox A_LoopField
if ! DirExist(A_LoopField)
FileMove A_LoopField, ItemName "\" , 0
else
{
SplitPath A_LoopField , &OutFileName
DirMove A_LoopField, ItemName "\" OutFileName, 0
}
}
catch
errorfind++
}
if errorfind
msgbox errorfind "个文件未成功移动,大概是因为有重复文件"
}
else
{
try
{
if ControlGetEnabled("ToolbarWindow323", WinID) = 1 or ControlGetEnabled("ToolWindow324", WinID) = 1
{
Send "!d"
Sleep 100 ;等待获取焦点,如果设为 50 ,在 chrome 中另存为会出现焦点错误
addressbar := ControlGetFocus("A") ; 按下 alt+D 之后的焦点为地址栏
ControlSetText(ItemName, addressbar, "A")
ControlSend("{Enter}", addressbar, "A")
ControlFocus("Edit1", "A") ;焦点移回到 Edit1
}
}
catch TargetError
{
FolderPath := ItemName
OldText := ControlGetText("Edit1", "A") ;读取当前 Edit1 控件中的文件名
ControlFocus "Edit1", "A"
Loop 5
{
ControlSetText FolderPath, "Edit1", "ahk_id" WinID
Sleep(50)
CurControlText := ControlGetText("Edit1", "ahk_id" WinID)
if (CurControlText = FolderPath)
break
}
Sleep 50
ControlSend "{Enter}", "Edit1", "A"
Sleep 50
If !OldText ;插入原始文件名
return
Loop 5
{
ControlSetText OldText, "Edit1", "A"
Sleep 50
CurControlText := ControlGetText("Edit1", "A")
if (CurControlText = OldText)
break
}
}
}
}
Explorer_GetPath() {
winClass := WinGetClass(hWnd := WinExist("A"))
if !(winClass ~= "(Cabinet|Explore)WClass")
return
for window in ComObject("Shell.Application").Windows
if (hWnd = window.hWnd)
return window.Document.Folder.Self.Path
}