1

DOS バッチ ファイルの変数置換メカニズム、特に for ループの変数置換メカニズムについて理解できません。

単純化されたバッチの問題: 次のディレクトリを想像してください
01foo.txt
02foo.dir (これはディレクトリです)
bar01 (これはディレクトリです)
bar02 (これはディレクトリです)

このディレクトリ内の「bar」で始まらないすべてのファイル/ディレクトリを、bar+_the_first_2_characters_of_the_filename_or_directory_name のサブディレクトリに移動したいと考えています。
この場合、01foo.txt は bar01 に移動され、02foo.dir は bar02 に移動されます。

次のスクリプトは私の最初の試みです。

setlocal EnableDelayedExpansion  
for %%A in (*) do (  
    set _x=%%A
    if (!_x:~0,2! NEQ "bar") move %%A bar!_x:~0,2!
)
endlocal

これはファイルに対してのみループするように見えるという事実を除けば、まったく機能しません:-)。if ステートメントで「3! は現時点では予想外でした」というエラーが表示されます。

状況/スクリプトを改善する方法について何か考えはありますか?

ありがとう

4

1 に答える 1

2

構文の問題だけです...

このIFステートメントは、周囲の括弧を受け入れないことを期待していません。
のコンマはIFステートメントを区切ります。両方の部分を引用するか、独自の行!_x:~0,2!に移動できます。 引用する場合は、引用する必要もあります。 set prefix=!_x:~0,2!"
"bar""!prefix!"

それで全部です

setlocal EnableDelayedExpansion  
for %%A in (*) do (  
    set "_x=%%A"
    set "prefix=!_x:~0,2!"
    if "!prefix!" NEQ "bar" move %%A bar!prefix!
)
endlocal
于 2012-08-27T13:06:17.423 に答える