【问题标题】:Search for substring in folder names在文件夹名称中搜索子字符串
【发布时间】:2016-08-25 07:02:45
【问题描述】:

我希望有人可以帮助我解决我的问题。

每个订单都有一个包含文件夹的目录,例如

L:\Med_Department\Orders\
L:\Med_Department\Orders\T0012345_AB100_CustomerA_site2
L:\Med_Department\Orders\T0012346_CD350-CustomerB site1
...

如何通过搜索订单号获取文件夹的全名。 例如当我输入订单号时:

T0012345

, 我希望脚本存储

T0012345_AB100_CustomerA_site2

在一个变量中,以便我可以使用它来为我的新项目创建文件夹而不是订单号。

订单号是唯一的,格式为 Txxxxxxx 。文件夹名称的其余部分可以用下划线、空格或其他字符分隔。

如果未找到订单号(例如订单号输入不正确),用户应重新输入订单号。

这是我到目前为止所取得的成就。 我输入订单号,脚本将模板文件夹复制到我的项目目录中,订单号作为文件夹名称。

@Echo off

rem directories
set template= "N:\Documentation\New_folder_OrderNo-Type-Customer-site"
set dirOrder= "L:\Med_Department\Orders\"
SET dirProjects= "Z:\Projects\2016\"

rem input Order No.
echo Please enter the order number?
echo.
set /p OrderNo=OrderNo:

rem target directory 
set dirNewProject=%dirProjects%%OrderNo%\
echo %dirnewProject%

pause
rem copy content from template into target directory
xcopy %template% %dirNewProject% /S /E /C /H /O /R /Y /D /V

rem open target directory
explorer %dirNewProject%

;exit

提前致谢。

【问题讨论】:

  • ;exit 没有注释掉exit 命令,因为; 只不过是一个标记分隔符(也像空格),所以exit 正在运行被执行;要注释掉,请使用rem exit:: exit;顺便说一句,exit 终止运行批处理文件的cmd 实例,而exit /B 仅退出批处理文件;另见exit /?...

标签: batch-file search substring directory


【解决方案1】:

类似这样的:

@Echo off

rem directories
set template= "N:\Documentation\New_folder_OrderNo-Type-Customer-site"
set dirOrder = "L:\Med_Department\Orders\"
SET dirProjects= "Z:\Projects\2016\"

:again
rem input Order No.
echo Please enter the order number?
echo.
set /p OrderNo=OrderNo:



if not exist "%dirOrder%%OrderNo%\" (
    echo order %OrderNo%  not found
    goto :again
)

:: the rest of the script
:: ...

?

【讨论】:

  • 抱歉,我编辑评论的速度太慢了。对我来说真正的问题是,当我只输入订单号而不是整个文件夹名称时,如何获取整个文件夹名称。在您的解决方案中,我必须输入 T0012345_AB100_CustomerA_site2 以检查该文件夹是否存在。但我只想输入 T0012345 并且脚本应该检查是否存在以 T0012345_AB100_CustomerA_site2 开头的文件夹并将整个文件夹名称作为新变量返回。
【解决方案2】:

使用for 获取命令的输出。使用带有适当开关的dir 进行通配符搜索(注意:使用dir 通配符只能在路径的最后一个元素内使用)。

:again
set /p "OrderNo=OrderNo: "
set "folder=none"
for /f "delims=" %%a in ('dir /s /ad /b %dirOrder%%OrderNo%*') do set folder=%%a
if %folder% == none goto :again
echo found: %folder%

详情请参阅for /?dir /?

【讨论】:

    【解决方案3】:

    您可以简单地使用for /D 来对抗%OrderNo%* 模式。如果存在名称以%OrderNo% 开头的文件夹(应该只有一个,如果我没记错的话),dirNewProject 将保留其路径;如果没有,则变量将为空。之后您可以查看if [not] defined dirNewProject 并跳转到:LABEL

    rem (skipping data entry part of script)
    
    rem directory 
    set "dirNewProject="
    for /D %%I in ("%dirProjects%\%OrderNo%*") do set "dirNewProject=%%I"
    if not defined dirNewProject goto :LABEL
    
    rem (skipping file copy part of script)
    

    【讨论】:

    • @Compo 很抱歉今天编辑了答案,这是为了进行尝试,以提高您的肯定,请考虑我有限的英语,所以,谢谢。
    【解决方案4】:

    示例...(未经测试)

    @Echo Off
    SetLocal
    
    Rem directories
    (Set template=N:\Documentation\New_folder_OrderNo-Type-Customer-site)
    (Set dirOrder=L:\Med_Department\Orders)
    (Set dirProjects=Z:\Projects\2016)
    
    Rem exit if above directories do not exist
    For %%a In (template dirOrder dirProjects) Do (If Not Exist "%%%%a%%\" Exit/B)
    
    Rem make search dir current
    If /I Not "%CD%" Equ "%dirOrder%" PushD %dirOrder%
    
    :AskNum
    Rem input Order No.
    Echo(
    Echo( Please enter the order number?
    Echo(
    Set/P "OrderNo=OrderNo: "
    
    For /D %%a In ("%OrderNo%*") Do (Set OrderDir=%%~a)
    If Not Defined OrderDir (Choice /C /M "Would you like to try again?"
        If Errorlevel 2 Exit/B
        GoTo :AskNum)
    
    Rem new project directory 
    (Set dirNewProject=%dirProjects%\%OrderDir%)
    
    Rem copy content from template to new project directory
    If Not Exist "%dirNewProject%\" (
        RoboCopy "%template%" "%dirNewProject%" /E /Copy:DATSO)
    
    Rem open new project directory
    Explorer "%dirNewProject%"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2021-03-26
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多