【问题标题】:Overwriting a script parameter for a goto in batch批量覆盖 goto 的脚本参数
【发布时间】:2012-10-30 12:59:45
【问题描述】:

我一直在努力使用来自 for 循环中提出的其他问题之一的技术来获取文件的父目录。我已经让它大部分工作了,除了我认为因为我的脚本已经接受了 1 个参数,这是为多个文件位置运行所需的,我需要保留它。我的 getparentdir goto 需要某种方式来操作参数。我必须为同一个父目录中的多个目录文件执行此操作。任何帮助都会很棒。

当我运行它时,它似乎更喜欢脚本的参数,而不是发送到 GOTO 的内容,所以什么都没做。

setlocal ENABLEDELAYEDEXPANSION

for /D %%f in (F:\Falcon\Inbound\%1\*) do (

    for %%g in ("%%f\*.PDF") do (
      set ParentDir="%%g"
      echo !ParentDir!
      set ParentDir=%ParentDir: =:%
      set ParentDir=%ParentDir:\= %


      :getparentdir
      if "%~1" EQU "" goto :cont
      Set ParentDir=%~1
      shift
      goto :getparentdir
      call :getparentdir


      :cont 
      set ParentDir=%ParentDir::= %
      echo ParentDir is !ParentDir!

    )
)

【问题讨论】:

    标签: parameters batch-file goto


    【解决方案1】:

    我无法弄清楚您要做什么。但我发现您问题中的代码存在许多问题。

    1) 您在 DO() 块中设置 ParentDir,并正确使用延迟扩展来 ECHO 刚刚设置的值。但是稍后在同一代码块中,您错误地恢复为正常扩展以执行搜索和替换。您需要在整个代码块中使用延迟扩展。例如:
    set ParentDir=!ParentDir: =:!

    2) 你在 GOTO 之后有 CALL。当然,CALL 永远无法执行,因为 GOTO 会绕过它。可能也一样。

    3) 您尝试在 FOR 循环中转到 GOTO。这将立即中断循环,并且逻辑很可能不是您想要的 - 循环永远不会处理超过 1 个 PDF 文件。此外,您正在尝试 GOTO 带括号的 DO 代码块中的标签。通常,您不应将标签放在代码块中。有关 IF 语句代码块的类似问题的讨论,请参阅 (Windows batch) Goto within if block behaves very strangely

    【讨论】:

    • 谢谢!我对批处理有点陌生,仍在学习语法和语言规则。这绝对有助于未来的项目。我试图获取父目录的名称,但它正盯着我看。
    【解决方案2】:

    刚刚意识到如果你只是给外部for循环一个值

       for /D %%f in (F:\Falcon\Inbound\%1\*) do (
    
          SET ParentDir = %%~nf
    
          for %%g in ("%%f\*.PDF") do (
    
             rem - Do Code here
          )
       )
    

    在需要 for 循环时,它的工作原理相同。突然清晰。

    【讨论】:

    • 你可能很清楚,但我觉得不合适。 ParentDir 将包含在“F:\Falcon\Inbound\%1”中找到的文件夹的名称。它没有提供父文件夹(至少从我的角度来看不是)。
    猜你喜欢
    • 1970-01-01
    • 2022-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多