我正在寻找的可能是此解决方案的变体:Windows batch file to sort files into separate directories based on types specified in a csv
我的情况:服务器中的批处理过程会创建如下所示的文件:S0028513-010716-0932.txt。 S代表摘要,前五位数代表供应商,最后两位代表配送中心的连字符。连字符后面有日期,第二个连字符后面是时间戳。
我需要做的是:
第3点和第4点显然是遗漏的。一个实际的例子:有三个文件夹可以移动文件:PHARMA,MEDICAL和CONSUMER
CSV文件如下所示:
我希望脚本执行的操作是在变量c中查找月/年组合,并获取与该月/年对应的所有文件,并根据CSV文件中的分配将它们移动到三个文件夹。 / p>
可以使用标准Windows脚本完成吗?对不起,伙计们,我是新手,你可以说。我只有一些BASH脚本的基本知识。
非常感谢您的任何建议。
BR 马尔西奥
答案 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
}