Advertisement
usamimi2323

多重フォルダ解消(子フォルダまで).vbs

Nov 14th, 2023
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VBScript 2.49 KB | Source Code | 0 0
  1. Option Explicit
  2. ' 多重フォルダ解消(子フォルダまで)
  3. '
  4. ' 最上位の子フォルダから、フォルダ内がフォルダ一つでなくなるまで、階層を繰り上げる
  5. '
  6.  
  7. Dim fso, arg_dir, root_dir, d, topfolder
  8. If WScript.Arguments.Count = 0 Then
  9.     WScript.Echo("usage: this.vbs <フォルダ>")
  10.    
  11.     WScript.Quit()
  12. End If
  13.  
  14. Set fso = CreateObject("Scripting.FileSystemObject")
  15.  
  16. arg_dir = WScript.Arguments.Unnamed(0)
  17. If (fso.FolderExists(arg_dir) <> false) Then
  18.     If ( IsDriveLetter(arg_dir) ) Then
  19.         WScript.Echo("ドライブ名は指定できません: """ & arg_dir & """")
  20.     Else
  21.         Set root_dir = fso.GetFolder(arg_dir)
  22.         For Each d in root_dir.SubFolders
  23.             topfolder = GetTopFolder(d.Path)
  24.             If ( 0 <> StrComp(d.Path, topfolder, vbTextCompare) ) Then
  25.                 Dim tmp, f, deldir
  26.                 Dim post_dir
  27.                 Set post_dir = Nothing
  28.                
  29.                 Set f  = fso.GetFolder(topfolder)
  30.                 For Each tmp In d.SubFolders
  31.                     Set deldir = tmp
  32.                 Next
  33.                
  34.                 For Each tmp in f.SubFolders
  35.                     If (fso.FolderExists( d.Path & "\" & tmp.Name)) Then
  36.                         msgbox "trace1:" & d.Path & "     \     " & tmp.Name
  37.                         tmp.Name = "_" & tmp.Name
  38.                         Dim tmp_path
  39.                         tmp_path = d.Path & "\" & tmp.Name
  40.                         fso.MoveFolder tmp.path, d.Path & "\"
  41.                         Set post_dir = fso.GetFolder(tmp_path)
  42.                     Else
  43.                         fso.MoveFolder tmp.path, d.Path & "\"
  44.                     End If
  45.                 Next
  46.                 For Each tmp in f.Files
  47.                     fso.MoveFile tmp.path, d.Path & "\"
  48.                 Next
  49.                 If fso.FolderExists(deldir.Path) Then
  50.                     fso.DeleteFolder deldir.Path, true
  51.                 End If
  52.                 If Not (post_dir Is Nothing) Then
  53.                     post_dir.Name = Mid(post_dir.Name, 2)
  54.                 End If
  55.  
  56.                 Set deldir = Nothing
  57.                 Set f = Nothing
  58.                 Set tmp = Nothing
  59.                 Set post_dir = Nothing
  60.                 Set root_dir = Nothing
  61.             End If
  62.         Next
  63.     End If
  64. End If
  65. Set fso = Nothing
  66.  
  67.  
  68. Function IsAlpha(c)
  69.     Dim x
  70.     x = Asc(c)
  71.     IsAlpha = CBool( (65<=x And x<=90) Or (97<=x And x<=122) )
  72. End Function
  73.  
  74. Function IsDriveLetter(p)
  75.     If ( ((3=Len(p)) And (":\"=Right(p,2)) And IsAlpha(Left(p,1))) _
  76.             Or ((2=Len(p)) And (":"=Right(p,1)) And IsAlpha(Left(p,1))) ) Then
  77.         IsDriveLetter = True
  78.     Else
  79.         IsDriveLetter = False
  80.     End If
  81. End Function
  82.  
  83. Function GetTopFolder(d)
  84.     Dim tmp, f, dirs
  85.     Set f = fso.GetFolder(d)
  86.     Set dirs = f.SubFolders
  87.     If (f.Files.Count = 0 And dirs.Count = 1) Then
  88.         For Each tmp In dirs
  89.             GetTopFolder = GetTopFolder(tmp.Path)
  90.         Next
  91.     Else
  92.         GetTopFolder = d
  93.     End If
  94.     Set dirs  = Nothing
  95.     Set f = Nothing
  96. End Function
  97.  
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement