En un script por lotes, deseo guardar el texto del portapapeles en una variable. Después de haber buscado, parece que esto no es posible sin herramientas de terceros. Bueno, lo tengo nircmd
, y uno de sus comandos es:
"consolewrite [texto] Envía el texto especificado a la salida estándar (stdout)".
Esperaba poder lograr mi objetivo con la siguiente línea sencilla:
FOR /F "tokens=* USEBACKQ" %%F IN (`nircmd.exe consolewrite ~$clipboard$`) DO (SET varCB=%%F)
que en teoría vería nircmd
escribir el contenido del portapapeles en STDOUT, y luego el comando for guardaría esta salida en varCB
. Pero no funciona.
ACTUALIZACIÓN: En realidad, esa línea ahora funciona. Colocará el texto en el portapapeles en varCB. Debo haber cometido algún error en mi prueba inicial.
ACTUALIZACIÓN 2: Se ha señalado que si hay varias líneas de texto en el portapapeles, el código anterior solo almacenará la última línea en la variable varCB. Si el texto de su portapapeles tiene varias líneas, puede almacenar cada línea en su propia variable con el siguiente código:
@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
(adaptado de un código que copié hace mucho tiempo, desafortunadamente no recuerdo dónde).
ACTUALIZACIÓN 3: También se ha señalado que mi uso del término "herramientas de terceros" anterior es inexacto. Simplemente quise decir que se necesitarían otras aplicaciones o lenguajes de secuencias de comandos para lograr el objetivo (como PowerShell o NirCMD). Por supuesto, es posible que algunas de estas herramientas ya estén incluidas con Win10 y, por lo tanto, técnicamente no sean "de terceros". ¡Lo lamento!
Respuesta1
En un script por lotes, deseo guardar el texto del portapapeles en una variable. Después de haber buscado, parece que esto no es posible sin herramientas de terceros.
Lamento mucho decirlo, pero esto no es cierto:
- Portapapeles de pegado de PowerShell:
Get-Clipboard|Foreach{$_}
// or using aliases, shorter: gcb|?{$_}
- Portapapeles de pegado de VBScript:
WScript.Echo CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
- Murciélago + Powershell
powershell -nOp -c "Get-Clipboard|Foreach{$_}"
- No necesitas herramientas de terceros para obtener el formato de tu portapapeles, que es una o más líneas:
@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%%
- Contenido en mi portapapeles:
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.
- Salidas:
_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.
Obs.:Las primeras 2 líneas están deliberadamente en blanco para mostrar que obtienes todo el contenido del Portapapeles, incluidas las líneas en blanco, sin importar dónde se encuentren.
Respuesta2
¿Está nircmd.exe (a) en su RUTA, O (b) en la misma carpeta donde está su ventana de comandos, Y (c) no está bloqueado por la aplicación antivirus que pueda tener? Acabo de copiar este texto (de tu pregunta, en mi navegador web) al portapapeles:
nircmd.exe consolewrite ~$clipboard$
Luego abrí una ventana de cmd e hice clic derecho en el mensaje (para pegar el texto del comando) y presioné la tecla Enter, y nircmd lo devolvió como se esperaba.
C:\Users\Mike>nircmd.exe consolewrite ~$clipboard$
nircmd.exe consolewrite ~$clipboard$
C:\Users\Mike>
Tengo nircmd.exe en una carpeta llamada c:\utils\ que está en mi RUTA.
Además, esto también funcionó (¿sabe que usa signos de porcentaje único para las metavariables FOR cuando se le solicita y los duplica en un script por lotes?)
C:\Users\Mike>for /f "delims=" %A in ('nircmd.exe consolewrite ~$clipboard$') do @echo %A
nircmd.exe consolewrite ~$clipboard$
C:\Users\Mike>.
Finalmente creé este lote y lo guardé como nirtest.bat (la echo.
línea se debe a que nircmd no pega un avance de línea/retorno de carro)
@echo off
echo 1
nircmd.exe consolewrite ~$clipboard$
echo.
echo 2
for /f "delims=" %%A in ('nircmd.exe consolewrite ~$clipboard$') do (
echo Clipboard: %%A
)
Resultado:
C:\Users\Mike>nirtest.bat
1
some text in the clipboard
2
Clipboard: some text in the clipboard
Respuesta3
La siguiente línea utilizará nircmd.exe para guardar el texto en el portapapeles en la variable varCB.
FOR /F "tokens=* USEBACKQ" %%F IN (`nircmd.exe consolewrite ~$clipboard$`) DO (SET varCB=%%F)
(Esto supone una sola línea de texto en el portapapeles. Si el texto de su portapapeles tiene varias líneas, consulte el código alternativo en la ACTUALIZACIÓN 2 del OP.
Respuesta4
SET "_NirCmd=D:\_NirSoft\nircmd-x64\nircmd.exe"
%_NirCmd% clipboard writefile F:\_Clip.txt
SET /P _VVV=<F:\_Clip.txt & DEL F:\_Clip.txt