2017-01-18 4 views
0

私はWindowsのcmdを操作していて、ループ内で変数を設定しようとしています。CMDがループ内で変数を設定しようとしています

for /d %%a in ("F:\backup*") do set folder=%%a 
ECHO %folder% 
PAUSE 

私はドライブFの「バックアップ」で始まる名前のフォルダを探し、%フォルダ%変数にそのフォルダの名前を保存する:ここで私が持っているコードです。たとえば、フォルダが "backup 2017-01-18"と呼ばれる場合、私はそれをvarに保存したいと思います。

代わりに、ECHOが "ECHOがオン"であることを印刷するだけで何も設定されていないようです。 forループは正しいですし、フォルダもそこにあります(私はすでにrobocopyを使って他のバッチにそのコードを使用しています)。

私は理論的にはFORループの中にすべてのコードを入れ、%folder%varの代わりに%% aを使用することができますが、これはハックな解決策のようです。

私が今までに見つけたすべての解決策は、EnableDelayedExpansionを使用していました。

Setlocal EnableDelayedExpansion 
for /d %%a in ("F:\backup*") do set folder=%%a 
ECHO !folder! 
PAUSE 

しかし、今ではECHOが "!folder!"を印刷します。あたかも変数を検出しないかのように。私がECHO%フォルダに戻すと、私は再び "ECHOがオン"であることを知ります。

編集: ここで問題が見つかりました。私はまた、バックアップフォルダに別のバッチファイルを実行していました。 ROBOCOPY(私がそのバッチで使用した)は、(コピーされたファイルが隠されていなくてもシステムo_0であっても)囲みフォルダをhidden、system、readonlyに設定していることが判明しました。ディレクトリのHSR属性を削除すると、ここに投稿されたコードが正常に動作するようになりました(初期バージョン)。

+0

です:

はこれでfor /Dループを置き換え、また、隠したり、システムディレクトリを検出するには?あなたの最初のコードセットは、それだけでうまく動作します。 – Squashman

+0

いいえ、これは手動で実行するバッチファイル全体です。 – ilozen

+0

その後、F:\ backup *は存在しません。 – Squashman

答えて

1

あなたのループfor /d %%a in ("F:\backup*") doは名前がbackupで始まる任意のディレクトリを検出しない場合には、それらのいずれかが存在しないか、および/またはシステムセット隠し属性があります。別のコードブロック内のコードのこのセットは

rem Change to parent directory "F:\" temporarily in order for the `~f` modifier to resolve the full path properly: 
pushd "F:\" || exit /B 1 
for /F "eol=| delims=" %%D in ('dir /B /A:D /O:N "backup*"') do set "folder=%%~fD" 
popd 
関連する問題