1

私はプログラミングが初めてです。これが私のジレンマです。複数のコンピューターの複数の場所にある複数のファイルを置き換える必要があります。

すべての変数を定義し、適切な情報を含む txt ファイルを呼び出すバット スクリプトを作成しました。たとえば、 -testing.txt には値があります

Apple, Potato,Beef
Apple, Potato,Pork

私が適用しているロジックは次のとおりです。このtxtファイルを読み取りに使用してから、各場所に移動してファイルを変更しています

set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin
SET SORC=C:\tools\logosource\NEWImages\ApiSite\Content

for /F "usebackq delims=, tokens=1-3" %%a in (C:\tools\xxxx\testing.txt) do (
SET HOSTNAME=%%a
SET CUSTNAME=%%c
SET STYPE=%%b
SET DEST=\\%HOSTNAME%\c$\Documents and Settings\blahblah\My    Documents\%CUSTNAME%\%STYPE%\goodman\

echo HOSTNAME is %HOSTNAME%
echo CUSTNAME is %CUSTNAME%
echo STYPE is %STYPE%
echo DEST is %DEST%
echo SORC is %SORC%
 )

 copy "%DEST%\ApiSite\Content\images\michael.gif" "%DEST%"
 copy /b /y "%SORC%\images\george.gif" "%DEST%\ApiSite\Content\images\michael.gif"


goto End

:Error

ECHO Error! You must pass in a servername
goto End

:End

問題は、ループが txt ファイルの最後の行だけを読み取っていることです。すなわち。「Apple、Potato、Pork」と読み、DEST をその値に設定します。

私が本当に欲しいのは、1 行目 (Apple、Potato、Beef) を読み、これらのパラメータを使用して DEST を設定し、ファイルを変更してから、戻って 2 行目 (Apple、Potato、Pork) を読み、これらのパラメータを使用して DEST を設定し、ファイルを変更します。

4

1 に答える 1

0

実際、コードはファイルのすべての行を読み取っていますが、ロジックが間違っています。

主な問題は、各行に対してCOPYステートメントを実行したいのですが、ループの外側にCOPYステートメントがあります。もちろん、それらは1回だけ実行され、使用される値はファイルの最後の行で設定された値になります。解決策は、COPYステートメントをループ内に移動することです。

もう1つの問題は、括弧で囲まれたブロック内に変数を設定し、%var%-を使用して値にアクセスしようとしていることです。これは、ステートメントが解析されるときに展開が発生し、行が読み取られる前にブロック全体が1回解析されるため機能しません。遅延拡張を使用することで、この問題を解決できます(遅延HELP SET拡張の詳細については、コマンドラインプロンプトから入力してください)。しかし、実際には変数に値を保存する必要はありません。FOR変数を直接使用するだけです。DESTは複数回使用されるため、追加のFORループを使用し%%dて、DEST値を含む変数を定義しました。は~、FORループが追加した引用符を削除します。

また、ファイルの終わりにラベルを使用GOTO ENDして定義することにより、スクリプトを終了します。:ENDそれは機能しますが:EOF、すべてのスクリプトの最後に暗黙のラベルがあります。GOTO :EOFラベルを定義せずに簡単に使用できます。他のオプションは使用することですEXIT /B

:ERROR呼び出されていないルーチンがあります-表示されていない追加のコードがあると思います。

set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin
SET "SORC=C:\tools\logosource\NEWImages\ApiSite\Content"

for /F "usebackq delims=, tokens=1-3" %%a in (C:\tools\xxxx\testing.txt) do (
  for %%d in (
    "\\%%a\c$\Documents and Settings\blahblah\My Documents\%%b\%%b\goodman\"
  ) do (
    echo HOSTNAME=%%a
    echo CUSTNAME=%%c
    echo STYPE=%%b
    echo DEST=%%~d
    echo SORC is %SORC%
    copy "%%~d\ApiSite\Content\images\michael.gif" "%%~d"
    copy /b /y "%SORC%\images\george.gif" "%%~d\ApiSite\Content\images\michael.gif"
  )
)
exit /b

:Error
ECHO Error! You must pass in a servername
exit /b
于 2012-10-18T21:40:18.183 に答える