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

2024-01-21

我的 .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

我有这两个测试文件:

  1. C:\Test\Folder\feiru.txt
  2. C:\Test\furuダ\File.txt

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

,这很好。

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

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

我该如何解决这个问题?


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

首先右键单击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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新运行时将 Unicode 参数传递给 Windows .bat 文件 的相关文章

随机推荐

  • 减少 Android studio 中的 Gradle 同步时间

    我使用的是 16GB 内存 SSD 硬盘的 Mac 每次构建 清理或打开项目时 Gradle 同步仍然需要 15 分钟以上 是否有任何 Android Studio 优化可以减少这个时间 更新 所有这些都在一定程度上有所帮助 将所有编译 c
  • 角度材质 未显示在自定义组件中

    所以我做了很多研究 但我就是无法弄清楚 我想使用 Angular 材质表单控件制作一个文本框组件 按照此tutorial https material angular io guide creating a custom form fiel
  • FluentMigrator迁移成功,但数据库没有变化

    我一定错过了一些非常基本的东西 我正在开发一个遗留项目 并且我正在尝试将 FluentMigrator 加入其中 因为我有一些有趣的数据库 我认为即将发生的变化和数据迁移将会产生很大的影响 使用此工具更容易 对于初始迁移 我只想将数据库提升
  • Hibernate @Table 注解中的动态模式

    想象一下 您在两个环境中有四个 MySQL 数据库模式 foo 产品数据库 bar 正在进行的重组foo db foo beta 测试数据库 and bar beta 新结构的测试数据库 此外 假设您有一个 Spring Boot 应用程序
  • jqgrid rowattr 不应用类

    我想根据列的值将背景颜色应用于 jqGrid 行的行 但是基本 rowattr 并未将类应用于行 下面是代码 为了简单起见 我删除了需要应用颜色的条件 jQuery employeeSalarysGrid jqGrid height 250
  • Azure 托管代理 - Visual Studio 2017

    我在 Azure 中设置了托管代理来执行 CI 构建 但在构建失败之前的 Visual Studio 构建步骤中收到以下警告 找不到 Visual Studio 版本 15 0 正在寻找最新版本 查看托管代理的文档 它们似乎没有使用 Vis
  • Matplotlib 图例中的字幕

    我正在使用 matplotlib 进行一些绘图 并且有一个图例告诉查看者这些点是用哪些传感器记录的 有多种类型的多个传感器 我希望在图例中添加字幕来告诉观众每组传感器的类型 我有一个可行的解决方案 但它有点像黑客 如下所示 创建图例时 它接
  • has_many 和belongs_to 关联的单选按钮

    我有一个 has many 和 Belongs to 关联 class Link lt ActiveRecord Base has and belongs to many categories belongs to property end
  • 如何在流程中获取函数的返回类型?

    以此为例 const myObj test true type MyType typeof myObj const getValue MyType gt return myObj how to do this type TheReturnT
  • 使用 API 以编程方式在 Azure DevOps Pipeline 中添加和更新测试

    我正在将我们的一个项目转换为使用 Azure DevOps 而不是 AppVeyor 进行 CI 作为构建的一部分 我们使用自定义测试运行器来执行某些测试 在 AppVeyor 中运行时 我们直接从测试运行程序调用 REST API 以通知
  • BroadcastReceiver 尝试在无序广播期间返回结果 - SMS Receiver

    我知道有很多这样的帖子 但没有一个对我有帮助 我的清单声明
  • java中的速率控制

    我正在寻找一个好的解决方案或者可能是一个 API 来解决以下问题 我的应用程序循环执行一项任务 例如发送电子邮件等 我需要将消息的平均速率限制为例如每秒 100 条消息或每最后一分钟 1000 条消息 不 我正在寻找一种算法或 API 来完
  • 如何在 Ansible 中更改和使用每个主机的全局变量?

    我正在尝试编写一个剧本来设置具有多个从服务器的 mysql 主从复制 对于每个从属服务器 我需要访问一个名为 next id 的变量 该变量应该在用于每个主机之前递增 例如 对于第一个从服务器 next id 应为 2 对于第二个从服务器
  • 批量http请求

    有谁知道批量http请求的标准方法 含义 在一次往返中发送多个 http 原子请求 出于性能原因 我们在 REST API 实现中需要这样的机制 这种机制可以显着减少客户端使用 API 所需执行的往返次数 提前致谢 Shay 定义包含客户端
  • 这个图案的名字? (答案:带有双重检查锁定的延迟初始化)

    考虑以下代码 public class Foo private static object lock new object public void NameDoesNotMatter if SomeDataDoesNotExist lock
  • 为什么这个全局变量没有被改变?

    为什么会出现 null 而不是设置为 ajax 调用返回的数据 我忽略的一定是一些简单的事情 var message document ready function fbFetchMessage alert message function
  • 如何从基于 Django 的站点管理任务的停止或重新启动?

    我将在服务器中运行一个脚本 该脚本将自动在数据库中创建模型实例 这个想法是使用无限循环 例如 while True 它将无休止地创建实例 直到我以某种方式停止它 我想使用 Django 从我的网站上很好地检查我的数据库有多大 然后我想停止或
  • DIV 重叠粘性页脚

    我有一个包含其他三个 div 的 div 页眉 内容 页脚 div class note div class header Title div div class content Some content div div class foo
  • fread (data.table) 选择列,如果未找到列则抛出错误

    我正在使用 data tables 将 csv 文件加载到 R 中fread功能 它有一堆我不需要的列 所以select参数就派上用场了 但是 我注意到 如果 csv 文件中不存在 select 中指定的列之一 则 fread 将默默地继续
  • 重新运行时将 Unicode 参数传递给 Windows .bat 文件

    我的 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