2017-01-30 8 views
0

私のコードのすべてが最後の部分を除いてうまくいきます。バッチファイル - 異なるフォルダにCSVを出力する

私は同じ名前のフォルダに各テキストファイルを出力したいと思います。 3つのテキストファイルを1つのフォルダPentahoOutputsに出力しています。しかし、私は次のように出力することをしたいと思っています:

フォルダsystem2.object2.assetsするファイルsystem2.object2.assetsに フォルダsystem3.object3.assetsが含まれているが フォルダsystem4.object4.assetsが含まれているファイルsystem3.object3.assetsが含まれていますファイルsystem4.object4.assets

@echo off SetLocal EnableDelayedExpansion 
SET DELIMS=, 
SET COMMAND=AddChange 
SET EN=EN 
SET ASSETS=Assets 
SET DIREC = C:\Users\user.username\Documents\Training\BatchFiles\PentahoOutputs\ 
SET DELIMS2=. 

FOR /D %%a IN (C:\Users\user.username\Documents\Training\BatchFiles\PentahoOutputs\*) DO (SET subdirs=%%a 

result=!subdirs:~71,7! 

result2=!subdirs:~79,7! 

set "concats=!result!!delims!!result2!!DELIMS!!COMMAND!!DELIMS!!EN!" 
echo !concats! 

echo !CONCATS! >>C:\Users\user.username\Documents\Training\BatchFiles\PentahoOutputs\!result!!delims2!!result2!!delims2!!assets!.CSV 

) 

PAUSE>NUL 

編集**********

以下以下に、問題のコードを変更する3つのフォルダのそれぞれに3つの各ファイルを置きます。..しかし、私は各フォルダに1つのファイルがほしい

あなたの投稿コードから0
for /d %%b in (C:\Users\usre.username\Documents\Training\BatchFiles\PentahoOutputs\*) DO (echo !CONCATS! >>%%b\!result!!delims2!!result2!!delims2!!assets!.csv) 
+2

'SET DIREC ='では、変数名の一部となるので '= '記号の周りの_spaces_を削除し、そうでなければ値を返します。 – aschipfl

答えて

1

- 与えられたaschipflの変更に述べたように(あなたがdirecを使用しようとしませんが)

あなたの投稿のコードでは、ユーザ名を偽装するために、私が想定し、試みで台無しにされています。また、関連するセクションだけを表示するように実際のコードを削減したようです。これは良いと理解できる(ただし、あなたの編集は、コード内の明白なタイプミスがある - 。あなたは、可能な限りカット&ペーストすべき理由である)ので、

からsetlocal@echo off&で区切る必要があります以下(私の好み)を別の行に置いてください。

for ... %%a ...ブロック内で、result*のキーワードsetを削除しました。

あなたがパス名に加えた変更に合わないsubstringingのために使ってきた固定値は、そうresultで結果がある(例えば)「tem3.ob」

値がない場合ブロック内で変更すると(delimsなど)、 - resultの変更を使用することをお勧めします。したがって、!result!%result%ではありません。 !delims!ももちろん動作しますが、遅延拡張フォームを使用すると、読者はそれが変わると信じるようになります。 (意見)

文字列の割り当てでは、set "var=value"を引用符として使用するのが最も適しています。割り当てられた値に迷った末尾のスペースが含まれないようにします。あなたは今までそれが一度起こる持っている必要があります...

OK - ここで私はテストディレクトリのU:を使用しましたリビジョン

@echo OFF 
SetLocal 
SET DELIMS=, 
SET COMMAND=AddChange 
SET EN=EN 
SET ASSETS=Assets 
SET DIREC=U:\Users\user.username\Documents\Training\BatchFiles\PentahoOutputs\ 
SET DELIMS2=. 

FOR /D %%a IN (%direc%*) DO (
FOR /f "tokens=1,2,3 delims=." %%p IN ("%%~nxa") DO IF /i "%%r"=="%assets%" (
    echo %%p%delims%%%q%DELIMS%%COMMAND%%DELIMS%%EN% 
    echo %%p%delims%%%q%DELIMS%%COMMAND%%DELIMS%%EN% >> %%a\%%~na.CSV 
) 
) 

GOTO :EOF 

注意(それは私のマシン上のRAMドライブです)

です

外部ループがある場合、%%aにはディレクトリへのフルパス名が割り当てられます。

ターゲットディレクトリ名がsystem2.object2.assetsであることを暗示しているので、%%~nxa(%%の名前と拡張子)は便利にこの文字列を保持します。.のdelimsを使用し、最初の3つのトークンを選択する%%rこれに%%qassetssystem2%%pobject2を割り当てるだろう解析するsubstringingの問題を回避し、任意の長さであることがsystemobjectを可能にする - だけではなく7

ifステートメントは、for...%%pのメインブロックが、に適合する見つかったディレクトリに対してのみ実行されることを保証します。 .asset(/iif大文字と小文字を区別しないことができる)

先ファイル名ができるのでenabledelayedexpansionが必要とされないように必要なラインは、次いで、メタ変数および定数から構成することができます。

+0

これは動作します、ありがとう、説明に感謝します – Karen

関連する問題