バッチ スクリプトで、クリップボードのテキストを変数に保存したいのですが、調べたところ、サードパーティのツールがなければこれは不可能のようです。私は を持っていてnircmd
、そのコマンドの 1 つは次のとおりです。
「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{$_}"
- クリップボードの「ただし」 (1 行以上) を取得するためにサードパーティのツールは必要ありません。
@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 行は意図的に空白になっており、空白行がどこにあるかに関係なく、空白行を含むクリップボードの内容全体が取得されることを示しています。
答え2
nircmd.exe は (a) PATH 上にありますか、(b) コマンド ウィンドウと同じフォルダーにありますか、(c) ウイルス対策アプリによってブロックされていませんか? 次のテキストを (Web ブラウザーで質問から) クリップボードにコピーしました:
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 メタ変数に単一のパーセント記号を使用し、バッチ スクリプトではそれを 2 倍にすることをご存知ですか?)
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)
(これは、クリップボード上のテキストが 1 行であることを前提としています。クリップボードのテキストが複数行の場合は、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