【问题标题】:How do I fix "positional parameter cannot be found that accepts "+""?如何修复“找不到接受“+”的位置参数?
【发布时间】:2019-06-10 21:52:39
【问题描述】:

所以我有这个任务,我必须读取一个文件。 然后计算文件中每个单词出现的次数。 之后,必须将每个单词写入一个附加文件,在该特定单词后面加上它出现的次数。

我已经有一些代码,但我尝试的一切都遇到了错误, 我是新手,我不明白很多错误消息。

Function AnalyseTo-Doc
{
    param ([Parameter(Mandatory=$true)][string]$Pad )
    New-Item C:\destination.txt -ItemType file
    $destination = "C:\destination.txt"
    $filecontents = get-content $Pad | Out-String

    foreach($hit in $filecontents)
    {
        #$tempWoord = $hit | Convert-String
        $lengte = $hit.Length
        if($lengte -ge 4)
        {
            $hits = get-content $Pad | Out-String
            if($hits -notcontains $hit)
            {
                Add-Content $destination $hit + $hit.LineNumber + '`n'
            }
            elseif($hits -contains $hit)
            {
                Add-Content $destination $hit + $hit.LineNumber + '`n'
            }
        }
    }
}

所以如上所述,这要做的是:

  1. 它必须正确读取文件。
  2. 它必须知道单词是否超过 4 个字符。如果是,则必须计算在内
  3. 必须计算超过 4 个字符的每个单词。
  4. 最后,每个单词都必须写入一个附加文件,其中包含单词本身和后面的计数。

我的意思是:它在文本文件中出现了多少次

PS:我们正在使用.txt 文件进行测试

【问题讨论】:

  • 您如何治疗宫缩? What's 被视为 what is 还是 what's 是您想要计算的单词?同样的问题也适用于连字符,即它们是两个词还是一个词?
  • 看起来$hit + $hit.LineNumber + 'n'` 是您的错误的根源。 PoSh 错误通常包括行号和文本,所以你真的应该包括那些信息。 ///// 至于为什么会发生错误 - 您正在给 cmdlet six 项,其中两项是 + 标志。修复 = 将这些项目转换为单个项目 - 一个字符串。
  • 假设“what's”将被视为“what is”。我不确定最简单的方法是什么,如果它更容易另一种方式也很好。
  • 那么$hit应该转换成字符串?这不是正确的方法吗($tempWoord = $hit | Convert-String)?因为当我这样做时,它给了我一个“nullreferenceexception”错误。 @Lee_Dailey
  • @NDC - 不......整堆文本必须是一回事。构建一个包含该数据的字符串,然后将其用作调用中的值。

标签: powershell scripting


【解决方案1】:

我知道这个问题已经有了答案,但是如果我们只将连续的字母字符计算为单词,并且您想要这些单词的总数,那么只要没有字符例外,这应该可以工作。问题中的帖子似乎并没有真正计算字数。

Function AnalyseTo-Doc
{
    param ([Parameter(Mandatory=$true)][string]$Pad )

    New-Item C:\destination.txt -ItemType file
    $destination = "C:\destination.txt"
    $filecontents = Get-Content $Pad -Raw

    $words = ($filecontents | Select-String -Pattern "\b[A-Za-z]{4,}\b" -AllMatches).Matches.Value
    $words | Group-Object -NoElement | Foreach-Object {
        ("{0},{1}" -f $_.Count,$_.Name) | Add-Content -Path $destination
        }
}

【讨论】:

  • 哦,哇,非常感谢,这正是我需要的!!!!先生,你让我过得很好:)
【解决方案2】:

注意:由于问题是How do i fix “positional parameter cannot be found that accepts ”+“,所以让我准确地回答那个问题。以下答案并未解决您修复以下问题后可能出现的其他问题。


您应该在错误消息中看到如下内容:

PS C:\SO\56526906> Add-Content 'destination.txt' $a + $b + $c
Add-Content : A positional parameter cannot be found that accepts argument '+'.
At line:1 char:1
+ Add-Content 'destination.txt' $a + $b + $c
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Add-Content], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.AddContentCommand

这会将您直接指向发生错误的行。在这种情况下,这是因为您将以下参数提供给Add-Content

$destination
$hit
+
$hit.LineNumber
+
'`n'

虽然您应该只添加目的地和内容。您对Add-Content 的调用应如下所示:

Add-Content $destination "$hit $($hit.LineNumber)"

请注意,您不需要在Add-Content 之后添加`n,因为会自动添加换行符。

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多