@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
有人可以帮我把变量输出到文件吗?
干杯。
答案 0 :(得分:1)
正如已发布的那样,您的批次具有解决问题的尝试的明显回声。我建议你在dsm.opt.bak
查看难以捉摸的数据。
:modifydsmopt
配置不平衡setlocal
和endlocal
,类似地,popd
和pushd
与许多语言不同,批处理没有sections
或procedures
的概念,所以在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
将切换到文件操作的目标目录,然后切换回来。也不使用变量,因此无需设置本地环境。