来自文件.txt的数学


$space =("`r`n")
$data = @(Get-Content C:Usersuser1Desktopma.txt)
$Array = ($Data.Split($space)).Split($space)
$pos1 = $Array[0][0]+$Array[0][1]
$pos2 = $Array[1][0]+$Array[1][1]
$pos3 = $Array[2][0]+$Array[2][1]
#$pos1
#$pos2 
#$pos3
$zahl1 = $Array[0][5]+$Array[0][7]+$Array[0][9]
$zahl1

PowerShell 7.2

txt1.txt的文本为:

x1=2+3

x2=8/4

x3=1-4

我希望通过终端中的命令将结果(来自x1、x2、x3(保存在txt2.txt中。我试过威思阵列,但我只得到:2+3而不是5

有什么想法吗?

您可以使用InvokeExpression进行此操作,但首先读取警告

Get-Content -Path text1.txt | Where-Object {$_ -match 'S'} | ForEach-Object {
$var,$calculation = ($_ -split '=').Trim()
'{0} --> {1}' -f $var, (Invoke-Expression -Command $calculation)
} | Set-Content -Path text2.txt

这是一个更安全的版本的尝试,它只匹配数学表达式,因此用户不能通过Invoke-Expression:运行任意代码

Get-Content text1.txt | 
Select-String '^s*(S+)s*=([d.+-*/%()s]+)$' | 
ForEach-Object {
$var        = $_.Matches.Groups[ 1 ].Value
$expression = $_.Matches.Groups[ 2 ].Value
$result     = Invoke-Expression $expression
"{0} = {1}" -f $var, $result
} | 
Set-Content text2.txt

CCD_ 2 cmdlet使用正则表达式来仅匹配被认为"是"的行;安全";。在RegEx中,定义了两个组来将行拆分为变量(1(和计算(2(子字符串。然后通过CCD_ 3提取这些。

RegEx细分:

描述
模式
^行开始
s*零个或多个空白字符
(开始第一个捕获组
S+一个或多个非空白字符
)结束第一个捕获组
s*零个或多个空白字符
=文字"=">
(启动第二个捕获组
[允许字符的开始列表
d.+-*/%()s数字、点、数学运算、括号、空白
]结束允许的字符列表
+一个或多个字符(来自允许的字符列表(
)结束第二次捕获组
$线路端

最新更新