2016-06-14 211 views
1

在呼叫中心工作時,我有非常重複的日誌來記錄每個呼叫,我試圖構建一個簡單的HTA,能夠通過點擊將日誌模板(和電子郵件)複製到剪貼板。CMD:Clip命令問題

不幸的是,無法複製.vbs(?)中的文本文件。

因此,HTA通過文本名稱參數(%1)打開.bat。從它在服務器會話(%〜dp0)上的位置打開.batch文件夾(「資產」)中的文本文件(%1)。

cls 
@pushd %~dp0  
clip < %~dp0Assets\%1 
@popd 

我知道,我必須和我一起工作。但一切順利!

,直到我粘貼剪貼板的內容:

  • 「德avoir」 變成 「dÆavoir」
  • 「é」 - > 「U」
  • 「A」 - >「 Ó」
  • 等...

我試過的Unicode,ANSI和UTF-8,同樣的問題。

任何人有想法?

+0

'%〜dp0Assets \%1'我認爲它應該是'%〜dp0Assets%\ 1' –

+6

不,它不應該。 – SomethingDark

+0

它是在命令提示符下的DOS編碼。如果西歐的DOS代碼頁與ANSI相同。但是所有其他編碼(美國)與ANSI不同。 – 2016-06-14 11:37:55

回答

2

的問題是,你正在執行clip而控制檯的活動代碼頁不匹配,你複製到剪貼板中的文本的編碼。您還應該確保包含擴展字符的文本文件以UTF8格式保存。換句話說,問題在於複製,而不是粘貼;而一切工作順利,因爲你斷言。

試試這個:

@echo off & setlocal 

rem // capture current console codepage to a variable 
for /f "tokens=2 delims=:" %%I in ('chcp') do set /a cp=%%I 

rem // change console codepage to Unicode 
chcp 65001 >NUL 

rem // copy asset to clipboard 
clip < "%~dp0\Assets\%~1" && 2>&1 echo Successfully copied. 

rem // revert console to original codepage 
chcp %cp% >NUL 

我降落在另一個不可思議的組合,涉及PowerShell和.NET方法雜耍編碼和設置剪貼板內容。試試這個蝙蝠腳本:

<# : batch portion 
@echo off & setlocal 

set "infile=%~dp0Assets\%~1" 

if not exist "%infile%" (
    2>&1 echo Usage: %~dp0 assetfile 
    2>&1 echo ... where assetfile is a file in %~dp0Assets\ 
    goto :EOF 
) 

powershell -STA "iex (${%~f0} | out-string)" 
goto :EOF 

# end batch/begin PowerShell hybrid code #> 

add-type -As System.Windows.Forms 
$txt = gc $env:infile -encoding UTF8 | out-string 

[Windows.Forms.Clipboard]::SetText($txt) 

另一種可能的解決辦法是將存儲腳本本身的文本片段。下面是一個示例,演示批處理+ PowerShell混合腳本中的heredocs(使用。蝙蝠擴展名):

<# : batch portion 
@echo off & setlocal 

set "str=%~1" 
powershell -STA "iex (${%~f0} | out-string)" 
goto :EOF 

# end batch/begin PowerShell #> 

$strings = @{ 
foo = @" 
Until i paste the content of the clipboard : 

    "d'avoir" becomes "dÆavoir" 
"@ 

bar = @" 
"é" --> "Ú" 
"à" --> "Ó" 
etc ... 
"@ 
} # end $strings collection of heredocs 

if (-not $strings[$env:str]) { "$env:str not defined."; exit 1 } 

add-type -As System.Windows.Forms 
[Windows.Forms.Clipboard]::Clear() 
[Windows.Forms.Clipboard]::SetText($strings[$env:str]) 

你會發現,here文檔被附在@""@。用法:script.bat fooscript.bat bar

+0

我得到了 表示相同的「特殊」字符。 – user2325445

+0

@ user2325445顯然,您的控制檯字體不包含這些擴展字符的字形。你正在粘貼到控制檯中,還是粘貼到窗口應用程序中? – rojo

+0

窗口應用程序 – user2325445

0

這裏是使用IE的剪貼板的VBScript。正如您在HTA中一樣,您已經可以訪問IE窗口對象。此示例粘貼但SetData複製到剪貼板。由於HTA繞過IE安全性,因此忽略安全性。

Sub Clip 
    Set ie = CreateObject("InternetExplorer.Application") 
    ie.Visible = 0 
    'Have to navigate to a local file to put IE into Intranet Zone, else this will generate security dialog asking permission 
    ie.Navigate2 FilterPath & "Filter.html" 
    Do 
     wscript.sleep 100 
    Loop until ie.document.readystate = "complete" 
    txt=ie.document.parentwindow.clipboardData.GetData("TEXT") 
    ie.quit 
    If IsNull(txt) = true then 
     outp.writeline "No text on clipboard" 
    else 
     outp.writeline txt 
    End If 
End Sub 

該主題太寬泛。重點是展示如何使用你的主機環境。關鍵是組件對象模型(COM)和可用的庫。您可以使用Word,Excel訪問剪貼板而不是IE瀏覽器。

將其粘貼到HTA中。

<html> 
<body> 
<script language=vbscript> 
document.write document.parentwindow.clipboardData.GetData("TEXT") 

</script> 
</body> 
</html> 
+0

是一個真正的好嘗試,但:錯誤:所需對象:'WScript' – user2325445

+0

您必須用HTA環境替換腳本宿主環境。它在IE中是'windows.timeout'。另外,在HTA中,您無需等待。 – 2016-06-14 12:25:48

+0

我只是繼續在使用window.setTimeOut「Clip()」,2000.替換wscript.sleep 100時出現未指定的錯誤。Zes Clip()使用參數文本名稱 – user2325445