【问题标题】:List 'target' of 'links'列出“链接”的“目标”
【发布时间】:2016-05-11 18:55:31
【问题描述】:

我需要在指向另一台服务器的快捷链接中获取“目标”。 但是……当我使用-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:\Connect\CLIENTA\shortcut.lnk
F:\Connect\CLIENTB\shortcut.lnk
等等

我必须获取大约 100 个客户的链接,而我不想手动(每个月)进行。

这是我在尝试运行此脚本时遇到的错误:

Get-ChildItem : 指定的路径、文件名或两者都太长。完全
限定文件名必须少于 260 个字符,并且目录名必须
少于 248 个字符。
在 D:\Scripts\scott_testing\GetShortcutTarget_edit1.ps1:8 char:18
+ $Shortcuts = Get-ChildItem -Recurse "F:\Connect" -包括 *.lnk
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~
    + CategoryInfo : ReadError: (F:\Connect\CLIENTA\briefs\FILENAME:String) [Get-ChildItem], PathTooLongException
    + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

它正在链接“内部”并试图在另一台服务器上查找快捷方式。

【问题讨论】:

  • 你确定它不仅仅是在“connect”中找到一个包含 248 个以上字符的路径的本地目录。 get-childitem 在我运行时不会自行进入递归搜索的链接。
  • Get-ChildItem -Recurse 不遵循快捷方式。你在说什么?
  • 脚本转到:F:\Connect\CLIENTA\briefs.lnk
  • 您发布的代码不可能做到这一点。 briefs.lnk 真的是捷径吗?快捷方式的所有父文件夹都是常规目录(没有符号链接/连接)吗?
  • 是的,就像我列出的那样:F:\Connect\CLIENTA\briefs.lnk

标签: powershell shortcut


【解决方案1】:

我无法复制。所有的目标都可能找到了。

$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"

更新如果你想让它进行递归搜索,你可以尝试这样的事情。请注意,“二级”快捷方式的目标(例如 \\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"

如果您只想获得最深的级别,您应该为每个递归调用增加的对象添加一个“级别”计数器,然后只保留最高级别等。根据您的需要,它可能会变得复杂,以便需要一个单独的详细问题。

【讨论】:

  • 我重新阅读了我最初的帖子并重新措辞。我正在尝试获取快捷方式的目标(快捷方式是指向其他服务器的链接)我尝试了您的输出,但我什至无法达到那么远。
  • 目前还不清楚,我仍然需要输出和所需的输出。你不能有针对快捷方式的快捷方式,你的解决方案(+export-csv 部分)为我返回了上面的输出。它没有在C:\Windows 等中查找*.lnk 文件,如果这就是你的意思
  • 我需要链接内的目标。即:F:/folder/clienta/briefs.lnk。此链接内部是一个带有 IP 地址和文件夹的“目标”。我需要在文件中记录该信息。我需要输出说: \\IPADDRESS\clientdata\clientname 。 - 因为这是链接属性中快捷方式选项卡内的“目标”显示的内容。现在,F:/connect/ 内大约有 100 个文件夹需要通过
  • 它也适用于使用 UNC 路径的链接。请参阅答案中的更新输出。我真的不明白您当前的解决方案有什么问题....您是说要递归查找链接吗?前任。 c:\shortcutA.lnk -> \\server1\share\\server1\share\shortcutB.lnk -> \\client1\c$\clientdata ?
  • 列出的所有内容都可以使用,但我最想要的是您列出的最后一个输出:\\client1\c$\clientdata(假设这是“目标”代码中快捷方式选项卡中的内容两套,或者一套都可以。
【解决方案2】:

我找到了一个可以在命令提示符下运行的命令,但似乎从未与 powershell 一起使用:

DIR /AL /SF:\Connect

运行需要一段时间......但确实如此。

另外,我发现了一个在 2 秒内完成的程序: http://sumtips.com/2012/10/find-symbolic-links-ntfs-junction-points-windows.html

我试图找到“符号链接”……我说的是目标。

【讨论】:

  • dir 是一个 CMD 内置命令。要从 PowerShell 中使用它,您需要在 CMD (& cmd /c dir /al /s F:Connect) 中运行它。此外,快捷方式(.lnk 文件)不是联结/符号链接,反之亦然,那么您实际上拥有的是什么?
  • 我有一个符号链接。我认为它就像一条捷径。我想我错了
猜你喜欢
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2011-01-01
  • 2011-08-03
  • 1970-01-01
  • 2018-08-28
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多