在重新运行Windows.bat文件时将Unicode参数传递给该文件

在重新运行Windows.bat文件时将Unicode参数传递给该文件,windows,batch-file,unicode,dos,Windows,Batch File,Unicode,Dos,我的.bat文件如下所示: @echo off CD /D "%~dp0" if [%2]==[] ( set user=%USERNAME% ) else ( set user=%2% ) :getFile if [%1]==[] ( set /p file=Enter file name : ) else ( set file=%~f1 echo File name: %~f1 ) :checkFile for /f "useback t

我的.bat文件如下所示:

@echo off

CD /D "%~dp0"

if [%2]==[] (  
    set user=%USERNAME%
) else (
    set user=%2%
)

:getFile
if [%1]==[] (
    set /p file=Enter file name : 
) else (
    set file=%~f1
    echo File name: %~f1
)

:checkFile
for /f "useback tokens=*" %%a in ('%file%') do set file=%%~a

if not exist "%file%" (
    echo Error: Could not find file: %file%
    echo.
)

:: Check for admin permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

if '%errorlevel%' == '0' (
    goto gotAdmin
)

:: Rerun this batch with admin rights
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd", "/c """"%~f0"" ""%file%"" ""%user%""""", "%CD%", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B

:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"

echo.

:eof
pause
exit /B
我有两个测试文件:

  • C:\Test\Folder\ファイル.文本
  • C:\测试\フォルダ\File.txt
  • 当我运行上面的批处理文件并将1拖到cmd窗口时,我得到:

    ,这很好

    当我对2执行相同操作时,我得到:

    调用UAC.ShellExecute时,未正确传递%file%

    如何解决此问题?

    尝试使用UTF-8代码页65001添加CHCP(更改代码页)命令以启动批处理文件,例如:

    @echo off
    
    chcp 65001
    .
    .
    .
    
    有关代码页标识符的更多信息,请参见此处:

    编辑:您必须在命令窗口中使用支持unicode的字体,如Lucida Console。否则,命令处理器将阻塞unicode字符,无法找到文件,或者可能显示“系统无法写入指定设备”错误

    单击命令窗口左上角的窗口图标,选择菜单上的默认值,然后在字体选项卡上选择Lucida Console

    更新-测试批处理文件并在下面输出。

    下面是我用来测试这个的批处理文件:

    @echo off
    
    chcp 65001
    
    CD /D "%~dp0"
    
    
    :getFile
    if [%1]==[] (
        set /p file=Enter file name : 
    ) else (
        set file=%~f1
        echo File name: %~f1
    )
    
    :checkFile
    for /f "useback tokens=*" %%a in ('%file%') do set file=%%~a
    
    if not exist "%file%" (
        echo Error: Could not find file: %file%
        echo.
    ) else (
        echo Found file "%file%"
    )
    
    这是我第一次拖动“C:\temp\test”时测试的输出\ファイル.txt“输入窗口,然后输入”C:\temp\test\フォルダ\file2.txt”

    我的系统是Win 7 Pro x64 SP1,带有英国英语设置


    您的问题是,创建临时VBS文件的方式意味着它不是有效的unicode文件,因此Windows不知道如何解释您传入的unicode名称

    按照beercohol关于使用代码页65001的建议,我仍然发现我无法访问unicode目录中的文件。但是,如果我尝试使用unicode编辑器手动创建文件(例如,使用记事本并保存为unicode编码),并调用该手动脚本而不是自动生成的VBS文件,则一切都会正常工作

    我重新编写了您的脚本,用于创建utf-16文件。请注意,此脚本需要与代码页65001一起运行才能正常工作

    @echo off
    
    CD /D "%~dp0"
    
    if [%2]==[] (  
        set user=%USERNAME%
    ) else (
        set user=%2
    )
    
    :getFile
    if [%1]==[] (
        set /p file=Enter file name : 
    ) else (
        set file=%~f1
        echo File name: %~f1
    )
    
    :checkFile
    for /f "useback tokens=*" %%a in ('%file%') do set file=%%~a
    
    if not exist "%file%" (
        echo Error: Could not find file: %file%
        echo.
    )
    
    :: Check for admin permissions
    >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
    
    if '%errorlevel%' == '0' (
        goto gotAdmin
    )
    
    :: Rerun this batch with admin rights
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "cmd", "/c """"%~f0"" ""%file%"" ""%user%""""", "%CD%", "runas", 1 >> "%temp%\getadmin.vbs"
    iconv.exe -f utf-8 -t utf-16le "%temp%\getadmin.vbs" > "%temp%\getadmin2.vbs"
    "%temp%\getadmin2.vbs"
    exit /B
    
    :gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    if exist "%temp%\getadmin2.vbs" ( del "%temp%\getadmin2.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
    
    echo.
    
    :eof
    pause
    exit /B
    

    使用管理员权限启动批处理文件的首选方法是创建快捷方式,然后将该快捷方式标记为需要管理员权限

    首先右键单击foo.bat,然后创建快捷方式。打开该快捷方式的属性,单击“高级…”按钮并启用“以管理员身份运行”

    这有一个缺点:不能将文件名拖到生成的命令提示符窗口上。但您可以将文件拖到快捷方式上

    但是如果我不想或不能使用快捷方式怎么办?

    通过将文件名作为参数传递给脚本,可以避免向文件中写入任意Unicode字符。即使VBS文件采用ANSI编码,脚本主机在内部也始终使用Unicode

    下面是如何编写VBS文件并运行它:

    :: Rerun this batch with admin rights
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "cmd", "/c """"%~f0"" """ + Wscript.Arguments.Item(0) + """ ""%user%""""", "%CD%", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs" "%file%"
    exit /B
    

    @我已经试过了,但不幸的是,这并不能解决问题。输出消息更改为“错误:找不到文件:C:\Test\ÞÞ•ÞÞÞ«Þ€\file.txt”请查看我的更新答案-我最初错误地认为字体是可选的-必须使用unicode字体才能工作!我已经用批处理文件的一个子集进行了测试,并创建了一个同名的测试文件和文件夹,当字体设置为Lucida Console时,脚本效果很好。@beercohol-Hmm奇怪。。。我一直在使用Lucida控制台,但问题仍然存在。这很奇怪。我用测试批处理文件及其输出进一步更新了答案。也许你可以检查一下你从中得到了什么结果。
    set user=%2%
    在批处理代码的第8行应该是
    set user=%2
    ,末尾没有百分号。@Scott griffiths:看起来jpen在这里安静了。你还想在这个答案中看到什么吗?@PeterBrittain:我刚刚催促了jpen,他在接受一个新答案之前正在考虑这个新答案。我认为我们有可行的解决方案,所以悬赏很可能是最简单的。