我无法使用以下方法返回字符串代替()我需要获取数字,但只能从连续 8 个字符并排组中的数字中获取。
其中一些字符串将包含其他数字,但这些数字永远不会出现在 8 组集合中,所以我想省略这些数字并仅返回 8 位数字组中的数字。
澄清
这些字符串实际上是文件名,但如果我能从这个简单的示例中得到一些关于预期结果的帮助,我可以轻松地将其合并到其他电源外壳脚本过程的逻辑。
我宁愿不使用
YYYY
当前年份$YYYY = (get-date).year
或类似的内容,然后寻找其他数字,这样文件名本身就可以决定操作,而不是年份TRUE
我尝试了各种方法,甚至使用 IN think"[^0-9]{8}.*$
或类似方法返回了一些方法,但没有一种方法可以轻松地返回实际的 8 位数字。
示例数据字符串
error_PP3_XXX_PSI_20180109PM.err
error_PP3_XXX_PSI_20180110AM.err
error_PP3_XXX_PSI_20180111PM.err
error_PP3_XXX_PSI_20180115PM.err
error_PP3_XXX_Temp_20180110AM.err
error_YYY_20180109AM.err
error_YYY_20180109PM.err
电源外壳
正确结果
这是一个工作示例,其中字符串中只有 8 个连续的数字
"error_YYY_20180109PM.err" -replace "[^0-9]" , ""
结果
20180109
结果不正确
这是一个不起作用的示例,其中字符串中除了 8 个连续的数字外,还包含其他数字字符
"error_PP3_XXX_PSI_20180115PM.err" -replace "[^0-9]" , ""
结果
320180115
答案1
这应该有效
if ("error_PP3_XXX_PSI_20180109PM.err" -match "([0-9]{8})"){$matches[1]} else {""}
假设您没有多于一组 8 位数字。还请注意,即使以下命令不匹配,$matches 仍保持设置。因此,您可能需要使用clear-variable matches
(或使用更短的别名clv matches
)手动清除它