2017-07-19 7 views
1

私はIT部門用の小さなインベントリスクリプトを作成しています。私はしばらく時間を節約しようとしていますが、ちょっとした不具合に遭遇しました。実行時にバッチ変数が展開されない

私の目標は、現在の場所を一時的なローカルファイル(このバッチファイルはフラッシュドライブ上で実行される)に格納することです。そのため、あるコンピュータから次のコンピュータに移動するときには、正確ではありません。基本的に、ユニット1、ビルA、ルーム3で始めると、正しいものが何であるかを確認し、そうでないものを変更するだけです。

おそらくロケーション確認コードは、ここで何が起こっているのかをよりよく知ることができます。

@echo off 
setlocal 
setlocal EnableDelayedExpansion 
if not exist location.tmp (
    echo , , > location.tmp 
) 
for /f "tokens=1-3 delims=," %%i in (location.tmp) do (
    if not "%%i" == " " (
     set unit=%%i 
    ) 
    if not "%%j" == " " (
     set building=%%j 
    ) 
    if not "%%k" == " " (
     set room=%%k 
    ) 
) 
for %%i in (unit,building,room) do (
    call :SUB_GET %%i 
) 
echo !unit!,!building!,!room!> location.tmp 
endlocal 
exit /b 0 

:SUB_GET 
if not defined %1 (
    set /p %1=What %1? 
    goto :EOF 
) 
set /p new%1=What %1? (default is !%1!) 
if not "!new%1!" == "" (
    set %1=!new%1! 
) 

デフォルトを維持しようとする場合を除き、すべて動作します。値が正しければ(例えば、「どの部屋(デフォルトは403)」と入力して403を押してください)

のように、入力を押すだけで問題はありません。コードは新しい環境変数(入力)をチェックして空であるかどうかを確認し、古い変数に新しい変数(空文字列)の値を割り当てます。

デフォルトの(1、A、4のような)既存のlocation.tmpを作成し、Enterキーを押してそれぞれを確認すると、バッチステートメントecho !unit!,!building!,!room!>location.tmpが実行されますが、location.tmpは変更されません。

ここで何が起こっているのですか?

答えて

2
set /p %1=What %1? (default is !%1!) 

...完全に正常に動作します。

new%1 - そしてさらにnewであっても、新しいROOMの必要性が明白ではないので十分でした。古いデータを保持しないように慎重にしなければならなかったでしょう。

+0

ああ、それは物事を簡素化します。私は奇妙で不必要に複雑なバッチスクリプティングが本当にどれほど大事なのかを決して克服することはできませんが、いつか私はいつもそれを叫びたくないほど知っています。ありがとう! – Tyg13

0

echo !unit!,!building!,!room!>location.tmp行の変数の実行が遅すぎると、それらが余りにも遅く展開されているため、何らかの理由で文が正しく実行されません。それらを通常の%変数に置き換えると、両方の問題が修正されます。比較が正しく機能していることがわかりました。

EDIT:理由は考えられませんが、上記は間違っています。以下のスクリプトは、単にset /pを入力して返信する場合は、変数が変わらない

@echo off 
setlocal 
setlocal EnableDelayedExpansion 
if not exist location.tmp (
    echo , , > location.tmp 
) 
for /f "tokens=1-3 delims=," %%i in (location.tmp) do (
    if not "%%i" == " " (
     set unit=%%i 
    ) 
    if not "%%j" == " " (
     set building=%%j 
    ) 
    if not "%%k" == " " (
     set room=%%k 
    ) 
) 
for %%i in (unit,building,room) do (
    call :SUB_GET %%i 
) 
echo !unit!,!building!,!room!> location.tmp 
endlocal 
exit /b 0 

:SUB_GET 
if not defined %1 (
    set /p %1=What %1? 
    goto :EOF 
) 
set /p %1=What %1? (default is !%1!) 
関連する問題