Windows Batch sript基于(部分字符串字符串)在CSV / txt文件中查找文件来移动文件

时间:2016-07-19 12:19:34

标签: windows shell

我正在寻找的可能是此解决方案的变体:Windows batch file to sort files into separate directories based on types specified in a csv

我的情况:服务器中的批处理过程会创建如下所示的文件:S0028513-010716-0932.txt。 S代表摘要,前五位数代表供应商,最后两位代表配送中心的连字符。连字符后面有日期,第二个连字符后面是时间戳。

我需要做的是:

  1. 设置月/年的变量(例如0716)(已设置为“set / P c:请输入MMYY:”)。 这部分已经完成。
  2. 创建一个包含子文件夹的文件夹(例如0716 \ PHARMA,0716 \ MEDICAL等)。 我已完成此部分。
  3. 在CSV文件中查找供应商编号(例如上面的S00285)和
  4. 根据MMYY \ PHARMA等将文件移动到相应的文件夹
  5. 第3点和第4点显然是遗漏的。一个实际的例子:有三个文件夹可以移动文件:PHARMA,MEDICAL和CONSUMER

    CSV文件如下所示:

    • S00285消费者
    • S00286 PHARMA
    • S00287 MEDICAL
    • ...

    我希望脚本执行的操作是在变量c中查找月/年组合,并获取与该月/年对应的所有文件,并根据CSV文件中的分配将它们移动到三个文件夹。 / p>

    可以使用标准Windows脚本完成吗?对不起,伙计们,我是新手,你可以说。我只有一些BASH脚本的基本知识。

    非常感谢您的任何建议。

    BR 马尔西奥

1 个答案:

答案 0 :(得分:0)

使用PowerShell

可以很容易地实现这一点
$FolderRoot = "E:\Target\Directory"

Set-Location $FolderRoot

# 1. Have user input month/year string
do{
    $MMYY = $(Read-Host 'Please enter MMYY').Trim()
} until ($MMYY -match '\d{4}')

# 2. Create directory
mkdir $MMYY

# ?. Gather input files for that year
$Files = Get-ChildItem -Filter S*.txt |Where-Object {$_.BaseName -match "S\d{7}-\d{2}$MMYY-\d{4}"}

# ?. load CSV file into hash table to easily look up supplier numbers
$SupplierLookupTable = @{}

# Assuming the csv has headers: Supplier,Industry
Import-Csv -Path E:\path\to\suppliers.csv |ForEach-Object {
    $SupplierLookupTable[$_.Supplier] = $_.Industry
}

foreach($File in $Files)
{
    # Grab the S and first 5 digits from the file name
    $Supplier = $File.BaseName.Substring(0,6)
    # 3. Look up the industry
    $Industry = $SupplierLookupTable[$Supplier]
    $Destination = Join-Path $MMYY $Industry
    # Create folder if it doesn't already exist
    if(-not (Test-Path $Destination))
    {
        mkdir $Destination
    }
    # 4. Move the file
    Move-Item $File.Fullname -Destination $Destination
}