Batch file CMD:Clip命令问题

Batch file CMD:Clip命令问题,batch-file,cmd,clip,Batch File,Cmd,Clip,在呼叫中心工作时,我有很多重复的日志要记录,我正在尝试建立一个简单的HTA,只需点击一下即可将日志模板(和电子邮件)复制到剪贴板 不幸的是,无法在.vbs(?)中复制文本文件 因此,HTA使用文本名称参数(%1)单击打开.bat。从服务器会话(%~dp0)上的位置。批处理将打开文件夹“资产”中的文本文件(%1) cls @pushd%~dp0 剪辑NUL rem//将资产复制到剪贴板 已成功复制剪辑&1 echo。 rem//将控制台还原为原始代码页 chcp%cp%>NUL 我找到了另一个

在呼叫中心工作时,我有很多重复的日志要记录,我正在尝试建立一个简单的HTA,只需点击一下即可将日志模板(和电子邮件)复制到剪贴板

不幸的是,无法在.vbs(?)中复制文本文件

因此,HTA使用文本名称参数(%1)单击打开.bat。从服务器会话(%~dp0)上的位置。批处理将打开文件夹“资产”中的文本文件(%1)

cls
@pushd%~dp0
剪辑<%dp0Assets\%1
@流行音乐
我知道,我必须用我所拥有的来工作。但是一切都很顺利

在粘贴剪贴板的内容之前:

  • “d'avoir”变成了“dÆavoir”
  • “é”->“Ú
  • “a”->“Ó”
  • 等等
我试过Unicode、Ansi和UTF-8,同样的问题


有人有想法吗?

这是使用IE的剪贴板的vbscript。由于您在HTA中,您已经可以访问IE窗口对象。此示例粘贴但
SetData
复制到剪贴板。忽略安全性,因为HTAs绕过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>

document.write document.parentwindow.clipboardData.GetData(“文本”)

问题在于,当控制台的活动代码页与要复制到剪贴板的文本编码不匹配时,您正在执行
clip
。您还应该确保包含扩展字符的文本文件以UTF8格式保存。换句话说,问题在于复制,而不是粘贴;而且一切都不像你说的那么顺利

试试这个:

@echo off&setlocal
rem//将当前控制台代码页捕获到变量
对于/f“tokens=2 delims=:”%%I in('chcp')do set/a cp=%%I
rem//将控制台代码页更改为Unicode
chcp 65001>NUL
rem//将资产复制到剪贴板
已成功复制剪辑<“%~dp0\Assets\%~1”和&2>&1 echo。
rem//将控制台还原为原始代码页
chcp%cp%>NUL

我找到了另一个神奇的组合,包括PowerShell和.NET方法,用于处理编码和设置剪贴板内容。试试这个.bat脚本:

&1回显用法:%~dp0资产文件
2> &1回音。。。其中assetfile是%dp0Assets中的文件\
后藤:EOF
)
powershell-STA“iex(${%~f0}|输出字符串)”
后藤:EOF
#结束批处理/开始PowerShell混合代码#>
添加类型-As System.Windows.Forms
$txt=gc$env:infle-编码UTF8 |输出字符串
[Windows.Forms.Clipboard]::SetText($txt)

另一种可能的解决方案是将文本片段存储在脚本本身中。下面的示例演示了批处理+PowerShell混合脚本(使用.bat扩展名保存)中的heredocs:


$strings=@{
foo=@”
在粘贴剪贴板的内容之前:
“d'avoir”变成了“dÆavoir”
"@
条形图=@“
"é" --> "Ú"
"à" --> "Ó"
等
"@
}#end$strings heredocs系列
if(-not$strings[$env:str]){“$env:str未定义。”退出1}
添加类型-As System.Windows.Forms
[Windows.Forms.Clipboard]::Clear()
[Windows.Forms.Clipboard]::SetText($strings[$env:str])

您会注意到,heredocs用
@“
”@
括起来。用法:
script.bat foo
script.bat bar

%~dp0Assets\%1
我认为应该是
%~dp0Assets%\1
不,不应该。它是在命令提示符下的DOS编码。如果西欧DOS代码页与ANSI相同。但是,所有其他编码(包括US)都与ANSI不同。这是一次很好的尝试,但是:错误:需要对象:“WScript”您必须用HTA环境替换脚本主机环境。在IE中是
windows.timeout
。在HTA中,你无论如何都不必等待。我只是在用window.setTimeOut“Clip()”,2000替换wscript.sleep 100时不断收到一个未指明的错误。Zes Clip()使用参数文本名称i get� 对于相同的“特殊”字符。@user2325445显然您的控制台字体不包含这些扩展字符的标志符号。您是粘贴到控制台中,还是粘贴到窗口应用程序中?窗口应用程序怪异。我测试了上面的脚本,复制了你文章中的“直到粘贴剪贴板的内容…”部分,并将其粘贴到记事本++,它粘贴得完美无缺。值得一提的是,我导入剪贴板的源txt文件编码为UTF-8,没有字节顺序标记。我正在尝试使用PowerShell和.NET方法、JScript和
htmlfile
COM对象以及使用
Scripting.FileSystemObject
的扩展参数作为Unicode打开的HTA应用程序的其他替代方案;而且似乎没有什么比我回答中的蝙蝠脚本更有效。我会一直考虑它……这不完全是一个符合S.O.精神的编程解决方案,但也许a将是存储一堆文本文件的一个有价值的替代方案。我还编辑了我的答案,以包含另一种可能的解决方案,包括您想要复制到剪贴板的文本,作为脚本本身中的一个heredocs集合。
<html>
<body>
<script language=vbscript>
document.write document.parentwindow.clipboardData.GetData("TEXT")

</script>
</body>
</html>