2017-08-29 12 views
-2

ファイルをファイル名に従ってサブディレクタに配置しながら、あるディレクトリから別のディレクトリにファイルを移動する必要があります。あるディレクトリから別のディレクトリにファイルを移動し、ファイル名に基づいてフォルダに配置する

背景:

ファイル名(建物番号)-assign-FLR-pln.dgn

新しい場所は、Fのようになります。/割り当て間取り/建築/(ビルディング・ナンバー)/フロアプランファイル。

バッチファイルは、建物の番号のための.dgn名前を読み取る必要があるその後、

テイク(建物番号を建物番号フォルダ

に対応するフロアプランのサブフォルダにファイルを配置しますので... 1つのディレクトリから)-assign-FLR-pln.dgnファイルとそれを置く.....

割り当て間取り - 建物 - (建物番号) -FLOORプランファイル< - ここ

+0

バッチで書かなければなりませんか?あなたのシステムにはPythonやPHPなどのスクリプト言語がインストールされていますか?あるいは、システムにWindows 10のbashシェルがありますか?バッチは物事を書くにはちょっとひどい方法であり、書く/デバッグするのが紛らわしく、本当に意味をなさないものです。そのマシンにC#コンパイラがありますか?バッチベースのソリューションよりも優れたソリューションはどれかです。 – HumbleWebDev

+1

建物番号は常にかっこ内にありますか?あなたはカッコを含めてディレクトリ名を '(建物番号)'にするつもりですか?また、コードを表示せずにコーディングに関する質問をすることは、ここでは話題にはなりませんので、問題が発生しているコードを含めるには、投稿を[編集](https://stackoverflow.com/posts/45942579/edit)してください。問題の内容を正確に説明して – Compo

+0

申し訳ありませんが、私はStackoverflowに新しく、私は誰かにそれを私に助けを要求しているコードがありません。しかし、あなたの質問に答えようとすると、括れは単にプレースホルダに過ぎません。 Unholy Programmer - 私たちはCMDだけを使用する作業機械を使用します。したがって、ファイル名100-assig-flr-plan.dgnは、100フォルダーのフロアプランサブフォルダーに移動する必要があります。 –

答えて

0

この複雑なことをバッチファイルから直接やりたければ、習得するのが面倒です。

研究リスト:

FOR 
SET 
CALL 

あなたはファイル名を取得するにはFORコマンドを使用することをお勧めします。 %~のオプションに注意してください。例:

set BAT_DGNFNM= 
for %%F in (*.dgn) do set BAT_DGNFNM=%%~nF 

これにより、環境変数BAT_DGNFNMがベースファイル名に設定されます。しかし、それはそう本当に、あなたはそれがファイルごとにサブルーチンを呼び出すために必要な、すべてのファイルをループ:

for %%F in (*.dgn) do call :DODGN "%%~dpnxF" "%%~nF" 

これはサブルーチン:DODGNを呼び出し、それを2引用カプセル化されたパラメータを渡します。最初のファイルは完全修飾ファイル名で、2番目は基本ファイル名です。

その後、あなたはサブルーチンで処理する実際のファイルを実行します。

:DODGN 
set BAT_DGNFNM=%1 
set BAT_DGNBNM=%2 
REM Do stuff with BAT_DGNBNM using SET commands 
GOTO :EOF 

をあなたは、メインループが行われた後、あなたがサブルーチンに「フォールスルー」していないことを確認する必要があります、そして、あなたがしなければなりません完了したらので、このようなものになり、ご使用の環境変数をクリーンアップ:

@echo off 
for %%F in (*.dgn) do call :DODGN "%%~dpnxF" "%%~nF" 
goto ENDIT 

:DODGN 
set BAT_DGNFNM=%1 
set BAT_DGNBNM=%2 
REM Do stuff with BAT_DGNBNM using SET commands 
GOTO :EOF 

:ENDIT 
set BAT_DGNFNM= 
set BAT_DGNBNM= 

幸運を - このようなものが複雑に得ることができます。

決勝リマインダー:あなたの学習曲線のほとんどはSETコマンドとなります - それはあなたが1つの環境変数のうち、部分文字列を抽出する方法だと、別のに入れて、テキスト置換を行う、など

このようなものが道でありますVBSやPowerShellでは簡単です。

0

コードは表示されませんでしたが、お手伝いできました...

あなたは(初心者のための偉大なサイト: SS64を):使用するコマンドを知っていれば、それは非常に簡単です

各ファイルを取得するには、プレーンforループを使用してください。
は、ファイルをコピーするために使用copy
(すでに存在しない場合はエラーを無視して)先のフォルダを作成するために
使用md(あなたのコメントによると、それはダッシュで区切られた最初のトークンです)建物-NRを抽出するためにfor /fループを使用して、 。
完了しました。

@echo off 
REM prepare some files for testing: 
break>100-assign-flr-pln.dgn 
break>110-assign-flr-pln.dgn 
break>235-assign-flr-pln.dgn 

REM now copy them into their destination folders: 
set "dest=Assignment Floor Plans - Buildings - @ - Floor Plan Files" 
for %%f in (*-assign-flr-pln.dgn) do (
    for /f "tokens=1 delims=-" %%a in ("%%f") do (
    call md "%%dest:@=%%a%%" 2>nul 
    call copy "%%f" "%%dest:@=%%a%%\" 
) 
) 

REM now show the result: 
tree /f 

注:あなたの目的地を適応させる(F:\を追加)

"特殊効果":
call <command>:変数
2>nul抑制の誤差の範囲内で交換delayed expansion
@=%%a文字列を避けるために、パースの別の層を導入メッセージ

関連する問題