haemse
Goto Top

Geöffnete Datei in Zwischenablage kopieren

Hallo,

wenn ich im workflow an mehreren Dateien gleichzeitig arbeite (zB. Word, PDF, Excel) um diese dann per Mail zu verschicken, muss ich diese nach dem Speichern immer am Speicherort aufsuchen, wenn ich sie per E-Mail verschicken möchte.

Gibt es eine Möglichkeit, die Datei gleich im bearbeitenden Programm in die Zwischenablage zu bringen um sie dann mittels "Einfügen" im Mail-Client ins E-Mail einzufügen?

Das wäre extrem praktisch.

lg haemse

Content-ID: 224654

Url: https://administrator.de/contentid/224654

Ausgedruckt am: 05.11.2024 um 23:11 Uhr

colinardo
Lösung colinardo 16.12.2013 aktualisiert um 19:14:09 Uhr
Goto Top
Hallo heamse,
die Programme bringen doch solch eine Funktion direkt mit. Z.B. Word 2010 unter Datei > Speichern und Senden > Per E-Mail Senden.
Ähnliche Funktionen sind in den anderen Office-Programme und auch in Acrobat zu finden...

Grüße Uwe
haemse
haemse 18.12.2013 um 19:44:14 Uhr
Goto Top
Ja schon, nur wenn ich mehrere Dateien in dieses Email packen möchte wäre oben beschriebenes extrem praktisch. Auch für andere Dinge ...

Also wenn ihr Ideen habt ... nur zu ;)
Hilfloser-Anwender
Hilfloser-Anwender 07.12.2023 aktualisiert um 13:16:50 Uhr
Goto Top
Hallo,
ich suche ebenfalls nach so einer Lösung,sodass man nach einem Download direkt diese Datei NACH dem ÖFFNEN direkt in die Zwischenablage bekommt zum weitergeben oder auch speichern in einem Ordner.

MIt dem Vorschlag Teilen oder per Mail senden, kann man z. B. nur eine Datei in eine neue Mail bekommen.


Outlook selbst hat so eine Funktion,
diese nennt sich Datei anfügen, hier sieht man die gerade geöffneten Dateien.

So etwas hätte ich gerne Programübergreifend, um z. B. Excel, PDF, Word einfach in einem Speicher-Ordner auf dem 2 Bildschirm zu übertagen.
colinardo
colinardo 08.12.2023 aktualisiert um 16:52:05 Uhr
Goto Top
Servus @Hilfloser-Anwender, willkommen auf Administrator.de!
Mit etwas Powershell lässt sich so etwas auch selbst mit relativ wenig Aufwand realisieren.
Folgender Code liest die Pfade der Dokumente einer Auswahl an gerade geöffneter Anwendungen aus, zeigt einen Auswahl-Dialog in dem man eine oder mehrere Dokumente auswählen kann und kopiert diese dann in die Zwischenablage, von wo aus sie etwa im Explorer oder anderen Anwendungen eingefügt werden können.
Für das Beispiel liest es geöffnete Dokumente folgender Anwendungen aus: Word, Excel, PowerPoint, Visio, Publisher, Adobe Acrobat/Reader (pdf), für mehr hatte ich gerade nicht genug Zeit, weitere lassen sich aber bei Bedarf ergänzen.
Add-Type -A System.Windows.Forms
Add-Type –MemberDefinition '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -name Window -namespace W32  
# hide console
[void][W32.Window]::ShowWindow((Get-Process -id $pid).MainWindowHandle, 0)

# function to get pathes of currently opened office files
Function Get-OpenedOfficeFiles {
    # Powerpoint
    try{
        $pp = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Powerpoint.Application')  
        $pp.Presentations | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($pp)
    }catch{}
    # Visio
    try{
        $visio = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Visio.Application')  
        $visio.Documents | ? ObjectType -eq 10 | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($visio)
    }catch{}
    # Excel
    try{
        $excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application')  
        $excel.Workbooks | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
    }catch{}
    # Word
    try{
        $word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Word.Application')  
        $word.Documents | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($word)
    }catch{}
    # Publisher
    try{
        $pub = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Publisher.Application')  
        $pub.Documents | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($pub)
    }catch{}
    # Acrobat (pdf)
    try{
        $acro = New-Object -Com "AcroExch.App"  
        $numdocs = $acro.GetNumAVDocs()
        if ($numdocs){
            0..($numdocs-1) | %{
                $js = $acro.GetAVDoc($_).GetPDDoc().GetJSObject()
                [Type]::GetType($js).InvokeMember('Path',[System.Reflection.BindingFlags]::GetProperty,$null,$js,$null) -replace '^/' -replace '/','\' -replace '^(\w+)(?=\\)','$1:'  
                [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($js)
            }
        }
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($acro)
    }catch{}
    [gc]::collect()
}

# get currently opened files
$files = Get-OpenedOfficeFiles | out-gridview -Title "Choose files to copy to clipboard" -PassThru  
if ($files){
    # Copy file list to clipboard
    [System.Windows.Forms.Clipboard]::SetFileDropList($files)
    [System.Windows.Forms.MessageBox]::Show("Files were copied to clipboard!","Information",0,64)  
}else{
    [System.Windows.Forms.MessageBox]::Show("No files selected!","Information",0,48)  
}
Der Dialog ist jetzt nur die vorgefertige Version der Powershell, das lässt sich aber wenn man möchte auch hübscher mit einem eigenen Dialog präsentieren das wäre auch kein Problem.

Man kann diese Dateien natürlich auch direkt an eine Outlook-Nachricht anhängen und diese anzeigen wenn man Zeilen 58-59 durch diese Zeilen austauscht:
$ol = New-Object -Com Outlook.Application
$mail = $ol.CreateItem(0)
$files | %{[void]$mail.Attachments.Add($_)}
$mail.Display()
Lässt sich alles an eigene Bedürfnisse anpassen. face-smile.

Grüße Uwe
Hilfloser-Anwender
Hilfloser-Anwender 09.12.2023 um 13:52:36 Uhr
Goto Top
Hallo Uwe,
ich danke Dir sehr für den ausführlichen Beitrag.
Das muß ich mir die Tage mal genauer ansehen, ob ich daraus etwas basteln kann.
Bin ja zu 99% Anwender und nicht Programmierer.
Leider ist das so,
mir fehlt die Zeit solche wichtigen Sachen zu erlernen und dann auch noch zu verstehen.

Hatte mehr gehofft, das jemand eine Erweiterung, Plugin etc. kennt, das man einfach in die Programme oder in das Kontextmenü einbindet.
So nach dem Motto, im Explorer rechte Maustaste, Datei speichern und dort ist dann eine Liste mit den gerade geöffneten Dokumenten.
colinardo
colinardo 10.12.2023, aktualisiert am 19.12.2023 um 17:45:00 Uhr
Goto Top
Zitat von @Hilfloser-Anwender:
Hatte mehr gehofft, das jemand eine Erweiterung, Plugin etc. kennt, das man einfach in die Programme oder in das Kontextmenü einbindet.
So nach dem Motto, im Explorer rechte Maustaste, Datei speichern und dort ist dann eine Liste mit den gerade geöffneten Dokumenten.

Mit kleiner Erweiterung ist auch das kein Problem. Habe dir das einmal zusammengestellt:

back-to-top1. Skript abspeichern

(z.B. als "C:\Program Files\insertopenfiles\insertopenfiles.ps1")

param(
    [Parameter(mandatory=$true)][string]$destination
)
# hide console
Add-Type –MemberDefinition '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -name Window -namespace W32  
[void][W32.Window]::ShowWindow((Get-Process -id $pid).MainWindowHandle, 0)
Add-Type -A System.Windows.Forms
Add-Type -A System.Drawing

# function to get pathes of currently opened office files
Function Get-OpenedOfficeFiles {
    # Powerpoint
    try{
        $pp = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Powerpoint.Application')    
        $pp.Presentations | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($pp)
    }catch{}
    # Visio
    try{
        $visio = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Visio.Application')    
        $visio.Documents | ? ObjectType -eq 10 | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($visio)
    }catch{}
    # Excel
    try{
        $excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application')    
        $excel.Workbooks | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
    }catch{}
    # Word
    try{
        $word = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Word.Application')    
        $word.Documents | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($word)
    }catch{}
    # Publisher
    try{
        $pub = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Publisher.Application')    
        $pub.Documents | select -Expand Fullname
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($pub)
    }catch{}
    # Acrobat (pdf)
    try{
        $acro = New-Object -Com "AcroExch.App"    
        $numdocs = $acro.GetNumAVDocs()
        if ($numdocs){
            0..($numdocs-1) | %{
                $js = $acro.GetAVDoc($_).GetPDDoc().GetJSObject()
                [Type]::GetType($js).InvokeMember('Path',[System.Reflection.BindingFlags]::GetProperty,$null,$js,$null) -replace '^/' -replace '/','\' -replace '^(\w+)(?=\\)','$1:'    
                [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($js)
            }
        }
        [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($acro)
    }catch{}
    [gc]::collect()
}

# get currently opened files
$files = Get-OpenedOfficeFiles
# if open files werde found
if ($files){
    # function which copies files to destination
    function InsertFiles {
        $lb.CheckedItems | Copy-Item -Destination $destination -Force
        $form.Close()
    }

    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '600,400'  
        Text = 'Insert open files'  
        add_Load = {
           $lb.Items.AddRange(@($files))
        }
    }
    $lb = New-Object System.Windows.Forms.CheckedListBox -P @{
        Size = '580,350'  
        Location = '10,10'  
        CheckOnClick = $true
        TabIndex = 0
        Font = [System.Drawing.Font]::new('Calibri',11)  
        Anchor = 'Top,Left,Right,Bottom'  
        add_SelectedIndexChanged = {
            $btnInsert.Enabled = $lb.CheckedItems.Count -gt 0
        }
        add_KeyDown = {
            if($_.KeyCode -eq [System.Windows.Forms.Keys]::Enter){
                InsertFiles
            }
        }
    }
    $btnInsert = New-Object System.Windows.Forms.Button -p @{
        Text = 'Insert'  
        Size = '180,30'  
        Location = '410,360'  
        Anchor = 'Bottom,Right'  
        Enabled = $false
        TabIndex = 1
        add_Click = {
            if ($lb.CheckedItems.Count -gt 0 ){
               InsertFiles
            }
        }
    }
    $btnSelectAll = New-Object System.Windows.Forms.Button -p @{
        Text = 'Select / Deselect all'  
        Location = '10,360'  
        Size = '150,30'  
        Anchor = 'Left,Bottom'  
        TabIndex = 2
        add_Click = {
            $checked = $lb.CheckedItems.Count -gt 0
            0..($lb.Items.Count-1) | %{$lb.SetItemChecked($_,!$checked)}
            $btnInsert.Enabled = $lb.CheckedItems.Count -gt 0
        }
    }
    $form.Controls.AddRange(@($lb,$btnSelectAll,$btnInsert))
    [void]$form.ShowDialog()
}else{
    [System.Windows.Forms.MessageBox]::Show("No open files detected!","Information",0,48)  
}

back-to-top2. Registry-Eintrag für das Kontextmenü im Explorer anlegen

Als *.reg speichern und per Doppelklick ausführen (Pfad zum Skript bei abweichendem Pfad von oben anpassen)

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\Insert open files\command]
@="powershell -EP Bypass -File \"C:\\Program Files\\insertopenfiles\\insertopenfiles.ps1\" \"%1\""  

back-to-top3. Skript in Aktion:


Das Kontextmenü von Ordnern enthält nun den neuen Eintrag

screenshot

Welcher das Skript triggert und einen Dialog zur Auswahl einer oder mehrere geöffneter Dateien zur Wahl stellt:

screenshot

Nach Klick auf Insert werden die ausgewählten Dateien dann in den Ordner kopiert welcher im Explorer ausgewählt wurde.

Viel Spaß damit
Grüße Uwe
Hilfloser-Anwender
Hilfloser-Anwender 16.12.2023 um 16:29:14 Uhr
Goto Top
Hallo,
ich danke Dir für diese sehr gute, verständliche Ausführung!
Hilfloser-Anwender
Hilfloser-Anwender 16.12.2023 um 16:55:12 Uhr
Goto Top
Hallo Uwe,
leider muß ich nochmal fragen....

Ich habe den Pfad im Registrieungseditor angelegt.
Dort habe ich Standard und dann alles mit dem @ rein kopiert.
Den Eintrag habe ich so im Kontextmenü erhalten. Soweit ok.

Das Skript habe ich wie oben aufgeführt mit dem Texteditor erstellt und dann mit der Dateiendung PS1 gespeichert. (kein TXT mehr vorhanden!)
Hier habe ich auch die von Dir vorgegebene Ordernstrucktur gewählt. C Programme ...

Wenn ich das jetzt ausführe erhalte ich die Fehlermeldung "Anwendung nicht gefunden"

Warum hast Du \\ nach C und vor der insert PS1 bei dem Registryeintrag?

Ich verwende Windows 10 mit Office 2019

Danke
Boris
colinardo
colinardo 16.12.2023 aktualisiert um 17:10:30 Uhr
Goto Top
Zitat von @Hilfloser-Anwender:
Ich habe den Pfad im Registrieungseditor angelegt.
Dort habe ich Standard und dann alles mit dem @ rein kopiert.
Den Eintrag habe ich so im Kontextmenü erhalten. Soweit ok.
Das war hier leider die falsche Vorgehensweise.
Du musst den obigen Inhalt als *.reg speichern und dann per Doppelklick ausführen, dann wird auch das Escaping des Eintrags richtig interpretiert und die Pfade werden automatisch angelegt!

Warum hast Du \\ nach C und vor der insert PS1 bei dem Registryeintrag?
Das ist nötig wenn man diesen Eintrag über eine *.reg Datei importiert.

Wenn man es stattdessen von Hand in die Registry eintragen will, muss der Standard-Wert folgendermaßen eingetragen werden:
powershell -EP Bypass -File "C:\Program Files\insertopenfiles\insertopenfiles.ps1" "%1"  

Grüße Uwe
Hilfloser-Anwender
Hilfloser-Anwender 19.12.2023 um 17:24:53 Uhr
Goto Top
Hallo Uwe,

zu oben, in der Formel fehlen zum Schluß die ", zumindest sagt das der PowerShell Editor.??

Mit der Änderung im Reg Editor, geht es jetzt schon einen Schritt weiter.
Das Powershell öffnet sich kurz und geht sofort wieder zu.
ZUr Auswahl komme ich mit Word und Excel nicht, Dein Fenster sehe ich gar nciht.
Benötigt man dafür noch eine Erweiterung oder so?

Selbst wenn ich die Sicherheitsrichtlinien per Set-ExecutionPolicy RemoteSigned setze und per Get-ExecutionPolicy -List prüfe.
Dieser setzt auch nur local auf remote signed curent user kann ich nicht ändern.


Danke
colinardo
colinardo 19.12.2023 aktualisiert um 18:01:02 Uhr
Goto Top
Zitat von @Hilfloser-Anwender:

Hallo Uwe,

zu oben, in der Formel fehlen zum Schluß die ", zumindest sagt das der PowerShell Editor.??
In welcher "Formel", hier steht keine Formel? Klappt hier in meinen Tests einwandfrei, kein Syntaxfehler erkennbar. Da wird die beim Kopieren des Codes ein Fehler unterlaufen sein.

Das Powershell öffnet sich kurz und geht sofort wieder zu.
ZUr Auswahl komme ich mit Word und Excel nicht, Dein Fenster sehe ich gar nciht.
Benötigt man dafür noch eine Erweiterung oder so?
Nein.
Selbst wenn ich die Sicherheitsrichtlinien per Set-ExecutionPolicy RemoteSigned setze und per Get-ExecutionPolicy -List prüfe.
Dieser setzt auch nur local auf remote signed curent user kann ich nicht ändern.
Das permanente Ändern ist nur über eine elevated PowerShell möglich, ist hier aber nicht nötig da die Befehlzeile für die Powershell schon die Bypass Policy definiert und somit umgeht.

Mach es so wie in der Anleitung oben beschrieben und es funktioniert auf Anhieb.
Lass deine Experimente mit dem manuellen Registry-Gefrickel und folge exakt der Anleitung.

Und bitte keine weitere Kaperung des Beitrags, dieser wurde von einem anderen User verfasst hat schon diverse Jahre auf dem Buckel und wurde gelöst.

Bei abschließenden Fragen das persönliche Nachrichtensystem nutzen. Merci.

-Closed-