2016-05-19 5 views
0

ディレクトリを介してショートカットを検索し、ショートカットのパスを取得し、これらのパスをコレクションに追加して後で使用しようとしています。ただし、その後のDir()の呼び出しは、同じファイルを繰り返し返します。私は、以下で定義されている関数Getlnkpathを呼び出すことによって問題が発生するのを分離しました。この関数は自分自身を書いていないので、この動作を引き起こしているものが何であるか正確にはわかりません。Dir()へのその後の呼び出しで同じファイルが返される

tempPath = Dir(startPath & "*.lnk") 
Do Until tempPath = vbNullString 
    myCollection.Add Getlnkpath(startPath & tempPath) & "\" 
    tempPath = Dir() 
Loop 

Function Getlnkpath(ByVal Lnk As String) 
    On Error Resume Next 
    With CreateObject("Wscript.Shell").CreateShortcut(Lnk) 
     Getlnkpath = .TargetPath 
     .Close 
    End With 
End Function 
+0

ショートカットをコレクションに「翻訳」せずに追加してから、コレクションをループして適切なパスに「翻訳」することもできます。しかし、私はまだこの現象の原因を理解したいと思うでしょう。 – johankr

+0

あなたはスタートパスのドライブ位置を共有してください –

+0

これはネットワークドライブを介して検索しているより大きなプログラムの一部なので、開始パスはさまざまですが、 "J:\ Folder \ Folder \ Folder \"タイプです – johankr

答えて

1

それは

  • 最初に、より安全かもしれません。そして、すべてのリンクパスに

  • を収集:最初のコレクションは安定留まるように

すべてのリンク先のパスを収集するものは何でも(リンクやフォルダを削除しない限り...)

しかも私は一つだけWscript.Shellオブジェクトを初期化し、それをそのCreateShortcut()へのすべてのコールを処理し、代わりに

は最終的に私自身がDir()機能の代わりにFileSystemObjectの使用に向けて漂流していた各リンクのための一つのオブジェクトをインスタンス化のためにお勧めしたいです、問題のために私は時々後者と会う。

代わり
Option Explicit 

Sub main() 
    Dim startPath As String 
    Dim myLinkTargetPaths As New Collection, myLinkFilePaths As Collection 

    startPath = "C:\myPath\" 

    Set myLinkFilePaths = GetLinksPaths(startPath) 'first get the collection of all links path 
    Set myLinkTargetPaths = GetLinksTarget(myLinkFilePaths) ' then get the collection of all links TargetPaths 

End Sub 


Function GetLinksTarget(myLinkFilePaths As Collection) As Collection 
    Dim myColl As New Collection 
    Dim element As Variant 

    With CreateObject("Wscript.Shell") 
     For Each element In myLinkFilePaths 
      myColl.Add .CreateShortcut(element).TargetPath & "\" 
     Next element 
    End With 
    Set GetLinksTarget = myColl 
End Function  


Function GetLinksPaths(startPath As String) As Collection 

    Dim objFso As FileSystemObject '<~~ requires adding reference to `Microsoft Scripting Runtime` library 
    Dim objFile As File 
    Dim objFolder As Folder 
    Dim myColl As New Collection 

    Set objFso = CreateObject("Scripting.FileSystemObject") 
    Set objFolder = objFso.GetFolder(startPath) 

    For Each objFile In objFolder.Files 
     If objFso.GetExtensionName(objFile.Path) = "lnk" Then myColl.Add objFile.Path 
    Next 
    Set GetLinksPaths = myColl 

End Function 

、あなたはDir()機能と上に行きたいはずですその後、同じようにGetLinksPaths()機能を変更します。私は、次のコードを提案する上で何のためMicrosoft Scripting Runtimeライブラリ

への参照を追加するだけ犠牲にして、この以下:

Function GetLinksPaths(startPath As String) As Collection 
    Dim tempPath As String 
    Dim myColl As New Collection 

    tempPath = Dir(startPath & "*.lnk") 
    Do Until tempPath = vbNullString 
     myColl.Add startPath & tempPath 
     tempPath = Dir() 
    Loop 
    Set GetLinksPaths = myColl 

End Function 

をBTW:CreateObject("Wscript.Shell").CreateShortcut(Lnk)メソッド戻り、オブジェクト(のいずれかWshShortcut又はWshURLShortcut 1)SUありませんGetlnkpath()の機能と同じようにClose()メソッドを実行してください。したがって、それを削除して、必要なものを削除してください。

+0

私はdir()で持っていた問題の解決を待つ時間がなかったので、昨日同様の実装、つまり最初にリンクを収集してパスを収集してしまったので、解答としてマークします。 – johankr

0

あなたの機能を備えた新しい.lnkファイルを作成しているし、あなたのdirコマンドは、新しく作成されたリンク(つまり、古いものを上書きしている)次のことを発見したように見えます。お使いの機能にCreateShortcutの代わりにGetShortcutを使用してください。

+0

あなたのソリューションをテストしましたか? – user3598756

関連する問題