배치 스크립트에서 클립보드 텍스트를 변수에 저장하고 싶습니다. 검색해 보니 이는 타사 도구 없이는 불가능한 것 같습니다. 글쎄요 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 -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