顯示廣告
隱藏 ✕
※ 本文為 versitility.bbs. 轉寄自 ptt.cc 更新時間: 2014-07-09 07:12:26
看板 EZsoft
作者 Holocaust123 (奔跑的蝸牛)
標題 [問題] 如何用 batch 取得剪貼簿的內容
時間 Fri Apr  1 18:47:40 2011


※ [本文轉錄自 Windows 看板 #1DbQozf0 ]

看板 Windows
作者 Holocaust123 (奔跑的蝸牛)
標題 [問題] 如何用 batch 取得剪貼簿的內容
時間 Fri Apr  1 18:45:15 2011


(OS是XP)

這個問題困擾我蠻久了

我常常寫小程式來自動化一些任務

很多工作只需 batch (.bat) 即可完成

但唯有剪貼簿的操作要靠其他程式語言或外部程式

例如...

1. 用vbs清空剪貼簿

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", ""
objIE.Quit

2. 用 clip.exe 清空剪貼簿

%windir%\system32\cmd.exe /c "echo off | clip"

3. 用 python 清空剪貼簿

import ctypes

#Get required functions, strcpy..
strcpy = ctypes.cdll.msvcrt.strcpy
ocb = ctypes.windll.user32.OpenClipboard    #Basic Clipboard functions
ecb = ctypes.windll.user32.EmptyClipboard
gcd = ctypes.windll.user32.GetClipboardData
scd = ctypes.windll.user32.SetClipboardData
ccb = ctypes.windll.user32.CloseClipboard
ga = ctypes.windll.kernel32.GlobalAlloc    # Global Memory allocation
gl = ctypes.windll.kernel32.GlobalLock     # Global Memory Locking
gul = ctypes.windll.kernel32.GlobalUnlock
GMEM_DDESHARE = 0x2000

def Get( ):
  ocb(None) # Open Clip, Default task
  pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy ...
  data = ctypes.c_char_p(pcontents).value
  #gul(pcontents) ?
  ccb()
  return data

def Paste(data):
  ocb(None) # Open Clip, Default task
  ecb()
  hCd = ga( GMEM_DDESHARE, len( bytes(data,"ascii") )+1 )
  pchData = gl(hCd)
  strcpy(ctypes.c_char_p(pchData),bytes(data,"ascii"))
  gul(hCd)
  scd(1,hCd)
  ccb()

ocb(None)
ecb()


想請問的是

在不使用外部程式(clip, nircmd, ...)或其他程式語言(vb, c/c++, ...)的情況下

該如何利用 batch 取得及設定剪貼簿的文字內容?

查了幾個小時依然一無所獲...

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.46

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.46
hpo14:vbs 對你來說不算是 batch 嗎?1F 04/01 18:54

  vbs 當然也是 shell scripting language

  但不是文中的提到檔名以 .bat 結尾的 DOS batch (簡稱 batch)

  http://en.wikipedia.org/wiki/Batch_file
Batch file - Wikipedia, the free encyclopedia
[圖]
In DOS, OS/2, and also Microsoft Windows, batch file is the name given to a type of script file, a text file containing a series of commands to be executed by the command interpreter. ...
 

hpo14:以及為何不打算使用Window內建的 Dos 工具 Clip 就好2F 04/01 19:01
hpo14:sorry, Clip.exe 似乎不是內建的 @@"
hpo14:純 DOS 時代有 Clipboard 嗎?
hpo14:修正我第三句推文 Clip.exe 內建在 server 2k3, Vista, 7
Holocaust123:嗯嗯 但我還不想跳到win7 因為這樣一堆程式要改寫@@6F 04/01 20:07
Holocaust123:像是autohotkey腳本之類的全部都要檢查  頗麻煩
hpo14:不用跳,直接去抓 clip.exe 回來用就可以了8F 04/01 21:09
logs:AHK 不是直接可以針對 clipboard 操作嗎?9F 04/01 21:20

  嗯嗯  不只 AHK  你想的到的多數程式語言都可以操作剪貼簿

  不過我的問題不在於哪些語言可以操作剪貼簿

  偶爾會碰到一種情況是

  有些任務我覺得用 batch 比較好寫

  但我不知道怎麼用 batch 操作剪貼簿

  所以必須另外用別的語言/軟體處理剪貼簿內容

  再把 output 傳給 batch

  (事實上我現在就是這樣做)

  若可以直接用 batch 處理剪貼簿

  就可以省下中間這個 glue 的步驟
guesd:可是batch不就是這麼用的嗎 你看精美的un*x shell10F 04/02 09:03
guesd:連cd/ls都是外部指令 然後所有的事都是pipe串來串去XD
guesd:不然windows嘛 去裝powershell好了(逃
logs:我不覺得batch有方便到哪裡耶. 你要的任務 AHK 只要一行13F 04/02 09:50
logs:clipboard :=   這樣就好10多個字元即可,還有py怎麼這麼瑣碎
logs:論啟動效率、程式簡潔性 (不會跳出一堆畫面) AHK 都是上選
logs:同 guesd 說的 batch 本身只是命令呼叫的集合體
logs:你所謂的不依靠外部程式, 本質上是不成立的. 除非你指的是
logs:cmd 本身提供的指令. 那很抱歉 cmd 就是沒有提供剪貼簿操作
logs:如果真的很堅持 batch 你可以自己寫一個 cmd.exe

  感謝您的回應

  然後回答您的幾個問題:

  1. 我現在就是用外部程式/其他語言處理後把 output 給 batch

     (上面已經提過  不過好像被忽略了)

  2. python 那段只是舉例

     如果安裝某些套件

     寫法也可以跟 ahk 一樣簡潔

     速度也不是問題(用了某些套件速度可以更快, ex: psyco)

  3. 本文只是想知道有沒有辦法單用 DOS batch 操作剪貼簿而已

     如果真的不行的話當然就還是用我原本的方法了


※ 編輯: Holocaust123    來自: 140.112.30.46        (04/02 11:00)
logs:XP 內建 system32\clipbrd.exe 可是好像純 GUI 沒 cmd line..20F 04/03 03:40

--
※ 看板: virsey 文章推薦值: 0 目前人氣: 0 累積人氣: 837 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇