CMD:剪辑命令问题
Posted
技术标签:
【中文标题】CMD:剪辑命令问题【英文标题】:CMD : Clip command Issue 【发布时间】:2016-06-14 09:47:43 【问题描述】:在呼叫中心工作,我为每个呼叫写下相当重复的日志,我正在尝试构建一个简单的 HTA,能够通过单击将日志模板(和电子邮件)复制到剪贴板。
很遗憾,无法复制 .vbs (?) 中的文本文件。
因此,HTA 在单击时使用文本名称参数 (%1) 打开 .bat。从它在服务器会话 (%~dp0) 上的位置,.batch 打开文件夹“Assets”中的文本文件 (%1)。
cls
@pushd %~dp0
clip < %~dp0Assets\%1
@popd
我知道,我必须使用我所拥有的。但是一切都很顺利!
直到我粘贴剪贴板的内容:
“d'avoir”变成“dÆavoir” "é" --> "Ú" "à" --> "Ó" 等等...我尝试了 Unicode、Ansi 和 UTF-8,同样的问题。
有人有想法吗?
【问题讨论】:
%~dp0Assets\%1
我觉得应该是%~dp0Assets%\1
不,不应该。
这是命令提示符下的 DOS 编码。如果是西欧 DOS 代码页,则它与 ANSI 相同。然而,所有其他编码(包括美国在内)都与 ANSI 不同。
【参考方案1】:
问题是您正在执行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 方法,用于处理编码和设置剪贴板内容。试试这个 .bat 脚本:
<# : 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)
另一种可能的解决方案是将文本 sn-ps 存储在脚本本身中。这是一个在批处理 + PowerShell 混合脚本中演示 heredocs 的示例(以 .bat 扩展名保存):
<# : 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])
您会注意到 heredocs 包含在 @"
和 "@
中。用法:script.bat foo
或script.bat bar
【讨论】:
我得到了相同的“特殊”字符。 @user2325445 显然您的控制台字体不包含这些扩展字符的字形。您是粘贴到控制台还是窗口应用程序中? 窗口化应用程序 很奇怪。我测试了上面的脚本,复制了您帖子的“直到我粘贴剪贴板的内容...”部分并将其粘贴到 Notepad++ 中,并且粘贴完美。对于它的价值,我导入剪贴板的源 txt 文件被编码为 UTF-8,没有字节顺序标记。我正在尝试使用 PowerShell 和 .NET 方法、JScript 和htmlfile
COM 对象以及使用Scripting.FileSystemObject
的扩展参数作为Unicode 打开的HTA 应用程序的其他替代方案;在我的回答中,似乎没有什么比蝙蝠脚本更有效。我会继续考虑的......
不完全是 S.O. 精神的编程解决方案,但也许 portable text macro manager 将是存储一堆文本文件的一个有价值的替代方案。我还编辑了我的答案以包含另一种可能的解决方案,包括您希望作为脚本本身中的 heredocs 集合复制到剪贴板的文本。【参考方案2】:
这里是使用 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>
【讨论】:
是一个很好的尝试但是:错误:需要对象:'WScript' 您必须将脚本宿主环境替换为 HTA 环境。它是 IE 中的windows.timeout
。此外,在 HTA 中,您无需等待。
在用 window.setTimeOut "Clip()", 2000 替换 wscript.sleep 100 时,我只是不断收到未指定的错误。Zes Clip() 使用参数文本名称以上是关于CMD:剪辑命令问题的主要内容,如果未能解决你的问题,请参考以下文章