在批次腳本中,我希望將剪貼簿文字儲存到變數中。經過搜索,如果沒有第三方工具,這似乎是不可能的。嗯,我有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) 在您的路徑上,或 (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的更新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