$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 | 数字、点、数学运算、括号、空白 |
] | 结束允许的字符列表 |
+ | 一个或多个字符(来自允许的字符列表( |
) | 结束第二次捕获组 |
$ | 线路端 |