Echo变量输出到批处理子例程中的文本文件

时间:2014-11-05 23:32:06

标签: batch-file echo subroutine

@echo off
Color 1A
TITLE TSM mef3 Extract Script
:start
cls
ECHO.
ECHO        ###################################
ECHO        ##        IAM TSM Extract        ##
ECHO        ##          Version 1.0          ##
ECHO        ##    Written by Kane Charles    ##
ECHO        ###################################
ECHO.
ECHO    Extraction Options:
ECHO.
REM ECHO    1. Extract all Servers
ECHO    2. Extract Server1
ECHO    3. Extract Server2
ECHO    4. Extract Server3
ECHO    4. Extract Server4
ECHO    5. Extract Server5
ECHO    6. Extract Server6
ECHO    7. Extract Server7
ECHO    0. Exit
ECHO.
ECHO    Last Option selected: %selection%
ECHO.
SET/P selection=Please enter a value: 
REM IF %selection%==1 GOTO precommands
IF %selection%==2 call:modifydsmopt 1.2.3.4,1000
IF %selection%==3 call:modifydsmopt 2.3.4.5,1001
IF %selection%==4 call:modifydsmopt 3.4.5.6,1002
IF %selection%==5 call:modifydsmopt 4.5.6.7,1003
IF %selection%==6 call:modifydsmopt 5.6.7.8,1004
IF %selection%==7 call:modifydsmopt 6.7.8.9,1005
IF %selection%==8 call:modifydsmopt 7.8.9.10,1006
IF %selection%==0 exit

pushd C:\Program Files\Tivoli\TSM\baclient

:modifydsmopt
SETLOCAL enabledelayedexpansion
SET IP=%~1
SET PORT=%~2


IF EXIST dsm.opt.bak (
    del dsm.opt.bak
)

IF EXIST dsm.opt (
    ren dsm.opt dsm.opt.bak
)

ECHO commmethod             TCPIP >> dsm.opt
ECHO PASSWORDACCESS         GENERATE >> dsm.opt
ECHO TCPSERVERADDRESS       %IP% >> dsm.opt
ECHO TCPPORT                %PORT% >> dsm.opt

ECHO IP: %IP%, PORT: %PORT%

rem GOTO EOF
ENDLOCAL


popd

:EOF

出于安全原因,我已经掩盖了IP地址和端口,显然它们并不真实。

此批处理文件的目的是创建一个如下所示的新dsm.opt文件:

commmethod              TCPIP 
PASSWORDACCESS          GENERATE 
TCPSERVERADDRESS        1.2.3.4 
TCPPORT                 1000

以下两行不起作用:

ECHO TCPSERVERADDRESS       %IP% >> dsm.opt
ECHO TCPPORT                %PORT% >> dsm.opt

但是以下行可行:

ECHO IP: %IP%, PORT: %PORT%

基本上,我可以将纯文本写入文件,我可以将变量回显到控制台,但我无法将变量回显到文本文件。

运行时,子程序产生了这个:

commmethod              TCPIP 
PASSWORDACCESS          GENERATE 
TCPSERVERADDRESS     
TCPPORT 

有人可以帮我把变量输出到文件吗?

干杯。

1 个答案:

答案 0 :(得分:1)

正如已发布的那样,您的批次具有解决问题的尝试的明显回声。我建议你在dsm.opt.bak查看难以捉摸的数据。

:modifydsmopt配置不平衡setlocalendlocal,类似地,popdpushd

与许多语言不同,批处理没有sectionsprocedures的概念,所以在CALL :modifydsmopt之后,执行返回到call之后的指令,忽略selection上的剩余匹配(因为selection将不匹配任何其余值)并继续push;然后重新输入:modifydsmopt子例程 - 这次没有参数,可能已更改目录(由push提供),因此生成一个(新的?)输出文件。

治愈很简单。

...
IF %selection%==0 exit

:: I've no idea what this change-of-directory is aimed at, so REM it out...
REM pushd C:\Program Files\Tivoli\TSM\baclient

:: We're done - so exit
GOTO :EOF

:modifydsmopt
SETLOCAL enabledelayedexpansion
SET IP=%~1
SET PORT=%~2


IF EXIST dsm.opt.bak (
    del dsm.opt.bak
)

IF EXIST dsm.opt (
    ren dsm.opt dsm.opt.bak
)

ECHO commmethod             TCPIP >> dsm.opt
ECHO PASSWORDACCESS         GENERATE >> dsm.opt
ECHO TCPSERVERADDRESS       %IP% >> dsm.opt
ECHO TCPPORT                %PORT% >> dsm.opt

ECHO IP: %IP%, PORT: %PORT%

GOTO EOF

注意:我已删除了popd - 可能您要先移至目录,进行更改,然后popd返回 - 这意味着pushd应该完成< strong> selection之前评估:modifydsmopt例程中执行。 :EOF标签也已消失 - 不是必需的 - cmd假设goto :EOF表示go to end-of-file恕我直言, 不应声明。此外,goto :eof(或达到EOF)是隐式endlocal

同样跳出来的是setlocal和变量设置似乎是多余的。试试这个:

...
IF %selection%==0 exit

:: We're done - so exit
GOTO :EOF

:modifydsmopt
pushd C:\Program Files\Tivoli\TSM\baclient

IF EXIST dsm.opt.bak (
    del dsm.opt.bak
)

IF EXIST dsm.opt (
    ren dsm.opt dsm.opt.bak
)

ECHO commmethod             TCPIP >> dsm.opt
ECHO PASSWORDACCESS         GENERATE >> dsm.opt
ECHO TCPSERVERADDRESS       %~1 >> dsm.opt
ECHO TCPPORT                %~2 >> dsm.opt

ECHO IP: %~2, PORT: %~2

POPD

GOTO EOF

将切换到文件操作的目标目录,然后切换回来。也不使用变量,因此无需设置本地环境。