【问题标题】:find string in file and copy the folders在文件中查找字符串并复制文件夹
【发布时间】:2020-02-09 23:25:12
【问题描述】:

我有一个如下的文本文件,我需要检测/查找/提取“”中的文件名,然后在另一个文件夹中搜索该文件名并将其复制到一个新文件夹中。 以及任何出现的这些。

#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

在这种情况下,我需要 bat 将 SD.h SPI.h TMRpcm.h 和 HCSR04.h 复制到新文件夹中。我尝试了很多但没有成功。 我不放我以前的尝试,因为它们是非常基本的东西。在某个时刻,我意识到我需要帮助。

【问题讨论】:

  • edit您的问题并添加您到目前为止尝试过的代码!

标签: windows file batch-file text


【解决方案1】:

您可以这样做,只需将变量修改为您的:

@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
::-----------------------------------------------------

【讨论】:

  • 我的尝试失败了。我尝试在某些网站上看到的代码,但总是遇到一些错误。我试试你的并分享结果。谢谢
  • 您的代码是朝着正确方向迈出的一大步!!!一个管理运行它,它找到文件并复制它们,但也复制每个包含例如字母“sd”的文件,但它是什么!我需要调查并处理它。谢谢!!!
【解决方案2】:

也许这就是您正在寻找的东西:

@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 /?

【讨论】:

  • 我做了很多尝试,但我可以让它工作。我当然知道并理解一些 cmd 命令,我从tutorialspoint.com/batch_script/batch_script_strings.htm 阅读。但我能得到它。我修改了您的示例并运行它,但没有任何反应
  • @For /F "Tokens=2 Delims=" %%G In ('^""%__AppDir__%findstr.exe" /IRC:"^#include[\]*<.>" "test.txt"^"' )做@"%__AppDir__%xcopy exe" "C:\Program Files (x86)\Arduino\libraries\%%G" "C:\Program Files (x86 )\Arduino\libraries" /Y>NUL 2>&1
  • @OscarCastano,当然似乎什么也没发生。 您对源目录和目标目录使用相同的位置!如果目标路径受到保护,无法正常用户访问,您可能还需要运行“以管理员身份”。
【解决方案3】:


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

【讨论】:

  • 好吧....我无话可说...您的第一个示例效果很好!它只是解决了 ARDUINO IDE 的问题,并且由于某种原因他们没有解决它。你写了一些代码,然后分享它或一段时间后需要它,只是为了发现你需要一些你不再拥有的库,或者你不记得你以前有哪个版本!
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多