найти строку в файле и скопировать папки - PullRequest
1 голос
/ 10 февраля 2020

У меня есть текстовый файл, как показано ниже, мне нужно обнаружить / найти / извлечь имена файлов внутри "<" и ">", а затем найти это имя файла в другой папке и скопировать его в новую папку. и это в любом случае.

#include <SD.h>                      // Se inclye la libreria SD
#include <SPI.h>              // Se incluye la libreria para la comunicacion SPI
#include <TMRpcm.h>           //  Se incluye la libreria para reproducir .WAV
#include <HCSR04.h>

#define SD_ChipSelectPin 4  // Selecciona la tarjeta SD. Puede ser cualquier pin que NO se esté         utilizando ya. 
TMRpcm Audio;   // Se crea un objeto para usar las funciones de la libreria TMRpcm
UltraSonicDistanceSensor distanceSensor(7, 8);  // Initialize sensor that uses digital pins 13 and 12.

bool boton_A = 0; //Variable que guarda el estado del pulsador de cambiar de cancion
bool boton_B = 0; //Variable que guarda el estado del pulsador de pausar
int song = 0; //Se inician en 0 para que cuando se incremente la cancion al principio se reproduzca la cancion 1
int last_song = 0; //Almacena el número de la ultima cancion
int pos;        // posicion detectada

в этом случае мне нужно летучая мышь, чтобы скопировать SD.h SPI.h TMRpcm.h и HCSR04.h в новую папку. Я много пробовал, но безуспешно. Я не делаю свои предыдущие попытки, потому что они очень простые вещи. И в какой-то момент я понял, что мне нужна помощь.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Вы можете сделать что-то подобное, просто измените переменные на свои:

@echo off
Title find string in file and copy to a new folder using batch script
Rem You should modify the variable InputFile to yours 
set "InputFile=Test.txt"
Set "OutPutFile=Output.txt"
Call :Extract "%InputFile%" "%OutPutFile%"
Rem You should modify the variable Source_Folder to yours 
Set "Source_Folder=E:\StackOverflow\"
Rem You should modify the variable Target_Folder to yours 
Set "Target_Folder=E:\TargetFolder\"

If Not Exist "%Target_Folder%" MD "%Target_Folder%"

@for /f "delims=" %%a in ('Type "%OutPutFile%"') do (
    @for /f "delims=" %%b in ('Dir /b /s "%Source_Folder%" ^|find /I "%%a"') do (
        echo "%%~fb"
        Copy /Y "%%~fb" "%Target_Folder%"
    )
)
pause
Exit
::-----------------------------------------------------
:Extract <InputFile> <OutPutFile>
(
echo Data = WScript.StdIn.ReadAll
echo Data = Extract(Data,"\<(\S+)\>"^)
echo WScript.StdOut.WriteLine Data
echo Function Extract(Data,Pattern^)
echo    Dim oRE,oMatches,Match,M,i
echo    set oRE = New RegExp
echo    oRE.IgnoreCase = True
echo    oRE.Global = True
echo    oRE.Pattern = Pattern
echo    set oMatches = oRE.Execute(Data^)
echo    If not isEmpty(oMatches^) then
echo        For i = 0 To oMatches.Count - 1
echo            M = M ^& oMatches(i^).SubMatches(0^) ^& vbcrlf 
echo        Next 
echo    End if
echo    Extract = M
echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
exit /b
::-----------------------------------------------------
0 голосов
/ 10 февраля 2020


1) Этот код будет пытаться найти ваши файлы в C:\Program Files (x86)\Arduino\libraries, и, если найден, будет искать для следующего файла


@echo off && setlocal EnableDelayedExpansion

title <nul && title .\%~nx0 
cd/d "%systemdrive%" && cd\ 

set "_output_dir=G:\SUPER_USER\Q60142344" 
set "_input_file=G:\SUPER_USER\Q60142344\Q60142344.txt"

for %%s in (findstr,find,where
)do set "_%%~s=%%~s" && call set "_%%~s=%__APPDIR__%!_%%~s!.exe"

cd /d "C:\Program Files (x86)\Arduino\libraries" 
for /f "tokens=2 delims=<>" %%i in ('type "!_input_file!"^|!_findstr! "<  >"
')do for /f "tokens=* delims= " %%# in ('2^>nul !_where! /r . "%%~i"^|!_find! /i "%%~i"
')do if not "%%~#"=="!_output_dir!\%%i" >nul copy /y /v "%%~#" "!_output_dir!" && echo/File "%%~#" Copied to "!_output_dir!"))

endlocal && goto :EOF

  • Выходы:
File "C:\Program Files (x86)\Arduino\libraries\SD.h" Copied to "G:\SO_en\Q60142344"))
File "C:\Program Files (x86)\Arduino\libraries\SPI.h" Copied to "G:\SO_en\Q60142344"))
File "C:\Program Files (x86)\Arduino\libraries\HCSR04.h" Copied to "G:\SO_en\Q60142344"))

  • Просто отредактируйте, добавив соответствующее значение в вышеуказанную переменную для соответствия необходимым действиям
set "_output_dir=G:\SO_en\Q60142344" && set "_input_file=G:\SO_en\Q60142344\Q60142344.txt"

set "_output_dir=A:\the\path\to\folder\target" && set "_input_file=B:\the\path\to\file\input_file.h"




2) Этот код попытается найти ваши файлы в C:, и, если найден, будет искать следующий файл

Кроме того, он не будет искать в папке назначения, если он существует в папке назначения, он также будет игнорироваться.

  • Просто отредактируйте, добавив соответствующее значение в вышеуказанной переменной к сопоставьте необходимые действия
set "_output_dir=G:\SO_en\Q60142344" && set "_input_file=G:\SO_en\Q60142344\Q60142344.txt"

set "_output_dir=A:\the\path\to\folder\target" && set "_input_file=B:\the\path\to\file\input_file.h"



@echo off && setlocal EnableDelayedExpansion

title <nul && title .\%~nx0 
cd/d "%systemdrive%" && cd\ 

set "_output_dir=G:\SO_en\Q60142344" 
set "_input_file=G:\SO_en\Q60142344\Q60142344.txt"

for %%s in (findstr,find,where
)do set "_%%~s=%%~s" && call set "_%%~s=%__APPDIR__%!_%%~s!.exe"

for /f "tokens=2 delims=<>" %%i in ('type "!_input_file!"^|!_findstr! "<  >"
')do if not exist "!_output_dir!\%%~i" (for /f "tokens=* delims= " %%# in ('
2^>nul !_where! /r %systemdrive%\ "%%~i"^|!_find! /i "%%~i"')do if not "%%~#"=="!_output_dir!\%%i" (
>nul copy /v "%%~#" "!_output_dir!" && cd/d "%~dp0" && echo/File "%%~#" Copied to "!_output_dir!" ))

endlocal && goto :EOF 

  • Выходы:
File "C:\Users\ecker\AppData\Local\Temp\SD.h" Copied to "G:\SO_en\Q60142344"
File "C:\Users\ecker\Downloads\SPI.h" Copied to "G:\SO_en\Q60142344"
File "C:\Users\ecker\Downloads\HCSR04.h" Copied to "G:\SO_en\Q60142344"



3) Этот код будет пытаться найти ваши файлы на всех ваших дисках компьютера и, если он найден на диске, будет искать следующий файл, не проверяя оставшиеся диски на тот же файл, который уже найден.

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

  • Просто отредактируйте, добавив соответствующее значение в приведенном выше переменная для соответствия необходимым действиям
set "_output_dir=A:\the\path\to\folder\target"
set "_input_file=B:\the\path\to\file\input_file.h"


@echo off && setlocal EnableDelayedExpansion

title <nul && title .\%~nx0
set "_output_dir=G:\SO_en\Q60142344"
set "_input_file=G:\SO_en\Q60142344\Q60142344.h"
set "_wmic=%__APPDIR__%wbem\wmic.exe logicaldisk get caption"
for %%s in (findstr,find,where)do set "_%%~s=%%~s" && call set "_%%~s=%__APPDIR__%!_%%~s!.exe"

for /f "tokens=2 delims=<>" %%i in ('type "!_input_file!"^|!_findstr! "< >"
')do for /f "tokens=1" %%D in ('!_wmic! ^|!_find! ":"')do cd /d "%%~D\" && cd\ & if not exist "!_output_dir!\%%~i" (
echo/Looking for file %%i in %%~D\... & for /f "tokens=*delims= " %%# in ('2^>nul !_where! /r \ "%%~i"^|!_find! /i "%%i"
')do if not "%%~#"=="!_output_dir!\%%i" >nul copy /y "%%~#" "!_output_dir!" && cd/d "%~dp0" && echo/File "%%~#" Copied to "!_output_dir!")

endlocal && goto :EOF


  • Выходы:
Looking for file SD.h in C:\...
File "C:\Users\ecker\AppData\Local\Temp\SD.h" Copied to "G:\SO_en\Q60142344"
Looking for file SPI.h in C:\...
File "C:\Users\ecker\Downloads\SPI.h" Copied to "G:\SO_en\Q60142344"
Looking for file TMRpcm.h in C:\...
Looking for file TMRpcm.h in G:\...
File "G:\TMRpcm.h" Copied to "G:\SO_en\Q60142344"
Looking for file HCSR04.h in C:\...
File "C:\Users\ecker\Downloads\HCSR04.h" Copied to "G:\SO_en\Q60142344"

Obs.: Чтобы скопировать в одну из папок ниже, следует понимать, что необходимо запустить пакет как администратор ::


%ProgramFiles%      == C:\Program Files (x86)
%ProgramFiles(x86)% == C:\Program Files (x86)
%ProgramW6432%      == C:\Program Files

0 голосов
/ 10 февраля 2020

Возможно, это именно то, что вам нужно:

@For /F "Tokens=2 Delims=<>" %%G In (
    '^""%__AppDir__%findstr.exe" /IRC:"^#include[\ ]*<.*\.h>" "S:\omewhere\A Text File.txt"^"'
)Do @"%__AppDir__%xcopy exe" "X:\Another Folder\%%G" "Y:\A New Folder\" /Y>NUL 2>&1

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

Я не буду расширяться ничего из вышеперечисленного, поскольку вы не показали никаких признаков того, что пытались выполнить какое-либо задание, прежде чем спросить здесь. Если вы хотите узнать, как работает конкретная команда, откройте окно командной строки (cmd.exe) и введите имя команды, а затем стандартный параметр справки /?, то есть for /?, findstr /?, и xcopy /?

...