编写stdin脚本并从批处理中阅读PowerShell脚本的结果

iyfjxgzm  于 4个月前  发布在  Shell
关注(0)|答案(1)|浏览(75)

我有一个版本控制系统(VisualSVN),它可以运行一个pre-commit-hook。我想它使用cmd.exe作为解释器。
我的钩子目前正在执行以下操作(检查最小消息长度):

setlocal enabledelayedexpansion

SET REPOS=%1
SET TXN=%2
SET SVNLOOK="$VISUALSVN_SERVER%\bin\svnlook.exe"

%SVNLOOK% log -t %TXN% %REPOS% | findstr .......... > nul
IF %errorlevel% gtr 0 (goto ERROR_TOO_SHORT)

goto NORMAL_EXIT

:ERROR_TOO_SHORT
echo Commit message too short 1>&2
exit 1

:NORMAL_EXIT
exit 0

字符串
我想添加一个正则表达式检查。消息应该满足这两个表达式中的至少一个,以便被一些bash脚本解析。

\[((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+)\]
\[[nN]o?-?[uU](ser)?-?[iI](mpact)?\]


不幸的是,我阅读到这些对于findstr来说太复杂了,所以我需要调用PowerShell。
一个可以工作的powershell表达式是:

[bool](  <Get stdin here> | 
  Select-String -CaseSensitive -Quiet 
    -Pattern '\[(((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+))|([nN]o?-?[uU](ser)?-?[iI](mpact)?)\]
)


这是在行动:

> $good1 = [bool](echo "[NUI] test message" | 
>>  Select-String -CaseSensitive -Quiet 
>>    -Pattern '\[(((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+))|([nN]o?-?[uU](ser)?-?[iI](mpact)?)\]
>> )
> $good2 = [bool](echo "[Closes=1234] test message" | 
>>    Select-String -CaseSensitive -Quiet 
>>      -Pattern '\[(((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+))|([nN]o?-?[uU](ser)?-?[iI](mpact)?)\]
>> )
> $bad = [bool](echo "This is an invalid message" | 
>>    Select-String -CaseSensitive -Quiet 
>>      -Pattern '\[(((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+))|([nN]o?-?[uU](ser)?-?[iI](mpact)?)\]
>> )
> echo $good1
True
> echo $good2
True
> echo $bad
False


我需要弄清楚如何将%SVNLOOK%的输出导入PowerShell,调用命令,设置退出代码,然后在脚本中使用该退出代码。
我尝试了这个简化的例子,检查stdin是否包含H,但PowerShell显然不是bash

> echo "Hello" | PowerShell -Command "[bool]([Console]:In | Select-String -CaseSensitive -Quiet -Pattern 'H')"
> echo %errorlevel%
0
> echo " ello" | PowerShell -Command "[bool]([Console]:In | Select-String -CaseSensitive -Quiet -Pattern 'H')"
> echo %errorlevel%
0 <-- Expected 1


我在这里尝试了一些事情,我认为[Console]::In没有将Hello转发到Select-String

fcwjkofz

fcwjkofz1#

我想明白了
首先,要获取PowerShell的stdin,需要使用$Input。仍然不确定这是环境变量、管道还是进程。

> echo "Hello" | PowerShell -Command "[bool]($Input | Select-String -Pattern 'H' -Quiet)"
True

字符串
接下来,我们需要使用该输出设置%errorlevel%。我们可以使用exit并使用!运算符返回匹配为0

> echo "Hello" | PowerShell -Command "exit ! [bool]($Input | Select-String -Pattern 'H' -Quiet)"
> echo %errorlevel%
0


消极也起作用:

> echo " ello" | PowerShell -Command "exit ! [bool]($Input | Select-String -Pattern 'H' -Quiet)"
> echo %errorlevel%
1

相关问题