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

jpe*_*pen 6 windows unicode dos batch-file

我的.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
Run Code Online (Sandbox Code Playgroud)

我有这两个测试文件:

  1. C:\测试\文件夹\ファイル.TXT
  2. C:\测试\フォルダ\ FILE.TXT

当我运行上面的批处理文件并将1拖到cmd窗口时,我得到:

在此输入图像描述

,这很好.

当我为2做同样的事情时,我得到:

在此输入图像描述

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

我怎样才能解决这个问题?

roe*_*and 4

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

以下是编写 VBS 文件并运行它的方法:

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