pipe multiple files into a single batch file (using explorer highlight)

后端 未结 5 1449
后悔当初
后悔当初 2021-01-14 19:50

I can already get a batch file to run when a user right clicks on a file type. How can I make it so that only one instance runs per highlighted group and gets all the files

相关标签:
5条回答
  • 2021-01-14 20:30

    If you create a batch file and place it on your desktop, then you can select multiple files and drop them on that batch file. They will get passed as multiple parameters to the file.

    For example, assume you put dropped.bat on your desktop, and it looks like this:

    @echo off
    echo %*
    pause
    

    Now assuming you had three files x, y and z, if you multiple-selected them and dropped them on dropped.bat, you'd see a command window come up with this text in it:

    C:\Users\alavinio\Desktop\x C:\Users\alavinio\Desktop\y C:\Users\alavinio\Desktop\z
    Press any key to continue . . .
    

    That's the closest you can get. The right-click-and-Open semantics expect to start a new executable for each selected item, and typically those executables check for another instance of themselves, and if they see one, send the parameter over there to that existing process, and terminate themselves. You can actually watch that happen with Task Manager or Process Explorer.

    0 讨论(0)
  • 2021-01-14 20:37

    Late to the party but here is my 2 cents. I had the same problem when trying to customise the behaviour of a 'Move to Dropbox Folder...' context menu command. I needed every file selected to be piped to a batch file to handle the processing in one instance.

    After some digging I found Context Menu Launcher.

    Simple enough to use. I popped singleinstance.exe in C:\Windows\system32 and created and ran a .reg file similar to below.

    Windows Registry Editor Version 5.00
    
    ; Documents
    
    [HKEY_CLASSES_ROOT\SystemFileAssociations\document\Shell\Dropbox]
    @="Move to Dropbox Folder"
    "Icon"="%SystemRoot%//system32//imageres.dll,-112"
    "MultiSelectModel"="Player"
    
    [HKEY_CLASSES_ROOT\SystemFileAssociations\document\Shell\Dropbox\command]
    @="singleinstance.exe \"%1\" \"C:\\Move to Dropbox Folder.bat\" $files --si-timeout 400"
    
    0 讨论(0)
  • 2021-01-14 20:44

    The way it works seems to have been imposed on you by the shell, and there doesn't seem to be an easy way to solve this.

    Some application would add its own menu item that would allow the app to be invoked differently (i.e. just once for the group) from how it is done generally (repeatedly for every selected item), while another one would employ the API to check its own presence and would redirect the 'open' request to its already running copy.

    Batch files aren't meant for either of these. You would probably need a different tool. Even if you would like the main job to be done by the batch file, you'd still need a way to call the batch file for processing of the item list.

    0 讨论(0)
  • 2021-01-14 20:46

    Normally a file association multi-selection invocation will start several instances of a program and the program itself would have to deal with it on its own (Or with the help of DDE or IDropTarget)

    It is going to be very hard to implement this in a batch file, this example should get you started:

    @echo off
    setlocal ENABLEEXTENSIONS
    set guid=e786496d-1b2e-4a49-87b7-eb325c8cc64d
    set id=%RANDOM%
    FOR /F "tokens=1,2,3 delims=.,:/\ " %%A IN ("%TIME%") DO SET id=%id%%%A%%B%%C
    set sizeprev=0
    
    >>"%temp%\%guid%.lock" echo %id%
    >>"%temp%\%guid%.list" echo %~1
    
    :waitmore
    >nul ping -n 3 localhost
    FOR %%A IN (%temp%\%guid%.list) DO set sizenow=%%~zA
    if not "%sizeprev%"=="%sizenow%" (
        set sizeprev=%sizenow%
        goto waitmore
    )
    FOR /F %%A IN (%temp%\%guid%.lock) DO (
        if not "%%A"=="%id%" goto :EOF
        FOR /F "tokens=*" %%B IN (%temp%\%guid%.list) DO (
            echo.FILE=%%B
        )
        del "%temp%\%guid%.list"
        del "%temp%\%guid%.lock"
        pause
    )
    

    While this works, it is a horrible horrible hack and will fail badly if you don't wait for the first set of files to be parsed before starting a new operation on another set of files.

    0 讨论(0)
  • 2021-01-14 20:47

    I'm guessing you have a group of highlighted files and you want to run some program for each file.

    @echo off
    for %%A in (%*) do echo %%A
    pause
    
    0 讨论(0)
提交回复
热议问题