2014-11-05 34 views
0
@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地址和端口,显然它们不是真实的。Echo变量输出到批处理子程序中的文本文件

这个批处理文件的目的是创造一个清新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

正如发表的那样,您的批处理尝试解决问题的回音有明显的不同。我建议你看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应该做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 

它将切换到目标目录进行文件操作,然后切换回来。也不使用变量,所以不需要设置本地环境。