草庐IT

windows - 批量条件错误也执行if语句

coder 2024-06-19 原文

SET var=%6
IF NOT "%var%"=="" (
    @ECHO "ijklkmn"
    EXIT
    IF %var:~-2,1%==\ SET var=%var:~0,-2%"
)

如果 %6 未定义,则 @ECHO "ijklkmn" 不会执行。 但为什么我仍然得到 There should be no 1var:~0。 错误???

最佳答案

有一些批处理的复杂性导致了您的问题。

1) 括号内的 block 在一次传递中被解析。在执行 IF 测试之前,您的整个 IF block 必须解析为有效语法。

2) 如果变量未定义,子字符串扩展会做一些奇怪的事情。解析器将 %var: 展开为空,留下子字符串表达式的其余部分,行解析变得完全不同步。

IF %var:~-2,1%==\ SET var=%var:~0,-2%"

第一个 %var: 展开为空,剩下 IF ~-2,1%==\SET var=%var:~0,-2%"< br/=""> 接下来 %==\SET var=% 展开为空,留下 IF ~-2,1var:~0,-2%"
最后,单独的 % 没有配对,所以它被剥离了。
扩展后的最后一行现在是 IF ~-2,1var:~0,-2",这是无效语法。

参见 https://stackoverflow.com/a/7970912/1012053有关 % 扩展如何工作的详细说明。

您的代码可以通过 2 个非常不直观的更改来“修复”:1) 颠倒比较的顺序,2) 在 SET 语句周围添加转义引号,以及 3) 添加一些额外的文本:

if "\"=="%var:~-2,1%" SET ^"var=%var:~0,-2%"^" ignore

如果 var 未定义,上面的内容将展开为:

if "\" == "~-2,1var:~0,-2"" ignore

重要的是解析的语法是有效的。 ignore 是必需的,因为 IF 语句在条件之后需要一个命令,以便解析器将其视为有效。如果执行它会导致错误,因为 ignore 不是有效命令。但它永远不会被执行,因为条件为假(而且外部 IF 条件也为假)。

如果定义了 var,比如 "test\" 的值,那么该行会像您想象的那样展开:

if "\" == "\" SET "var=test" ignore

由于引用 SET 赋值的方式,上面的代码执行得很完美。忽略最后引号之后的任何内容。

我说上面的内容会“修复”你的代码,但我相信有更好的方法来完全重构你的代码。

更新:重组建议

在我看来,您似乎只是想将变量设置为带引号的参数的值,如果值中的最后一个字符(不包括引号)是 \,则将其删除特点。看起来您还插入了一些测试代码以尝试诊断您的代码为何不起作用。放弃测试代码,我推荐以下内容:

set var=%6
set "test=%var:~-2,1%"
if "%test%"=="\" set var=%var:~0,-2%"

我了解必须如何引用文件名和路径以保留空格。但我不喜欢在我的变量值中包含引号。我喜欢从我的参数中删除封闭的引号,然后仅在需要时将它们添加回去。所以我的代码看起来像:

set "var=%~6"
set "test=%var:~-1,1%"
if "%test%"=="\" set "var=%var:~0,-1%"

如果启用了延迟扩展,那么一个简单的解决方案就不再需要测试变量了:

set var=%6
setlocal enableDelayedExpansion
if "!var:~-2,1!"=="\" set "var=!var:~0,-2!""

或者如果去掉引号:

set "var=%~6"
setlocal enableDelayedExpansion
if "!var:~-1,1!"=="\" set "var=!var:~0,-1!"

关于windows - 批量条件错误也执行if语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14469450/

有关windows - 批量条件错误也执行if语句的更多相关文章

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

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

  2. 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

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  7. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  8. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  9. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  10. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

随机推荐