【问题标题】:Batch variable store result from command来自命令的批量变量存储结果
【发布时间】:2020-01-30 22:37:56
【问题描述】:

对我来说,这似乎是一个非常简单的问题,但是我为此苦苦挣扎,还没有找到答案。 我的目标是计算文件中特定字符串的出现次数。 我使用以下命令执行或尝试执行此操作:

for /f "tokens=2 delims=;" %%a in ('path to file with searchstring') do (
   set count=('path to file I am searching in' find /c "%%a")
   if !count! NEQ 0 echo !count!
)

对我来说似乎很简单,但是脚本退出时第二行似乎是错误的。 我想将find的结果保存在一个变量中,因为我只想输出非零结果。

【问题讨论】:

  • 1.将外部循环更改为for /F "usebackq tokens=2 delims=;" %%a in ("path to file with searchstring") do ( ... )。 2. 第二行应为for /F %%c in ('^< "path to file I am searching in" find /C "%%a"') do set "count=%%c"。 3. 你应该像set "count=0" 这样预初始化计数变量。 4. 在命令提示符窗口中输入for /? 并(重新)阅读它的帮助...
  • 谢谢@aschipfl,这似乎有效。你能解释一下^< 是做什么的吗?
  • 但是,现在添加第二个 FOR 似乎运行时大幅下降,但我会尝试一下,谢谢
  • 关于^<:您可以使用find /C "search string" "file path" 来获取匹配行的数量,但出现的不仅仅是标题之类的数量;当您使用input redirection < 将文件提供给find 时,将返回纯计数; < "file path" find /C "seach string";由于该命令行的结果被for /F 捕获,您需要escape (^) 重定向不会应用于for /F...
  • 注意:这会计算包含搜索字符串的,而不是搜索字符串的出现次数。如果搜索字符串在一行中出现多次,则将它们计为一个(行)。可能对你来说很重要,也可能不重要,但你应该意识到这一点。

标签: for-loop batch-file variables


【解决方案1】:

这是一个使用 的示例,为了更好地匹配单词,(它使用您上一个问题中的文件名)

@(For /F "UseBackQTokens=2Delims=;" %%G In ("classID.txt")Do @(Set "count=0"
        For /F %%H In ('^""%__AppDir__%findstr.exe" /IN "\<%%G\>" "trc.txt"^"'
        )Do @(Set /A count+=1)&SetLocal EnableDelayedExpansion
        If !count! Gtr 0 (Echo %%G: !count!)&Endlocal))&Pause

这里用多行括号括起来以便您更好地理解:

@Echo Off
For /F "UseBackQ Tokens=2 Delims=;" %%G In (
    "classID.txt"
) Do (
    Set "count=0"
    For /F %%H In (
        '^""%__AppDir__%findstr.exe" /I /N "\<%%G\>" "trc.txt"^"'
    ) Do (
        Set /A count +=1
    )
    SetLocal EnableDelayedExpansion
    If !count! Gtr 0 (
        Echo %%G: !count!
    )
    Endlocal
)
Pause

以及将结果输出到名为results.txt的文件的完整括号示例:

@Echo Off
(
    For /F "UseBackQ Tokens=2 Delims=;" %%G In (
        "classID.txt"
    ) Do (
        Set "count=0"
        For /F %%H In (
            '^""%__AppDir__%findstr.exe" /IN "\<%%G\>" "trc.txt"^"'
        ) Do (
            Set /A count +=1
        )
        SetLocal EnableDelayedExpansion
        If !count! Gtr 0 (
            Echo %%G: !count!
        )
        Endlocal
    )
)>"results.txt"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 2020-08-14
    • 2018-06-27
    • 2022-10-19
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多