Как записать все * .txt файлы в каталоге в один файл с именем исходного файла в каждой строке выходного файла? - PullRequest
0 голосов
/ 04 мая 2019

Код соответственно командной строки Windows ниже объединяет все тексты в один текстовый файл.
Но я хочу включить имя текстового файла в каждую строку текста, используя командную строку ниже.

for %f in (*.txt) DO type "%f" >> C:\Test\output.txt

Как этого достичь?

Ответы [ 3 ]

0 голосов
/ 04 мая 2019

Вот альтернативный метод, который использует для выполнения большей части работы.

По приглашению :

For /F "Tokens=1-2*Delims=:" %A In ('FindStr /N "^" *.txt 2^>Nul')Do @(Echo(%A:%C)>>"C:\Test\output.txt"

Удвойте % символов при запуске его из .

Код не проверен, могут возникнуть проблемы с файлами, строки которых начинаются с : символов, поэтому могут не подходить для всех файлов.

0 голосов
/ 05 мая 2019

Я ожидаю, что Select-String сделает то, что вы ищете. Вот скрипт файла .bat, который реализует тот же код.

powershell -NoLogo -NoProfile -Command ^
    "$logfile = 'C:\src\t\master.txt';" ^
    "if (Test-Path -Path $logfile) { Remove-Item -Path $logfile };" ^
    "Select-String -Pattern '^'  -Path 'y.txt' -Exclude $logfile |" ^
        "ForEach-Object { '{0}:{1}' -f ((Split-Path $_.Path -Leaf), $_.Line) } |" ^
        "Out-File -FilePath 'C:\src\t\master.txt' -Encoding ascii"

Кроме того, файл сценария .ps1 может быть создан и вызван из файла сценария .bat.

=== doit.ps1

$logfile = 'C:\src\t\master.txt'
if (Test-Path -Path $logfile) { Remove-Item -Path $logfile }

Select-String -Pattern '^'  -Path 'y.txt' -Exclude $logfile |
    ForEach-Object { '{0}:{1}' -f ((Split-Path $_.Path -Leaf), $_.Line) } |
    "Out-File -FilePath 'C:\src\t\master.txt' -Encoding ascii"

=== doit.bat

powershell -NoLogo -NoProfile -File '%~dp0doit.ps1'
0 голосов
/ 04 мая 2019

Этот пакетный файл можно использовать для этой задачи.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=C:\Test\output.txt"
del "%OutputFile%" 2>nul
for %%I in ("*.txt") do for /F usebackq^ delims^=^ eol^= %%A in ("%%I") do >>"%OutputFile%" echo %%~nxI;%%A
endlocal

Этот пакетный файл записывает в файл C:\Test\output.txt все непустые строки всех файлов * .txt, найденных в текущем каталоге с именем файла и расширением файла, но без пути к файлу и точкой с запятой в начале каждой строки.

Текущий каталог не должен быть C:\Test при запуске вышеуказанного командного файла. В противном случае пакетный файл ниже с дополнительным IF потребуется для предотвращения обработки выходного файла с тем же расширением файла, что и файлы для чтения и записи с именем файла в каждой строке.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=C:\Test\output.txt"
del "%OutputFile%" 2>nul
for %%I in ("*.txt") do if /I not "%%~fI" == "%OutputFile%" for /F usebackq^ delims^=^ eol^= %%A in ("%%I") do >>"%OutputFile%" echo %%~nxI;%%A
endlocal

Пакетный файл ниже может быть использован для чтения также пустых строк и записи их в выходной файл с именем файла и точкой с запятой.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=C:\Test\output.txt"
del "%OutputFile%" 2>nul
for %%I in ("*.txt") do if /I not "%%~fI" == "%OutputFile%" (
    for /F delims^=^ eol^= %%A in ('%SystemRoot%\System32\findstr.exe /N "^" "%%I" 2^>nul') do (
        set "Line=%%A"
        setlocal EnableDelayedExpansion
        >>"%OutputFile%" echo %%~nxI;!Line:*:=!
        endlocal
    )
)
endlocal

Измените echo %%~nxI;%%A на echo %%A;%%~nxI соответственно echo %%~nxI;!Line:*:=! на echo !Line:*:=!;%%~nxI, чтобы имя файла после точки с запятой в конце каждой строки выходного файла.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • set /?
  • setlocal /?

См. Как читать и печатать содержимое текстового файла построчно? с полным объяснением используемого кода. Легко видеть, что командный процессор Windows предназначен для выполнения команд и приложений, а не для обработки текстовых файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...