【问题标题】:批处理脚本中 for 循环中的变量和 if 语句存在问题
【发布时间】:2022-01-22 14:29:18
【问题描述】:

在此批处理代码中工作了几天,但我无法使其正常工作。 为了给您一个视角,此代码旨在读取包含一些“选定”数字的文件,这些数字引用另一个文件夹中包含的其他文件。这些文件包含大量按行和列排列的数据。第一行并不重要,因此代码跳过 50 行以节省时间,然后我对第 2 列和第 7 列感兴趣,因此将这些列导出到每行的变量 (A,B)。如果在同一行上这两个变量之间存在值组合(例如 A>1000 和 B>0.03),则代码应该导出发生这种情况的文件号。 问题:比较这些列的 IF 没有按预期工作,GTR/GEQ 似乎不尊重“超过”,即使文件中没有这样的组合,代码也会导出文件编号。 到目前为止,我已经尝试了两个代码:

代码 1

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=*" %%s in (selected.txt) do (
cd %~dp0\Melts\MeltNPTdis-8-%%s
    for /f "skip=50 tokens=2,7 delims= " %%A in (file.txt) do (
        if %%A GTR 1000 if %%B GTR 0.03 (
            cd %~dp0
            >>dummy.txt echo %%s
)))

代码 2,带有检查变量

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=*" %%s in (selected.txt) do (
cd %~dp0\Melts\MeltNPTdis-8-%%s
    for /f "skip=50 tokens=2,7 delims= " %%A in (file.txt) do (
        set /a x=0
        set /a y=0
        if %%A GTR 999 (
            set /a x=1
            )
        if %%B GTR 0.03 (
            set /a y=1
            )
        set /a z= !x! + !y!
        if !z! EQU 2    (
        cd %~dp0
        >>dummy.txt echo %%s
)))

有人能帮我看看这个吗?我已将问题隔离到 IF,并尝试以不同的方式定义变量,例如 %%A 或 %%A%% 无法解决问题。 非常感谢!

【问题讨论】:

  • 像 +、- 这样的数字运算符以及 GTR 仅适用于 32 位有符号整数。在您的情况下,0.03 被视为字符串,因此与字符串规则进行比较
  • @jeb 谢谢!我不知道这个,我想我最好用 matlab 代替

标签: if-statement batch-file variables


【解决方案1】:

您需要测试小数的两边,因为cmd 只能处理 32 位整数。但是,您可以从 powershell 获得一些帮助来克服这个问题。请注意,这是未经测试的,因为我在移动设备上,显然没有您必须测试的环境:

@echo off
for /f "usebackq delims=" %%s in ("selected.txt") do (
(for /f "usebackq skip=50 tokens=2,7 delims= " %%A in ("%~dp0Melts\MeltNPTdis-8-%%s\file.txt") do powershell "if (%%A -gt 0.04) {if (%%A -gt 2) {Write-host "%%s"}}"
   )>"%~dp0dummy.txt"
)

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 2016-05-17
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多