【问题标题】:VBScript: Move files to different folders depending on string in file name (For Each loop)VBScript:根据文件名中的字符串将文件移动到不同的文件夹(对于每个循环)
【发布时间】:2021-12-01 01:13:53
【问题描述】:

原问题:

我对 VBScript 不太熟练,但需要一个有效的解决方案来节省我大量手动选择和复制文件的时间: 我有一个包含数千个光栅文件的文件夹,其中包含某个区域的每日温度值,总共涵盖了 30 年。 为了计算每月 30 或 31 个文件中的每月平均值(在地理空间数据程序中),我需要将它们复制到单独的文件夹中,例如。 G。将 2000 年 1 月 1 日至 31 日的文件(命名为 tx_20000101、tx_20000102 等)放入名为 T_01_Jan_2000 的文件夹中,并相应地保存所有其他月份和年份。

所以我需要一个脚本,在所有文件名中搜索不同的文本字符串 (YYYYMM),并将匹配的文件移动到给定的文件夹中(对于每个搜索字符串,一个单独的文件夹)。

如何用 VBScript 来实现呢? 在论坛中找到的例子(主要是这个:https://stackoverflow.com/a/29001051/6093207),我到目前为止:

Option Explicit
Sub Dateien_verschieben()

Dim i
Dim FSO : Set fso = CreateObject("Scripting.FileSystemObject")
Dim Quelle : Set Quelle = FSO.GetFolder("C:\Users\…\Temperature")

Dim Ziel1 : Set Ziel1 = FSO.GetFolder("C:\Users\…\Temperature\T_01_Jan\T_01_Jan_2000")
Dim Ziel2 : Set Ziel2 = FSO.GetFolder("C:\Users\…\Temperature\T_02_Feb\T_02_Feb_2000")
…
Dim Ziel12 : Set Ziel12 = FSO.GetFolder("C:\Users\…\Temperature\T_12_Dez\T_12_Dez_2000")

Dim Str1, Str2, Str3, Str4, Str5, Str6, Str7, Str8, Str9, Str10, Str11, Str12

Str1 = "200001"
Str2 = "200002"
…
Str12 = "200012"
i = 0

For Each file in Quelle.files
x = fso.getbasename(file)
If instr(lcase(x), Str1) Then
    i = i+1
       If fso.fileexists(Ziel1 & "\" & file.name) Then
        fso.deletefile Ziel1 & "\" & file.name, True
       End If
    fso.movefile Quelle & "\" & file.name, Ziel1
ElseIf instr(lcase(x), Str12) Then 'I have omitted the other ElseIf statements here for reasons of clarity
    i = i+1
        If fso.fileexists(Ziel12 & "\" & file.name) Then
        fso.deletefile Ziel12 & "\" & file.name, True
        End If
    fso.movefile Quelle & "\" & file.name, Ziel12
End If
Next

If i>0 Then
wscript.echo i&" files moved to path " & vbcrlf & Quelle
wscript.quit()
End If

wscript.echo "No matches found"

End Sub

但是,我收到了不同的错误,例如 800A0414 和 800A0046,并且没有按预期运行脚本。 欢迎任何有关更正代码或更有效的脚本编写方式的建议。

已编辑的问题:

有一个包含数千个 netCDF 文件的文件夹,其中包含某个区域的每日温度值,总共涵盖了 30 年的时间,如何将它们按月移动到单独的文件夹中? 月份文件夹应包含相应年份的子文件夹。

所以这些文件被命名为 tx_20000101.nctx_20000102.nc 等等,它们都在文件夹 Temperature 中。 现在,从一月份开始的所有文件都应该进入一个名为 T_01 的文件夹,其中包含名为 T_01_1991T_01_1992 的子文件夹,以此类推,其他月份也相应地和年。

VBScript 如何做到这一点?

【问题讨论】:

  • 您是否考虑过编写一个脚本,将数据从单个文件复制到单个 CSV 文件?然后您可以将 CSV 文件加载到 Google 表格或 Excel 等中,并轻松获得平均值。
  • 感谢您的建议,但这些文件是 netCDF 格式的地理空间栅格文件,其中包含大面积的温度值。这就是为什么在这种情况下无法使用 CSV。
  • 假设您已经有一个程序可以计算单个文件夹中所有文件的平均值。因此需要在一个月的组中复制或移动它们。我希望能把你从那种痛苦中解救出来。似乎对于已经按原样命名的文件,可以在不将它们放在单独的文件夹中的情况下完成计算。如果没有其他人回答,我稍后会回复。顺便说一句,使用 PowerShell 可能更容易做到这一点(取决于你的 PS 技能)。
  • 感谢您的提示,然后我将不得不在 PowerShell 中搜索如何执行此操作。因此,我将用于计算的 GIS 程序是 ArcGIS Pro,并且在其 ModelBuilder(脚本界面)中具有“迭代工作空间”功能。因此,如果我将文件按月和年很好地分开,我就可以轻松运行此功能。也许可以通过 ArcPy 脚本告诉 ArcGIS Pro 仅使用某些文件作为输入(通过搜索 YYYYMM## 字符串),但这也是我不熟悉的东西,必须在论坛中搜索.

标签: for-loop vbscript movefile


【解决方案1】:

解决方案(感谢@Les Ferch):

Move = True 'Set to False for Copy 
SrcDir = ".\Temperature" Set oFSO = CreateObject("Scripting.FileSystemObject") 
Set Source = oFSO.GetFolder(SrcDir) 
For Each File in Source.Files   
    FileName = Right(File,11)   
    YYYY = Mid(FileName,1,4)   
    MM = Mid(FileName,5,2)   
    MonthDir = SrcDir & "\T_" & MM & "\"   
    YearDir = MonthDir & "T_" & MM & "_" & YYYY & "\"   
    If Not oFSO.FolderExists(MonthDir) Then oFSO.CreateFolder(MonthDir)   
    If Not oFSO.FolderExists(YearDir) Then oFSO.CreateFolder(YearDir)   
    If Move Then oFSO.MoveFile(File),YearDir Else oFSO.CopyFile(File),YearDir
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多