在批处理脚本中,我希望将剪贴板文本保存到变量中。经过搜索,似乎没有第三方工具就无法做到这一点。好吧,我有nircmd
,它的一个命令是:
“consolewrite [text] 将指定的文本发送到标准输出 (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")
- 蝙蝠+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>
我的 PATH 上名为 c:\utils\ 的文件夹中有一个 nircmd.exe。
这也有效(您知道在提示符下使用单个百分号表示 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)
(假设剪贴板上只有一行文本。如果您的剪贴板文本有多行,请参阅 OP 的 UPDATE 2 中的备用代码。
答案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