如何从带.ps1后缀的文件名中提取随机数字并存储到变量?
提取文件名中的数字并存储到变量
嘿,你之前用-match的时候没拿到单独的数字,是因为-match本身只返回匹配成功的布尔值,而实际匹配到的内容会存在自动变量$matches里,咱们得从这里取数字才行。
给你个精准的解决方案:
- 先定义匹配规则:
$pattern = 'script(\d+)\.ps1',这里的(\d+)是专门捕获数字的捕获组,刚好对应你要的script[数字].ps1格式 - 执行匹配:
$result -match $pattern,只要文本里有符合格式的内容,这个表达式会返回$true,同时$matches变量会被填充 - 提取数字到变量:
$scriptNumber = $matches[1],$matches[1]就是捕获组里的数字内容
用你提供的参考文本测试一下,完整代码如下:
# 模拟你的返回文本 $result = @" A 'using' statement must appear before any other statements in a script. At C:\Packages\Plugins\Microsoft.CPlat.Core.RunCommandWindows\1.1.3\Downloads\script35.ps1:20 char:8 + using Microsoft.Build.Framework; + ~ Missing using directive At C:\Packages\Plugins\Microsoft.CPlat.Core.RunCommandWindows\1.1.3\Downloads\script35.ps1:20 char:3 + using Microsoft.Build.Framework; + ~~~~~ A 'using' statement must appear before any other statements in a script. At C:\Packages\Plugins\Microsoft.CPlat.Core.RunCommandWindows\1.1.3\Downloads\script35.ps1:21 char:8 + using Microsoft.Build.Utilities; + ~ Missing using directive At C:\Packages\Plugins\Microsoft.CPlat.Core.RunCommandWindows\1.1.3\Downloads\script35.ps1:21 char:3 + using Microsoft.Build.Utilities; + ~~~~~ A 'using' statement must appear before any other statements in "@ # 定义匹配模式 $pattern = 'script(\d+)\.ps1' # 执行匹配并提取数字 if ($result -match $pattern) { $scriptNumber = $matches[1] Write-Host "提取到的数字是: $scriptNumber" }
运行这段代码,就能得到提取到的数字是: 35,完全符合你的需求。
如果你的文本里可能存在多个不同的script[数字].ps1,想要提取所有数字的话,可以用Select-String配合-AllMatches参数:
$allNumbers = ($result | Select-String -Pattern $pattern -AllMatches).Matches | ForEach-Object { $_.Groups[1].Value }
这样$allNumbers就会包含所有匹配到的数字列表啦。
内容的提问来源于stack exchange,提问作者Ryvik
相关产品推荐
相关产品推荐

