草庐IT

windows - 批处理变量被设置为 ■1 而不是预期的输出

coder 2024-06-17 原文

我正在编写一个脚本,需要将文件的内容作为设置变量的输入。我正在使用 Out-File 生成文本文件:

$string | Out-File -FilePath C:\Full\Path\To\file.txt -NoNewLine

然后我使用该文件批量设置一个变量:

set /P variablename=<C:\Full\Path\To\file.txt

该文件的内容是一个唯一的 id 字符串,实际上看起来像这样:

1i32l54bl5b2hlthtl098

当我回应这个变量时,我得到这个:

echo %variablename%
■1

当我尝试在输入文件中使用不同的字符串时,我发现回显的是 ■ 字符,然后是字符串中的第一个字符。所以,如果我的字符串是“apfvuu244ty0vh”,那么它会回显“■a”。

为什么变量没有被设置为文件的内容?我正在使用 this stackoverflow post 中的方法其中选择的答案说要将此语法与 set 命令一起使用。难道我做错了什么?使用完整路径作为设置变量的输入可能有问题吗?

最佳答案

tl;dr:

使用 Out-File -Encoding oem 生成 cmd.exe 可正确读取的文件。

这有效地将您限制为旧版“ANSI”/OEM 代码页中可用的 256 个字符,NUL (0x0) 除外。如果您需要完整的 Unicode 支持,请参阅底部。


Windows PowerShell(但不是 PowerShell Core)中,Out-File 及其有效别名 >默认为UTF-16LE character encoding , 其中大多数字符表示为 2 字节序列;对于 ASCII 范围内的字符,每个序列的第 2 个字节是 NUL (0x0);此外,此类 文件以 BOM 开头表示编码类型

相比之下,cmd.exe 希望输入使用传统的单字节 OEM 编码(请注意 cmd.exe/U 只控制其输出的编码。

cmd.exe(它不知道)遇到 UTF-16LE 输入时:

  • 它将字节单独解释为字符(即使 UTF-16LE 中的字符由 2 个字节(通常)组成,或者在极少数情况下由 4 个字节组成(一对 2 -字节序列))。

  • 它将构成 BOM 的 2 个字节(0xff0xfe)解释为字符串的一部分。用OEM code page 437 (美国英语)实际上,0xff 呈现为 空格,而 0xfe 呈现为

  • 一旦遇到第一个 NUL(0x0 字节),读取就会停止,这发生在 ASCII 范围中的第一个字符,在您的示例字符串中是1

因此,编码为 UTF-16LE 的字符串 1i32l54bl5b2hlthtl098 被读取为 ■1,如您所述。


如果您需要完整的 Unicode 支持,请使用 UTF-8编码:

  • 在 PowerShell 中使用 Out-File -Encoding utf8

  • 在读取 cmd.exe 中的文件(在批处理文件中)之前,运行 chcp 65001 以切换到 UTF-8 code page .

注意事项:

  • 并非所有 Unicode 字符。可能正确呈现,具体取决于控制台窗口中使用的字体。

  • 旧版应用程序可能会因代码页 65001 生效而出现故障,尤其是在较旧的 Windows 版本上。

    • 避免问题的可能策略是根据需要暂时切换到代码页65001,然后切换回来。

请注意,以上仅涵盖通过文件进行的通信,并且仅在一个方向(PowerShell -> cmd.exe)。
同时控制用于标准流(stdin、stdout、stderr)的字符编码,无论是在将字符串发送到 cmd.exe/外部程序时,还是在解释从他们,this answer 我的。

关于windows - 批处理变量被设置为 ■1 而不是预期的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51663335/

有关windows - 批处理变量被设置为 ■1 而不是预期的输出的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  6. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  7. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  8. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  10. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

随机推荐