2014-11-05 67 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 

它將切換到目標目錄進行文件操作,然後切換回來。也不使用變量,所以不需要設置本地環境。