如何从批处理脚本调用Powershell regex命令

时间:2018-07-30 11:33:29

标签: regex powershell batch-file

我在批处理脚本中有一个字符串。我不想不想创建Powershell脚本或其他文件。

我想知道的所有信息,如何对通过批处理传递给powershell的字符串进行正则表达式替换。

我的解决方法:

 powershell -Command " replace "%insert regex pattern%" , "%string_from_batch_file%"

我希望将此%string_from_batch_file%替换为正则表达式匹配项。同样,我不在此命令之外处理文件或powershell,我只需要在字符串上使用正则表达式替换即可。

预先感谢

2 个答案:

答案 0 :(得分:1)

您可以在这样的命令行上替换调用powershell的字符串

add_action( 'woocommerce_before_calculate_totals', 'change_custom_price' );

function change_custom_price( $cart_object ) {
    $custom_price = 0; // This will be your custome price  
    $gift_variation_id = 2046;
    foreach ( $cart_object->cart_contents as $value ) {
        if ( $value['variation_id'] == $gift_variation_id ) {
            $value['data']->price = $custom_price;
        }
    }
}

或更短的 cudo可以解决

PowerShell -Command "& {'yourstring' -replace 'your', 'my'}"

答案 1 :(得分:1)

以评论中的示例为例:

@Echo off
set "input=abced__xyz.ghi23"
set "regex=_[^]+$"
Echo expected output: [xyz.ghi23]
powershell -Command " replace "%insert regex pattern%" , "%string_from_batch_file%"

这不起作用,因为您使用了错误的语法。
另外,内部的双引号也必须转义,以便将cmd传递给powershell
(或更改为单引号)。

我至少看到了两个正则表达式来解决这个问题

  1. 使用RE匹配零件以删除'^.*?_+'并替换为''
    (可以暗示,可以省略)
  2. 使用捕获组来匹配要保留的部分,并用它替换输入。

:: Q:\Test\2018\07\30\SO_51593067.cmd
@Echo off
set "input=abced__xyz.ghi23"
Echo expected output: [xyz.ghi23]
Echo 1st
powershell -NoP -C "'%input%' -replace '^.*?_+'"
Echo 2nd
powershell -NoP -C "'%input%' -replace '^.*?_+(.*)$','$1'"

示例输出:

> Q:\Test\2018\07\30\SO_51593067.cmd
expected output: [xyz.ghi23]
1st
xyz.ghi23
2nd
xyz.ghi23

如果您还想处理批处理文件中的powershell输出,
您必须使用for /f解析powershell命令并将其存储在批处理变量中:

:: Q:\Test\2018\07\30\SO_51593067.cmd
@Echo off
set "input=abced__xyz.ghi23"
Echo expected output: [xyz.ghi23]

for /f "usebackq delims=" %%A in (`
  powershell -NoP -C "'%input%' -replace '^.*?_+'"
`) Do Set "first=%%A"

for /f "usebackq delims=" %%A in (`
  powershell -NoP -C "'%input%' -replace '^.*?_+(.*)$','$1'"
`) Do Set "second=%%A"

Echo first =%first%
Echo second=%second%

示例输出:

> Q:\Test\2018\07\30\SO_51593067.cmd
expected output: [xyz.ghi23]
first =xyz.ghi23
second=xyz.ghi23