-1

うまくいけば、これは簡単な答えです。基本的に、FileSample.txt と呼ぶ複数行のテキスト ファイルの内容を取得できるようにしたいと考えています。の行に沿って何かが含まれている可能性があります

Some text sample1 : Extra1  
Some text sample2 : Extra2        
Some text sample3 : Extra3  
Some text sample4 : Extra4  

基本的に、Output.csv と呼ぶ 2 列の csv に入力します。最初の列はファイル名で、2 番目の列はテキスト ファイルの内容 (ハード リターンを含む) である必要があります。したがって、本質的にcsvにはこれが含まれている必要があります...

FileName,Contents  
FileSample.txt,"Some text sample1 : Extra1 Some text sample2 : Extra2 Some text sample3 : Extra3  Some text sample4 : Extra4"  

ここでの完全な混乱と、まったく初心者のスクリプト スキルについてお詫び申し上げます。私は本当にこれを成し遂げようとしているので、powershellで解決策を作りました。

$Content = Get-Content .\FileSample.txt 
$FileName = Get-ChildItem .\FileSample.txt

New-Object PSObject -Property @{
    FileName  = $FileName.Name
    Content = "$Content"
} | Export-Csv .\Output.csv -NoTypeInformation

バッチ ファイルを使用してこれを行うという最初の要求から逸脱したくなかったのと同じくらい、ExifTool から保存されたファイルを使用することに頼ることなく、以下の vbscript から同じ結果を得ることができました。

Dim WshShell, oExec
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("%comspec% /c ""D:\EXIFTOOL\exiftool.exe"" test.jpg")
x1 = oExec.StdOut.ReadAll
x2 = Replace(x1, chr(34), chr(34) & chr(34))

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLogFile = objFSO.CreateTextFile("D:\EXIFTOOL\Output.csv", 1, False)

objLogFile.Write "Filename,"
objLogFile.Write "ExifData"
objLogFile.Writeline
objLogFile.Write chr(34) & "sample6.csv" & chr(34) & ","
objLogFile.Write chr(34) & x2 & chr(34)
objLogFile.Writeline
objLogFile.Close
4

1 に答える 1

1
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

@ECHO FileName,Contents

SET FILE=FileSample.txt

SET FIRST=^"%FILE%^",^"
FOR /F "tokens=*" %%l IN (%FILE%) DO @((SET LINE=%%l) & (@ECHO !FIRST!!LINE:^"=^"^"!) & (SET FIRST=))
@ECHO ^"

これは、ファイル名、コンマ、二重引用符、そしてファイルのすべての行をエコーし​​ます (二重引用符は二重引用符に置き換えることで「エスケープ」されます。これは、ファイル内のデータに二重引用符が含まれている可能性がある場合に必要です)。 )、その後に (閉じる) 二重引用符が続きます。

私が見ている1つの制限は、ファイルが改行で終わっていない場合、終了二重引用符が効果的に改行を追加することです。ファイルが改行で終わっている場合、FOR ループはその空の行を処理せず、出力は正しくなります。その制限を克服するには、おそらく手動で行を数え (行を反復する追加のループ)、追加の変数を追加して FOR ループにチェックインする必要があります。あなたが本当に本当にその振る舞いを望んでいない限り、私が考えるのは面倒です。(ある時点で、バッチ/CMD で何かを実行する負担は、単純なことを実行するために PowerShell、VBScript、またはその他の実際のプログラミング言語に依存するよりも悪くなります。)

多数のファイルを処理する場合は、最後の 3 行を「サブルーチン」に入れ (ネストされた FOR ループを作成するよりも私の好みです)、問題のファイルを反復処理する FOR ループ内で CALL することができます。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

@ECHO FileName,Contents

FOR %%f IN (FileSample*.txt) DO CALL :PROCESS_FILE "%%~f"

GOTO :EOF

:PROCESS_FILE
SET "FILE=%~1"

SET FIRST=^"%FILE%^",^"
FOR /F "tokens=*" %%l IN (%FILE%) DO @((SET LINE=%%l) & (@ECHO !FIRST!!LINE:^"=^"^"!) & (SET FIRST=))
@ECHO ^"
EXIT /B

:PROCESS_FILE への引数の余分な引用符は、ファイル名にスペースが含まれている場合を処理するためのものです。スペースが含まれていて引用符を付けていない場合、ファイル名の一部は個別の引数のように扱われます。その場合は %* を使用できると思いますが、データを単一の単位として扱いたいことを明確にするために、引用することを好みます。

于 2013-06-22T05:26:12.117 に答える