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/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我在使用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
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我遵循了教程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
我遵循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
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到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
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我克隆了一个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