Можно ли использовать nircmd для сохранения содержимого буфера обмена в переменную пакетного файла?

Можно ли использовать nircmd для сохранения содержимого буфера обмена в переменную пакетного файла?

В пакетном скрипте я хочу сохранить текст буфера обмена в переменную. Поискав, я понял, что это невозможно без сторонних инструментов. Ну, у меня есть nircmd, и одна из его команд:

«consolewrite [текст] Отправляет указанный текст на стандартный вывод (stdout).»

Я надеялся, что смогу достичь своей цели с помощью следующей простой строки:

    FOR /F "tokens=* USEBACKQ" %%F IN (`nircmd.exe consolewrite ~$clipboard$`) DO (SET varCB=%%F)

что в теории должно было бы nircmdзаписать содержимое буфера обмена в STDOUT, а затем команда for сохранила бы этот вывод в varCB. Но это не работает.

ОБНОВЛЕНИЕ: На самом деле эта строка теперь работает. Она поместит текст из буфера обмена в varCB. Должно быть, я допустил какую-то ошибку в своем первоначальном тестировании.

ОБНОВЛЕНИЕ 2: Было отмечено, что если в буфере обмена находится несколько строк текста, то приведенный выше код сохранит только последнюю строку в переменной varCB. Если в тексте буфера обмена несколько строк, вы можете сохранить каждую строку в собственной переменной с помощью следующего кода:

    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET count=1
    FOR /F "tokens=* USEBACKQ" %%F IN (`nircmd.exe consolewrite ~$clipboard$`) DO (
      SET varCB!count!=%%F
      SET /a count=!count!+1
    )
    ECHO %varCB1%
    ECHO %varCB2%
    ECHO %varCB3%
    [...]
    ENDLOCAL

(адаптировано из кода, который я скопировал давным-давно, к сожалению, не помню откуда.)

ОБНОВЛЕНИЕ 3: Также было отмечено, что мое использование термина «сторонние инструменты» выше неточно. Я просто имел в виду, что для достижения цели понадобятся другие приложения или языки сценариев (например, PowerShell или NirCMD). Конечно, некоторые из этих инструментов могут быть уже включены в Win10 и поэтому технически не являются «сторонними». Извините за это!

решение1

В пакетном скрипте я хочу сохранить текст буфера обмена в переменную. Поискав, кажется, что это невозможно без сторонних инструментов.

Мне очень жаль это говорить, но это неправда:


  • PowerShell вставить в буфер обмена:
Get-Clipboard|Foreach{$_} 

// or using aliases, shorter: gcb|?{$_}
  • Вставить VBScript в буфер обмена:
WScript.Echo CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
  • Bat + Powershell
powershell -nOp -c  "Get-Clipboard|Foreach{$_}"

  • Вам не нужны сторонние инструменты, чтобы получить содержимое буфера обмена, которое представляет собой одну или несколько строк:
@echo off 

for /f usebackq^tokens^=1*delims^=: %%i in (`(
powershell -nOp -c "gcb|%%{$_}"^)^|findstr /nr .
   `)do set "_vbCB_%%~i=%%~j" && set "_upto=%%~i"
    
for /l %%L in (1 1 %_upto%)do call echo\_vbCB_%%L: %%_vbCB_%%~L%%

  • Содержимое моего буфера обмена:


Lorem ipsum dolor sit amet. Sed iure harum et esse error et velit earum. 
Et dolor perspiciatis id veniam dolor cum galisum asperiores. 
Ab doloremque omnis sed harum explicabo ut galisum 
veniam ut voluptas facere.

Sed amet corporis eos magnam voluptatem sed dolor alias. Et facere esse 
ea voluptates odit aut alias pariatur. Aut molestiae quam et saepe 
corrupti id quia facilis. Est labore temporibus qui eaque labore ab 
ipsa voluptatibus vel dolores galisum non aliquid earum id beatae 
rerum.

Eos nobis consequatur est accusantium sapiente et illum velit et 
libero quasi est consequatur fuga ea sunt molestias. Id enim vitae 
sed dolor similique qui voluptatem autem. Aut sunt perferendis in 
aperiam aspernatur nam assumenda aliquam hic laboriosam galisum.

  • Выходы:
_vbCB_1:
_vbCB_2:
_vbCB_3: Lorem ipsum dolor sit amet. Sed iure harum et esse error et velit earum.
_vbCB_4: Et dolor perspiciatis id veniam dolor cum galisum asperiores.
_vbCB_5: Ab doloremque omnis sed harum explicabo ut galisum
_vbCB_6: veniam ut voluptas facere.
_vbCB_7:
_vbCB_8: Sed amet corporis eos magnam voluptatem sed dolor alias. Et facere esse
_vbCB_9: ea voluptates odit aut alias pariatur. Aut molestiae quam et saepe
_vbCB_10: corrupti id quia facilis. Est labore temporibus qui eaque labore ab
_vbCB_11: ipsa voluptatibus vel dolores galisum non aliquid earum id beatae
_vbCB_12: rerum.
_vbCB_13:
_vbCB_14: Eos nobis consequatur est accusantium sapiente et illum velit et
_vbCB_15: libero quasi est consequatur fuga ea sunt molestias. Id enim vitae
_vbCB_16: sed dolor similique qui voluptatem autem. Aut sunt perferendis in
_vbCB_17: aperiam aspernatur nam assumenda aliquam hic laboriosam galisum.

Наблюдение:Первые две строки намеренно оставлены пустыми, чтобы показать, что вы получаете все содержимое буфера обмена, включая пустые строки, где бы они ни находились.

решение2

nircmd.exe (a) находится в вашем PATH, ИЛИ (b) в той же папке, где находится ваше командное окно, И (c) не заблокирован ли он антивирусным приложением, которое у вас может быть? Я только что скопировал этот текст (из вашего вопроса, в моем веб-браузере) в буфер обмена:

nircmd.exe consolewrite ~$clipboard$

Затем я открыл окно cmd, щелкнул правой кнопкой мыши по приглашению (чтобы вставить текст команды) и нажал клавишу Enter, и nircmd вернул его, как и ожидалось.

C:\Users\Mike>nircmd.exe consolewrite ~$clipboard$
nircmd.exe consolewrite ~$clipboard$
C:\Users\Mike>

У меня nircmd.exe находится в папке c:\utils\, которая находится в моем PATH.

Это тоже сработало (вы знаете, что вы используете одинарные знаки процента для метапеременных FOR в командной строке и удваиваете их в пакетном скрипте?)

C:\Users\Mike>for /f "delims=" %A in ('nircmd.exe consolewrite ~$clipboard$') do @echo %A
nircmd.exe consolewrite ~$clipboard$

C:\Users\Mike>.

Наконец я создал этот пакет и сохранил его как nirtest.bat ( echo.строка нужна потому, что nircmd не вставляет перевод строки/возврат каретки)

@echo off
echo 1
nircmd.exe consolewrite ~$clipboard$
echo.
echo 2
for /f "delims=" %%A in ('nircmd.exe consolewrite ~$clipboard$') do (
    echo Clipboard: %%A
)

Результат:

C:\Users\Mike>nirtest.bat
1
some text in the clipboard
2
Clipboard: some text in the clipboard

решение3

Следующая строка будет использовать nircmd.exe для сохранения текста из буфера обмена в переменную varCB.

    FOR /F "tokens=* USEBACKQ" %%F IN (`nircmd.exe consolewrite ~$clipboard$`) DO (SET varCB=%%F)

(Предполагается, что в буфере обмена находится одна строка текста. Если текст в буфере обмена состоит из нескольких строк, см. альтернативный код в ОБНОВЛЕНИИ 2 OP.

решение4

SET "_NirCmd=D:\_NirSoft\nircmd-x64\nircmd.exe"
%_NirCmd% clipboard writefile F:\_Clip.txt
SET /P _VVV=<F:\_Clip.txt & DEL F:\_Clip.txt

Связанный контент