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 fooscript.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:剪辑命令问题的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg视频剪辑常用命令

子数涵数·Flash——影片剪辑的事件操作

体验 Python 剪辑视频以及相关问题解决, 一劳永逸!

易语言 之系统处理

电脑开热点时cmd输入命令说是找不到下列命令是啥问题

求助使用perl执行cmd命令的问题