的問題是,你正在執行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 foo
或script.bat bar
'%〜dp0Assets \%1'我認爲它應該是'%〜dp0Assets%\ 1' –
不,它不應該。 – SomethingDark
它是在命令提示符下的DOS編碼。如果西歐的DOS代碼頁與ANSI相同。但是所有其他編碼(美國)與ANSI不同。 – 2016-06-14 11:37:55