使用REP选项的J选项

时间:2014-11-13 18:14:23

标签: batch-file replace store batch-processing

我正在尝试将REPL.BAT脚本与新的'J'选项一起使用,该选项允许使用JScript表达式替换参数。此脚本由@dbenham(原始REPL.BAT post 和最早的StackOverflow post)创建。我的语法有些困难,希望能得到一些帮助。以下是该场景的一个示例。

我有以下代码行:

"Port #" == driver.find_element_by_id("portno").text: break

我想用以下内容替换上面的代码行:

expected_conditions.text_to_be_present_in_element((By.ID, 'portno'), "Port #")

正如您所看到的,原始代码行具有小写的“id”,而我想要替换它的代码具有大写的“ID”。我已尝试使用以下内容替换该行:

type %iFile% | 
repl "\b(.*?) \=\= driver\.find_element_by_(.*?)\(\q(.*?)\q\)\.text\: break" 
"expected_conditions.text_to_be_present_in_element((By.$2.toUpperCase(), '$3'), $1)"
JMX >filenameNEW.py

每当我尝试这个时,都会收到“JScript运行时错误:无效字符”错误。我试着改变......

$2.toUpperCase()

...到...

$[2].toUpperCase()

...但收到我在最后一句中所述的相同错误。有人能帮我弄清楚我做错了什么吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

你的问题有几个细节;首先是最简单的:

  • 您错过了J选项!
  • 当您不使用J选项时,替换字符串是 literal ,它只会更改$ 1,$ 2,...值;例如:“此值:$ 1”。当您使用J选项时,替换字符串是 JScript 表达式 ,必须以正确的方式组装;例如:“'此值:'+ $ 1”,也就是说,替换字符串是文字'This value:',加号(+)的值为$ 1(子匹配的子字符串)。这样,您必须将完整的替换字符串重写为JScript表达式。

现在有一个有趣的观点:

  • 在表达式中,您可以使用撇号来包含文字字符串,并且不能使用引号,因为它们会终止REPL.BAT的参数。我一开始认为撇号可以通过其\ x27六进制代码作为一个特殊字符包含在内,但由于一个奇怪的原因它不起作用,所以我必须通过fromCharCode()函数“伪装”撇号。 注意:我在测试中使用了我的FindRepl.bat程序,所以我不知道dbenham的REPL.BAT在这一点上是否表现相同。

最后一点:

  • 在你的正则表达式的第一部分:\ b(... \ b表示“单词的开头”,但是单词从第一个字母开始,所以引号留在子表达式!我用“\ s +(。*)...”更改了这部分,即跳过空格并在第一个非空格字符处开始包含引号的子表达式。

哇!这里是;正如我所说,我使用了FindRepl.bat程序,但我认为这在REPL.BAT中的工作方式相同:

@echo off
set line=  "Port #" == driver.find_element_by_id("portno").text: break
echo Input:
echo %line%

echo Wanted:
echo expected_conditions.text_to_be_present_in_element((By.ID, 'portno'), "Port #")
echo/

echo %line%| "FindRepl Modified.bat" "\s+(.*) \=\= driver\.find_element_by_(.*?)\(\q(.*?)\q\)\.text\: break" 
"Apos=String.fromCharCode(39),'expected_conditions.text_to_be_present_in_element((By.'+$2.toUpperCase()+', '+Apos+$3+Apos+'), '+$1+')'" /J /Q:q

输出:

expected_conditions.text_to_be_present_in_element((By.ID, 'portno'), "Port #")

您可以尝试消除Apos变量并使用\ x27在撇号中包含的文字字符串中插入撇号。如果您发布此更改的结果,我将不胜感激......