用于重命名和移动带参数的文件的Windows脚本

时间:2014-11-18 06:29:55

标签: batch-file

我一直在尝试创建一个检查文件名的脚本,如果是肯定的,然后将其重命名并将其移动到服务器中的文件夹,然后检查下一个参数并执行相同的操作。

完整的想法是,我有一个生成CSV文件的系统,文件的名称是根据区域生成的,如果我在护理中,它会生成一个带有“护理”字样的文件,所以这将帮助我编写脚本以识别使用脚本放置此文件的位置。它将不得不阅读3个参数,但我刚才提到了2个。

文件名:testing.bat(我正在创建一个循环)

到目前为止,这是我的代码。

if exist "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\*Nursing*.csv" (
ren "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\*Nursing*.csv" names.csv
move /y "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\names.csv" \\10.10.10.10\scenarios\Nursing
)
else if exist "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\*Midwifery*.csv" (
ren "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\*Midwifery*.csv" names.csv
move /y "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\names.csv" \\10.10.10.10\scenarios\Midwifery
)
else (
echo. Not files detected!

)


timeout /t 1
testing.bat

欢迎任何帮助。

3 个答案:

答案 0 :(得分:1)

您遇到语法问题:else子句的位置。它必须放在(使用时)与if命令的右括号相同的行中。如果将它放在下一行,解析器将把它作为另一个命令,而不是前一个if

的延续
if exist .... (
  ....
) else if exist .... (
  ....
) else (
  ....
)

此外,虽然不是问题,但更容易将您使用的路径放在变量中并使用变量而不是文字

set "sourceFolder=E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV"
set "targetFolder=\\10.10.10.10\scenarios"

if exist "%sourceFolder%\*Nursing*.csv" (
    ren "%sourceFolder%\*Nursing*.csv" names.csv
    move /y "%sourceFolder%\names.csv" "%targetFolder%\Nursing"
) else if exist ""%sourceFolder%\*Midwifery*.csv" (
    ren "%sourceFolder%\*Midwifery*.csv" names.csv
    move /y "%sourceFolder%\names.csv" "%targetFolder%\Midwifery"
) else (
    echo. Not files detected!
)

一旦我们使用变量来存储固定数据,我们就可以开始使用变量来保存不断变化的数据。由于正在执行的代码始终相同,请在执行的代码中标识更改的部分,并使用for命令迭代文件夹中不断变化的信息和文件

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "sourceFolder=E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV"
    set "targetFolder=\\10.10.10.10\scenarios"

    for /l %%z in (0) do (
        setlocal enabledelayedexpansion
        echo(!time! - Searching files ....
        endlocal
        set "found="
        for %%a in ( Nursing Midwifery XXXX YYYY ) do (
            for %%b in ("%sourceFolder%\*%%~a*.csv") do (
                move /y "%%~fb" "%targetFolder%\%%~a\names.csv"
                set "found=1"
            )
        )
        if not defined found echo(.... No file detected !
        timeout /t 1
        echo(
    )

for /l %%z定义了一个无限循环(只是为了避免批处理文件中的自调用或标签的goto命令)

for %%a将迭代“参数”列表。对于列表中的每个元素,可替换参数%%a将保留其值并将其公开给do子句中的代码,其中%%~a(可替换参数中的值,如果没有引号,则为present)用于搜索文件并确定目标文件夹。

for %%b将搜索文件。在这种情况下,可替换参数%%b将保存对找到的文件的引用。此引用稍后用于move文件(%%~fb%%b引用的文件的完整路径)

答案 1 :(得分:0)

也许是这样的。您可以通过列出要根据服务器目录检查的文件名来扩展它。因此,脚本将循环访问与目标列表匹配的文件。

@echo off  
SETLOCAL

if not exist \\deviceName\e$\directory\filename.csv (
       echo filename.csv not found!
) else ( 
       ren \\deviceName\e$\directory\filename.csv filename2.csv
       move /-Y \\deviceName\e$\directory\filename2.csv \\deviceName2\e$\director\filename2.csv

       if not exist \\device\e$\diretory\filename3.csv (
             echo filename3.csv not found!
       ) else (
               ren \\deviceName\e$\directory\filename3.csv filename4.csv
               move /-Y \\deviceName\e$\directory\filename4.csv \\!deviceName2\e$\director\filename4.csv
       )
)
ENDLOCAL
EXIT

答案 2 :(得分:0)

这是一个powershell脚本,可以干净地处理任意数量的部门,并且仍然易于维护。

$DepartmentList = "Nursing","Midwifery","Ortho","Pedi"
$SourceFolder = "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV"
$DestFolder = "\\10.10.10.10\scenarios\"

ForEach($Dept in $DepartmentList)
{
    if(Test-Path "E:\inetpub\wwwroot\sim_blitzv15_MSSQL\CSV\*$Dept*.csv")
    {
        Move-Item "$SourceFolder\*$Dept*.csv" -Destination "$DestFolder\$Dept\names.csv" -Force
        $FileFound = $true
    }
}

If(-not ($FileFound))
{
    Write-Warning "Not files detected!"
}

如果您还没有使用PowerShell,那么这是一个很好的启动项目,可以使用./ / p>