2016-05-11 72 views
-2

我需要獲取到另一個服務器的快捷鏈接內的'目標'。 但是...... hellip;當我使用-Recurse時,它遵循鏈接,而不是簡單地獲取快捷方式目標。'鏈接'的列表'目標'

這裏是我在網上找到的代碼,這些代碼是爲編輯我的目的而編輯的。但是,進入鏈接,並嘗試到另一臺服務器中找到快捷方式:

#Created By Scott 

$varLogFile = "E:\Server\GetBriefsTargets.log" 
$varCSVFile = "E:\Server\GetBriefsTargets.csv" 

function Get-StartMenuShortcuts 
{ 
    $Shortcuts = Get-ChildItem -Recurse "F:\Connect" -Include *.lnk 
    #$Shortcuts = Get-ChildItem -Recurse "D:\Scripts\scott_testing" -Include *.lnk 
    $Shell = New-Object -ComObject WScript.Shell 
    foreach ($Shortcut in $Shortcuts) 
    { 
     $Properties = @{ 
      ShortcutName = $Shortcut.Name; 
      ShortcutFull = $Shortcut.FullName; 
      ShortcutPath = $shortcut.DirectoryName 
      Target = $Shell.CreateShortcut($Shortcut).targetpath 
     } 
     New-Object PSObject -Property $Properties 
    } 

    [Runtime.InteropServices.Marshal]::ReleaseComObject($Shell) | Out-Null 
} 

$Output = Get-StartMenuShortcuts 
$Output 
ECHO "$Output" >> $varLogFile 
ECHO "$Output" >> $varCSVFile 

可能有人請提供什麼我可以改變,因此,它仍然認爲這一切的一切文件夾的快捷方式鏈接的建議?並停止進入這些鏈接?

即:

F:\連接\客戶端A \ shortcut.lnk
F:\連接\ CLIENTB \ shortcut.lnk

有大約100的客戶,我必須讓他們鏈接,我不想手動(每個月)。

這裏是我得到在試圖運行此腳本錯誤:

Get-ChildItem : The specified path, file name, or both are too long. The fully 
qualified file name must be less than 260 characters, and the directory name must 
be less than 248 characters. 
At D:\Scripts\scott_testing\GetShortcutTarget_edit1.ps1:8 char:18 
+  $Shortcuts = Get-ChildItem -Recurse "F:\Connect" -Include *.lnk 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ReadError: (F:\Connect\CLIENTA\briefs\FILENAME:String) [Get-ChildItem], PathTooLongException 
    + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

這是要鏈接的「內部」,並試圖找到另一臺服務器上的快捷方式。

+1

你確定它不只是找到一個本地目錄裏面的「連接」,有一個248 +字符的路徑。當我運行它時,'get-childitem'不會進入遞歸搜索的鏈接。 –

+0

'Get-ChildItem -Recurse'不遵循快捷方式。你在說什麼? –

+0

該腳本轉到:F:\ Connect \ CLIENTA \ briefs.lnk < - 然後它進入briefs.lnk的路徑到\\ IPADDRESS \ CLIENTDATA \ CLIENTA \ FOLDERA \ filenamehere.file文件並嘗試查找那裏的快捷鍵(據我所知) –

回答

0

我發現了一個命令,將在命令提示符下工作,但似乎從來沒有使用PowerShell的工作:

DIR/AL/SF:\連接

過了一段時間運行...但它沒有。

而且,我發現了一個程序,這樣做是在如2秒時: http://sumtips.com/2012/10/find-symbolic-links-ntfs-junction-points-windows.html

我試圖找到「符號鏈接」 ......這讓我陳述的目標。

+0

'dir'是CMD內置命令。要在PowerShell中使用它,你需要在CMD中運行它('&cmd/c dir/al/s F:Connect')。另外,快捷方式(.lnk文件)不是連接/符號鏈接,反之亦然,那麼您實際上在那裏有什麼? –

+0

我有一個符號鏈接。我認爲它就像一條捷徑。我想我錯了 –

2

我無法複製。所有的目標都可能找到。

在控制檯中顯示的結果由$output -line應該顯示所有應該顯示的內容。如果不是,請用實際輸出和所需輸出更新問題。

我在這裏看到的唯一錯誤是您嘗試使用輸出(文本)重定向保存CSV對象。這隻會返回不是CSV的對象的字符串表示形式。在這種情況下,當我嘗試它時,它不會輸出任何內容,因爲$output是一個對象數組,當調用ToString()方法時它不返回任何內容。

替換:

ECHO "$Output" >> $varCSVFile 

有了:

$Output | Select ShortcutName, ShortcutFull, ShortcutPath, Target | Export-CSV -Path $varCSVFile -NoTypeInformation 

輸出示例:

"ShortcutName","ShortcutFull","ShortcutPath","Target" 
"WinSystem.lnk","C:\Users\frode\Desktop\test\WinSystem.lnk","C:\Users\frode\Desktop\test","C:\Windows\System" 
"Lol.lnk","C:\Users\frode\Desktop\Lol.lnk","C:\Users\frode\Desktop","C:\Windows\System32\notepad.exe" 
"Windows.lnk","C:\Users\frode\Desktop\Windows.lnk","C:\Users\frode\Desktop","\\localhost\c$\Windows" 
"WinSystem32.lnk","C:\Users\frode\Desktop\WinSystem32.lnk","C:\Users\frode\Desktop","\\127.0.0.1\c$\Windows\System32" 

UPDATE如果你想要做一個遞歸搜索,你可以嘗試這樣的事情。請注意,「第二級」快捷方式的目標(例如,\\server\share\shortcutb.nk可能具有c:\temp作爲目標,這意味着您將獲得本地路徑,而不是遠程計算機的UNC(請參閱下面的示例輸出中的MyEnd.lnk)。

警告:這很容易導致無限循環(循環引用)或長時間運行搜索(因爲遞歸搜索)。

function Get-StartMenuShortcuts ($path) { 
    $Shortcuts = Get-ChildItem -Path $path -Recurse -Include *.lnk 
    #$Shortcuts = Get-ChildItem -Recurse "D:\Scripts\scott_testing" -Include *.lnk 
    $Shell = New-Object -ComObject WScript.Shell 
    foreach ($Shortcut in $Shortcuts) 
    { 
     $Properties = @{ 
      ShortcutName = $Shortcut.Name; 
      ShortcutFull = $Shortcut.FullName; 
      ShortcutPath = $shortcut.DirectoryName 
      Target = $Shell.CreateShortcut($Shortcut).targetpath 
     } 

     Get-StartMenuShortcuts -path $Properties.Target 

     New-Object PSObject -Property $Properties 
    } 

[Runtime.InteropServices.Marshal]::ReleaseComObject($Shell) | Out-Null 

} 

$output = Get-StartMenuShortcuts -path "F:\Connect" 

輸出示例:

"ShortcutName","ShortcutFull","ShortcutPath","Target" 
"WinSystem.lnk","C:\Users\frode\desktop\test\WinSystem.lnk","C:\Users\frode\desktop\test","C:\Windows\System" 
"MyEnd.lnk","\\127.0.0.1\c$\EFI\MyEnd.lnk","\\127.0.0.1\c$\EFI","C:\Users\frode\Desktop\TheEnd" 
"EFI.lnk","C:\Users\frode\desktop\EFI.lnk","C:\Users\frode\desktop","\\127.0.0.1\c$\EFI" 
"Lol.lnk","C:\Users\frode\desktop\Lol.lnk","C:\Users\frode\desktop","C:\Windows\System32\notepad.exe" 

如果你想只得到最深的層次,你應該添加一個「級別」 -counter以增加每個遞歸調用,然後只保留每個對象最高的等等。根據您的需要它可能會變得複雜,因此需要一個單獨的詳細問題。

+0

我重新閱讀了我的初始文章,並且已將其重新撰寫。我試圖獲得快捷方式的目標(快捷方式是指向其他服務器的鏈接) 我嘗試了您的輸出,我甚至無法獲得那麼多。 –

+0

它仍然不清楚,我仍然需要輸出和所需的輸出。你不能有快捷方式定位到一個快捷方式,你的解決方案(+ export-csv部分)返回上面的輸出。它沒有在'C:\ Windows'內尋找'* .lnk'文件,如果這就是我說的 –

+0

我需要鏈接內的目標。即:F:/folder/clienta/briefs.lnk。這個鏈接的內部是一個帶有ip地址和文件夾的「目標」。我需要在文件中記錄這些信息。我需要輸出說:\\ IPADDRESS \ clientdata \ clientname。 - 因爲這是「目標」在鏈接屬性的快捷方式標籤中顯示的內容。現在,F:/ connect /裏面大約有100個文件夾,它需要經過 –