Kontextmenüeintrag (Dateiexplorer) - Infos markierte Dateien in Zwischenablage kopieren

    • Offizieller Beitrag

    Mich hat es schon immer genervt, dass in Windows standardmäßig keine Funktion enthalten ist, den kpl. Pfad einer markierten Datei im Explorer auszugeben.
    Da ich das jedoch häufig verwende und keine Lust habe mir für diese eine Funktion ein extra Tool zu installieren, habe ich selbst eine Anwendung dafür erstellt.
    Damit es nicht zu "nackig" ist, besteht folgender Funktionsumfang:
    Kopiere in Zwischenablage:
    - den/die kompletten Dateipfad(e) der markierten Datei(en)
    - nur den/die Dateinamen
    - nur den Ordnerpfad
    - die Größe(n) der markierten Datei(en) ==> Ausgabe: Dateiname @TAB Dateigröße (in Bytes)

    Dank eurer Hilfe habe ich auch den richtigen Registryschlüssel gefunden um das Skript im Kontextmenü eintragen zu lassen. :thumbup:

    Und hier nun das Produkt, Einsatz natürlich nur kompiliert möglich (Es sei denn ihr tragt in der Registry den AutoIt3.exe - Aufruf mit dem Skript als Parameter ein, aber bin mir grad nicht sicher, ob _Singleton dann auch wirkt).

    Explorer_GetSelected(1.0).au3
    [autoit]


    ; ===============================================================
    ; == Registrieren im Kontextmenü des Explorers für alle Dateien
    ; == Schlüssel: HKEY_CLASSES_ROOT\*\shell\CMD
    ; == Wert: (Standard) = "Name_des_Menüeintrages"
    ; == Schlüssel: HKEY_CLASSES_ROOT\*\shell\CMD\COMMAND
    ; == Wert: (Standard) = "Pfad_zum_kompilierten_Skript"
    ; ===============================================================

    [/autoit] [autoit][/autoit] [autoit]

    #Region - TimeStamp
    ; 2011-09-11 13:37:20 v 1.0
    #EndRegion - TimeStamp
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _Singleton(@ScriptName) ; == sonst erfolgt Skriptaufruf für jede markierte Datei

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)
    Local $aDeskSize[2] = [@DesktopWidth,@DesktopHeight]
    Local $aMPos = MouseGetPos()
    Local $x = $aMPos[0], $y = $aMPos[1]
    Local $iWGUI = 120, $iHGUI = 85
    If $x + $iWGUI > $aDeskSize[0] Then
    $x = $aDeskSize[0] - $iWGUI
    EndIf
    If $y + $iHGUI > $aDeskSize[1] Then
    $y = $aDeskSize[1] - $iHGUI
    EndIf
    Local $GUI = GUICreate('', $iWGUI, $iHGUI, $x, $y, BitOR($WS_POPUP,$WS_BORDER))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_close')
    Local $cLV = GuiCtrlCreateListView('LV', 0, 0, $iWGUI, $iHGUI, BitOR($LVS_NOCOLUMNHEADER,$LVS_SINGLESEL), BitOR($LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
    _GUICtrlListView_SetColumnWidth(GUICtrlGetHandle($cLV), 0, $LVSCW_AUTOSIZE_USEHEADER)
    Local $cFull = GUICtrlCreateListViewItem('kpl. Dateipfade', $cLV)
    GUICtrlSetOnEvent(-1, '_OnClick')
    Local $cFile = GUICtrlCreateListViewItem('Dateinamen', $cLV)
    GUICtrlSetOnEvent(-1, '_OnClick')
    Local $cPath = GUICtrlCreateListViewItem('Pfadname', $cLV)
    GUICtrlSetOnEvent(-1, '_OnClick')
    Local $cSize = GUICtrlCreateListViewItem('Dateigrößen', $cLV)
    GUICtrlSetOnEvent(-1, '_OnClick')

    [/autoit] [autoit][/autoit] [autoit]

    ; == Markierte Datei(en) auslesen
    Global $aSelected = _ActiveExplorer_GetFilesSelected()
    Switch $aSelected[0]
    Case 0
    Exit MsgBox(0, 'Achtung', 'Keine Datei ausgewählt im Ordner' & @CRLF & $aSelected[1])
    Case 1
    GUICtrlSetData($cFull, 'kpl. Dateipfad')
    GUICtrlSetData($cFile, 'Dateiname')
    GUICtrlSetData($cSize, 'Dateigröße')
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _close()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _OnClick()
    Local $sRet = ''
    Switch @GUI_CtrlId
    Case $cFull
    For $i = 2 To $aSelected[0]+1
    $sRet &= $aSelected[1] & '\' & $aSelected[$i] & @CRLF
    Next
    Case $cFile
    For $i = 2 To $aSelected[0]+1
    $sRet &= $aSelected[$i] & @CRLF
    Next
    Case $cPath
    $sRet = $aSelected[1]
    Case $cSize
    For $i = 2 To $aSelected[0]+1
    Local $iSize = FileGetSize($aSelected[1] & '\' & $aSelected[$i])
    $sRet &= $aSelected[$i] & @TAB & $iSize & @CRLF
    Next
    EndSwitch
    ClipPut($sRet)
    _close()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _ActiveExplorer_GetFilesSelected
    ; Description......: Erstellt ein Array mit
    ; - Anzahl der markierten Dateien
    ; - dem Pfad des aktiven Explorerfensters und
    ; - dem/den Pfad/en der markiert/en Datei/en
    ; Parameter(s).....: keine
    ; Requirement(s)...: offenes Explorerfenster
    ; Return Value(s)..: Array mit den Daten, $a[0] = Anzahl, $a[1] = Ordnerpfad, $a[2..] = Dateiname
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _ActiveExplorer_GetFilesSelected()
    Local $oShell = ObjCreate("Shell.Application")
    Local $oExplorer, $sPath, $oFolderView, $iCount, $n = 2
    For $i = 0 To $oShell.Windows.Count - 1
    $oExplorer = $oShell.Windows($i)
    $sPath = StringReplace(StringReplace(StringTrimLeft($oExplorer.LocationURL, 8), '%20', ' '), '/', '\')
    If WinGetTitle('[ACTIVE]') = $sPath Then ExitLoop
    Next
    $oFolderView = $oExplorer.Document.SelectedItems()
    $iCount = $oFolderView.Count
    Local $aOut[$iCount +2]
    $aOut[0] = $iCount
    $aOut[1] = $sPath
    If $iCount = 0 Then
    ReDim $aOut[3]
    $aOut[2] = 'NO FILE SELECT'
    Else
    For $oFolderItem In $oFolderView
    $aOut[$n] = $oFolderItem.Name
    $n += 1
    Next
    EndIf
    Return $aOut
    EndFunc ; ==>_ActiveExplorer_GetFilesSelected

    [/autoit]
  • Prima, ist gleich eine umfassende Lösung geworden.

    Nur zur Info: Eine ("nackige") Lösung von MS gibt es auch, falls es mal schnell gehen muss:
    Ab Vista wurde das Kontextmenü (Rechtsklick mit der Maus) um einige Funktionen erweitert. Eine davon ist, vor dem Rechtsklick die Umschalttaste (Shift) zu drücken. Hierdurch erhält man zum Teil andere Einträge, als wenn man die Umschalttaste zuvor nicht gedrückt hat:
    SHIFT-Taste gedrückt halten, mit der rechten Maustaste Datei anklicken und im Kontextmenü "Als Pfad kopieren" anwählen.
    Oder: Rechtsklick - Eigenschaften - Sicherheit, dort erste Zeile "Objektname" markieren, kopieren.

    MfG ThPfund

    "Es könnte alles so einfach sein..."