我有一个脚本,可以将其他文件安装到已安装的程序中,该程序可以存在该程序的许多版本。如果有多个安装(我的电脑有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
不知道这是否是带有“:”的特殊行为。
谢谢您的帮助!
问题是,对于仅包含一行文本的文本文件,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++
}
}