2

おはようございます。スクリプトの実行時に、ユーザーからファイル パスとファイル名 (ワイルドカードが含まれる場合があります) を取得する VBscript を作成しようとしています。スクリプトは、指定されたディレクトリに指定されたファイル名と一致するファイルがあるかどうかを確認し、最後に変更された日付を調べて、特定の時間枠 (つまり、午前 6 時から 5 分以内) 内に作成/変更されたかどうかを確認します。次に、そのファイルを zip ファイルにコピーします。

これまでのところ、引数を機能させることができました。現在の時刻を取得し、フォルダー内のファイルを見て、ハードコードされたファイル名をフォルダー内のファイル名と一致させるようにセットアップしました。これは私がこれまでに持っているものです。

currentTime = Now()

filePath = Wscript.Arguments.Item(0)
fileName = Wscript.Arguments.Item(1)

Set fileSystem = CreateObject("Scripting.FileSystemObject")
Set directory = fileSystem.GetFolder(filePath)

For each file in directory.Files
    If file.Name = fileName Then
        Wscript.echo file.Name & " " & file.DateLastModified
    end if
Next

私は VBscript の初心者であり、その方法を学ぶことを楽しみにしています!

Cap3

4

3 に答える 3

6

WMIを使用する場合、ワイルドカードをサポートします。

Dim strPath

strFile = "*.*"
If WScript.Arguments.Count > 1 Then
    strPath = WScript.Arguments.Item(0)
    strFile = WScript.Arguments.Item(1)
Elseif WScript.Arguments.Count = 1 Then
    strPath = WScript.Arguments.Item(0)
Else

End If

Set objFso = CreateObject("Scripting.FileSystemObject")
If Not objFso.FolderExists(strPath) Then
    WScript.Echo "Folder path does not exist."
    WScript.Quit
Else
    'Remove any trailing slash
    If Right(strPath, 1) = "\" Then
        strPath = Left(strPath, Len(strPath) - 1)
    End If
End If
Set objFso = Nothing

If Not IsNull(strPath) And strPath <> "" Then
    strQuery = strPath & "\" & strFile
Else
    strQuery = strFile
End If

strQuery = Replace(strQuery, "*", "%")
strQuery = Replace(strQuery, "?", "_")

strQuery = Replace(strQuery, "\", "\\")

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}\\" & strComputer & "\root\cimv2")

Set colFiles = objWMIService.ExecQuery _
    ("Select * From CIM_DataFile Where FileName Like '" & strQuery & "'")

For Each objFile in colFiles
    WScript.Echo "Access mask: " & objFile.AccessMask
    WScript.Echo "Archive: " & objFile.Archive
    WScript.Echo "Compressed: " & objFile.Compressed
    WScript.Echo "Compression method: " & objFile.CompressionMethod
    WScript.Echo "Creation date: " & objFile.CreationDate
    WScript.Echo "Computer system name: " & objFile.CSName
    WScript.Echo "Drive: " & objFile.Drive
    WScript.Echo "8.3 file name: " & objFile.EightDotThreeFileName
    WScript.Echo "Encrypted: " & objFile.Encrypted
    WScript.Echo "Encryption method: " & objFile.EncryptionMethod
    WScript.Echo "Extension: " & objFile.Extension
    WScript.Echo "File name: " & objFile.FileName
    WScript.Echo "File size: " & objFile.FileSize
    WScript.Echo "File type: " & objFile.FileType
    WScript.Echo "File system name: " & objFile.FSName
    WScript.Echo "Hidden: " & objFile.Hidden
    WScript.Echo "Last accessed: " & objFile.LastAccessed
    WScript.Echo "Last modified: " & objFile.LastModified
    WScript.Echo "Manufacturer: " & objFile.Manufacturer
    WScript.Echo "Name: " & objFile.Name
    WScript.Echo "Path: " & objFile.Path
    WScript.Echo "Readable: " & objFile.Readable
    WScript.Echo "System: " & objFile.System
    WScript.Echo "Version: " & objFile.Version
    WScript.Echo "Writeable: " & objFile.Writeable
Next

編集..........

でWMIイベントスクリプトを使用して__InstanceCreationEvent、特定のフォルダーでの新しいファイルの作成を監視できます。次のようになります。

strSource = "C:\\somefilepath\\withdoubleshlashes"
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & strComputer & "rootcimv2")

Set colEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' AND " _
        & "TargetInstance.GroupComponent= " _
        & "'Win32_Directory.Name=""" & strSource & """'")

Do While True
    Set objEvent = colEvents.NextEvent()
    copyFile(objEvent.TargetInstance.PartComponent)
Loop

完全な説明については、私のブログで新しく作成されたファイルの監視とアーカイブを読むことができます。

于 2012-10-25T04:34:24.367 に答える
0

あなたの例では、これを行う最も簡単な方法は inStr (In String) 関数を使用することです。ワイルド カード タスクの 99% で機能することがわかりました。したがって、あなたの例では、次を使用する代わりに:

If file.Name = fileName Then

使用する:

If inStr(file.Name, filename) Then

これは実際にはワイルドカード (*) を許可しません (引数にアスタリスクを含む) 一致が見つからないため、文字列からワイルドカードを取り除き、何も置き換えない (または単にユーザーをトレーニングする) 必要があります。ワイルドカードを使用しない):

Replace(filename,"*", "")

ただし、inStr 関数は部分一致または完全一致を許可するため、ほとんどのワイルドカード タスクに適しています。したがって、ファイル名が pic.jpg の場合、ユーザーが次を検索するかどうか:

pic または jpg または p または c または pi など。

一致を返します。ただし、instr 関数は、一致が文字列に現れる場所に数値を返すことに注意してください。したがって、一致が作成されない場合、結果は 0 になります。動作NOTしない例に遭遇したか、この場合は次のような完全な構文を使用する必要がありました。

If inStr(file.Name, filename)<>0 Then
于 2015-04-18T13:21:27.757 に答える