获取内容不会返回全行,如果.txt中只有一行

问题描述 投票:0回答:1

我有一个脚本,可以将其他文件安装到已安装的程序中,该程序可以存在该程序的许多版本。如果有多个安装(我的电脑有22个),则安装程序可以很好地工作,但是如果只有一个安装,则提示无法正确编写选择位置提示。

$count = 1
foreach($line in (gc $scriptPath\ExoInst.txt)) 
{
    if($line -match $regex)
    {
        Write-Host $count":"(gc $scriptPath\ExoInst.txt)[$count-1]
        $count++
    }
}

这是失败的代码,即使ExoInst.txt在其中具有完整的安装位置,它也只是编写1:C进行提示。

gc的简单.txt获得全文。

添加了屏幕截图。 Code Fail

不知道这是否是带有“:”的特殊行为。

谢谢您的帮助!

powershell installer
1个回答
2
投票

问题是,对于仅包含一行文本的文本文件,Get-Content返回一个String,而不返回String[]的数组。您可以通过以下示例看到此内容:

PS C:\> $SingleLine = Get-Content .\SingleLineOfText.txt
PS C:\> $SingleLine
OnlyOneLine
PS C:\> $SingleLine[0]
O
PS C:\> $SingleLine.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

PS C:\> $MultiLine = Get-Content .\MultipleLinesOfText.txt
PS C:\> $MultiLine
OneLine
TwoLine
ThreeLine
PS C:\> $MultiLine[0]
OneLine
PS C:\> $MultiLine.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

所以发生的是仅一行文本,返回String对象,语句(gc..)[0]仅返回字符串中的第一字符,而不返回“预期的”第一行。

解决方案是确保Get-Content返回一个数组。我们可以通过将其包装在Array Sub Expression Operator@( ... )中来完成此操作:

PS C:\> $SingleLine = @(Get-Content .\SingleLineOfText.txt)
PS C:\> $SingleLine
OnlyOneLine
PS C:\> $SingleLine[0]
OnlyOneLine
PS C:\> $SingleLine.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

所以您的代码将变成(输出的格式略有变化:]

$count = 1
foreach($line in @(gc $scriptPath\ExoInst.txt)) 
{
    if($line -match $regex)
    {
        Write-Host $count":$(@(gc $scriptPath\ExoInst.txt)[$count-1])"
        $count++
    }
}

编辑:

或者,我要做的是先读取文件,然后使用您的$line变量... 因为它包含您正在处理的行 ;-),以获得更简洁的代码:

$count = 1
$ExoInst = @(gc $scriptPath\ExoInst.txt)
foreach($line in $ExoInst) 
{
    if($line -match $regex)
    {
        Write-Host $count":"$line
        $count++
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.