批处理文件中的 IF 语句

批处理文件中的 IF 语句

我目前正在使用 Cruise Control 为各种内部网站安排“构建”。我使用批处理文件来启动每个“构建”(构建意味着特定的 webhelp 输出)。为了举例说明,我们假设有标记为内部、外部和公共的构建。在主批处理文件中,您将找到以下代码:

if x%TargetName:-Internal-=%==x%TargetName%  goto ReplaceNav
if x%TargetName:-External-=%==x%TargetName% goto SkipSearch 
if x%TargetName:-Public-=%==x%TargetName% goto SkipSearch
:: do not uncomment or the skin will not get copied to the output

那么,让我来解释一下这里发生了什么。在运行此部分脚本之前,变量 %TargetName% 已经设置为一个值。变量 %TargetName% 将包含文本 -Internal、-External 或 -Public,并且在每个目标名称的开头或结尾处将有其他字符,但我希望能够有一个条件语句,如果脚本在 %TargetName% 变量中看到 -Internal,则脚本将跳转到标有 :ReplaceNav 的代码块。以下是 :ReplaceNav 的样子。

:ReplaceNav
echo.
echo -----------------------------------------------------------------
echo Replacing Navigation.htm and Search.htm files
echo TargetName is %TargetName%
echo CurrUser is %CurrUser%
echo -----------------------------------------------------------------
echo.

pushd ..\..\some\dir\MasterPages

    copy /y "Navigation1.COPY" "..\..\..\Output\%CurrUser%\%TargetName%\Skin\Navigation.htm" 2>&1
    IF %ERRORLEVEL% NEQ 0 (
        echo.
        echo Failed to replace Navigation.htm file with Exit Code: %ERRORLEVEL%
        echo.
        exit /b %ERRORLEVEL%
    )
    copy /y "Search.COPY" "..\..\..\Output\%CurrUser%\%TargetName%\Skin\Search.htm" 2>&1
    IF %ERRORLEVEL% NEQ 0 (
        echo.
        echo Failed to replace Search.htm file with Exit Code: %ERRORLEVEL%
        echo.
        exit /b %ERRORLEVEL%
    )
popd

ReplaceNav 本质上用两个包含仅供内部用户使用的搜索引擎的自定义页面替换了 webhelp 输出中的两个文件。

如果变量 %TargetName% 包含 -External 或 -Public,则批处理文件应该跳至批处理文件的 :SkipSearch 部分。

:SkipSearch
echo.
echo -----------------------------------------------------------------
echo Skipped Search and Navigation Replacement
echo -----------------------------------------------------------------
echo.

我的问题如下(我确信这与没有正确构建 IF 语句有关):如何构建此代码块

if x%TargetName:-Internal-=%==x%TargetName%  goto ReplaceNav
if x%TargetName:-External-=%==x%TargetName% goto SkipSearch 
if x%TargetName:-Public-=%==x%TargetName% goto SkipSearch
:: do not uncomment or the skin will not get copied to the output

正确地逐句检查 %TargetName% 变量,看看它是否具有 -Internal、-External 或 -Public 的值,然后跳转到脚本中的正确代码块?目前,它似乎评估

if x%TargetName:-Internal-=%==x%TargetName%  goto ReplaceNav

语句,但无论它是什么,它都会用 -External 和 -Public 替换构建中的导航页面 :( 我还应该提到,这个 if 语句根本不是我写的,如果你能想到其他方法来解析 -Internal、-Public 或 -External 的 %TargetName% 变量,我完全赞成。

我确实知道这是一个奇怪的问题,所以如果您需要进一步的详细信息以便回答,请告诉我。

答案1

你说你在寻找-Internal,但你的搜索和替换正在寻找-Internal-。这适用于你所有的搜索和替换操作。我怀疑如果你只是-从搜索中删除不需要的尾随,它可能会起作用。

if x%TargetName:-Internal=%==x%TargetName%  goto ReplaceNav
if x%TargetName:-External=%==x%TargetName% goto SkipSearch 
if x%TargetName:-Public=%==x%TargetName% goto SkipSearch
:: do not uncomment or the skin will not get copied to the output

答案2

既然您说 PowerShell 是可以接受的,那么我鼓励您采用这种方式。

我不能 100% 确定你在这里做什么,但这里有一个示例脚本,我相信它可以完成你要求的部分工作。然后,你可以决定是否要更多地迁移到 Powershell。

检查 targetName 是否包含“Internal”:

If ($TargetName -Contains "Internal")
  {
    FunctionReplaceNav($TargetName)
  }

这样就更直接、更容易阅读了。然后,再次作为大纲,而不是最终的代码:

您可以在函数中对替换进行其他处理(或者在原始 If 语句中内联处理),例如:

$CopyVariableName = Copy-Item Object.Ext copyToDirectory\Folder
if (!($CopyVariable))
   {
    Write-Host "Something Went wrong copying: $TargetName"
   }
else 
   {
    #Nothing here, moves along
    }

当然,我们还可以使错误捕获更加强大,例如通过使用 Try、Catch、Finally 并捕获任何系统异常(如访问被拒绝、目标机器无法访问等)。

相关内容