如何在PowerShell Core脚本中保存匹配内容的行号?
解决PowerShell Core 6.1.0-preview.2脚本中Select-String无法返回行号的问题
我之前也踩过PowerShell预览版的类似坑,结合你的描述,咱们来拆解问题并给出可行的解决方案:
先搞清楚问题根源
从你说的“手动设置$path就正常”来看,最大的可能性是脚本运行时的工作目录和你手动执行PowerShell时的目录不一致,导致source.txt找不到——文件都找不到,Select-String自然返回空结果,$num也就没值了。另外,6.1.0-preview.2作为预览版本,本身可能存在Select-String管道输出的临时bug,不过先从最常见的路径问题排查起。
具体解决方案
1. 用绝对路径指定目标文件(最靠谱的解决办法)
脚本里用相对路径很容易踩坑,因为脚本的运行上下文不一定是它所在的目录。改成基于脚本所在位置的绝对路径:
# 获取当前脚本所在的目录 $scriptFolder = $PSScriptRoot # 拼接出source.txt的绝对路径 $targetFile = Join-Path -Path $scriptFolder -ChildPath "source.txt" # 执行查询并获取行号 $num = Select-String -Path $targetFile -Pattern "XXXXX" | Select-Object -ExpandProperty LineNumber
这样不管脚本是被其他脚本调用还是双击运行,都能精准找到source.txt,从根源避免路径问题。
2. 升级PowerShell Core到稳定版
预览版本身就是用来测试的,存在bug很正常。6.1.0-preview.2是比较老的预览版本了,后续的正式版(比如6.1正式版、7.x系列)已经修复了很多这类小问题。直接升级到稳定版,大概率能解决这个奇怪的空变量问题。
3. 加调试代码定位问题
如果不确定是不是路径的锅,可以在脚本里加几行调试输出,看看实际运行时的状态:
# 输出当前工作目录,看看和你手动执行时是不是一样 Write-Host "当前脚本运行的工作目录:$PWD" # 检查source.txt是否存在于当前工作目录 if (Test-Path "source.txt") { Write-Host "找到source.txt文件" } else { Write-Host "没找到source.txt文件!" }
运行脚本后看输出,就能立刻知道是文件找不到,还是Select-String本身的问题。
4. 换一种方式获取行号
有时候管道处理在预览版里会有问题,试试直接访问Select-String结果的LineNumber属性,跳过Select-Object:
$matchResult = Select-String -Path "source.txt" -Pattern "XXXXX" if ($matchResult) { $num = $matchResult.LineNumber } else { Write-Host "没有匹配到目标内容" }
这种写法更直接,也能避免管道可能带来的输出丢失问题。
内容的提问来源于stack exchange,提问作者Kzitold
相关产品推荐
相关产品推荐

