1

連結された一連の変数を新しく SET 変数に格納しようとしています。変数を別の変数に追加すると、実際には正しく設定されないようです。BATCH が変数内に変数を格納できるかどうか、または現在持っているものを超えてフォーマットを行う必要があるかどうかに興味があります。

例: 「oldDirectory」変数は、次と同じものを表示する必要があります。 "%progdata%\%datetime%"

@echo off

For /f "tokens=2-4 delims=/ " %%a in ("%DATE%") do (
    SET YYYY=%%c
    SET MM=%%a
    SET DD=%%b
)
For /f "tokens=1-3 delims=/:." %%a in ("%TIME%") do (
    SET HH24=%%a
    SET MI=%%b
    SET SS=%%c
)

SET datetime=%YYYY%%MM%%DD%_%HH24%%MI%%SS%
SET progdata=C:\ProgramData

@echo on    

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="%progdata%\%datetime%"
echo %oldDirectory%
) 
pause
4

3 に答える 3

2

最初の方法:

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="%%progdata%%\%%datetime%%"
call echo %oldDirectory%
) 

2 番目の方法:

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="!progdata!\!datetime!"
setlocal EnableDelayedExpansion
echo %oldDirectory%
) 

興味深い点は、echo %oldDirectory%コマンドがとの現在の値を同じの!で表示することです。progdatadatetimeoldDirectory

編集例が追加されました

@echo off

set progdata=C:\ProgramData

echo First method:
SET oldDirectory="%%progdata%%\%%date:/=%%_%%time::=%%"
call echo %oldDirectory%

echo Second method:
SET oldDirectory="!progdata!\!date:/=!_!time::=!"
setlocal EnableDelayedExpansion
echo %oldDirectory%

出力:

First method:
"C:\ProgramData\14082013_211303.20"
Second method:
"C:\ProgramData\14082013_211303.21"
于 2013-08-14T17:26:46.133 に答える
2

で試してください:

CALL SET oldDirectory="%progdata%\%datetime%"
CALL ECHO %oldDirectory%
于 2013-08-14T17:08:34.420 に答える
1

DELAYED EXPANSIONSOで際限なく議論されている標準的な問題があります。

バッチが"Block statement"- に遭遇すると、これは通常、あなたのような多くの行にまたがる括弧付きのステートメントでIF EXISTあり、ステートメント全体が閉じ括弧まで解析され、この時点で、ANY%var%はその変数のそのままの値に置き換えられますWHEN THE STATEMENT IS解析済み

その結果、 yourはsince has no value AT PARSE TIMEECHO %olddirectory%に置き換えられ、実行すると報告されますが、ISは解析時に設定されるため、に置き換えられますECHOolddirectoryECHOECHO is On/Off progdataecho Found %progdata%echo Found C:\ProgramData

最も簡単な解決策は、ECHOステートメントを外部に移動することです。block

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
)
echo Olddirectory=%oldDirectory%

(ステートメントが設定されていない場合にエコーするものを見つけるようolddirectory=に追加しました)echoolddirectory

値を表示する 2 番目に簡単な方法は、

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
 CALL echo %%oldDirectory%%
)

ここで、ECHOコマンドは のコンテキストでは展開されませんが、IFコンテキストCALLのランタイム値から環境を取得するのコンテキストで展開されIFます。

値を表示する 3 番目に簡単な方法は、コマンドのdelayedexpansionオプションを使用することです。setlocalNT バッチ コマンドは、従来から開始されます。

@echo off
setlocal

echoingローカル環境を抑制して確立します。のコンテキストendlocalで または ファイルの終わりに達すると、ローカル環境への変更はすべて取り消されます。setlocalこのマントラが一貫して守られている場合、あるバッチで変数が確立され、次のバッチで環境が「汚れている」という状況は発生しません。cmd同じセッション内でオリジナルを 2 回実行することを検討してください。progdata、および確立している他のすべての変数は再臨のために設定されたままになります-したがってolddirectory、最初の呼び出しで設定され、何らかの理由で2番目に明示的に設定されていない場合、その古いデータを保持します。setlocalこれらすべての変更をバックアップします。

setlocal enabledelayedexpansionミックスに余分な機能を追加します。%var%は のPARSE -TIME値に解決されますが、が呼び出されたvar場合はRUN-TIME値に解決されます -ループ内で変化するため...delayedexpansion!var!FOR

したがって、追加

SETLOCAL ENABLEDELAYEDEXPANSION

戦略的なポイントで (後@echo off輪から離れるまで...)、表示を簡単に変更できます。olddirectory

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
 echo !oldDirectory!
) 
于 2013-08-15T14:05:52.990 に答える