我需要获得目标'在另一个服务器的快捷方式链接内。
但是......当我使用-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
它正在内部'链接并尝试在另一台服务器上查找快捷方式。
答案 0 :(得分:2)
我无法重现。可能找到了所有目标。
控制台中$output
- 行显示的结果应该显示应有的一切。如果没有,请用实际输出更新问题,即所需的输出。
我在这里看到的唯一错误是您尝试使用输出(文本)重定向保存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"
更新如果您想要进行递归搜索,可以尝试这样的方法。请注意,“第二级”快捷方式(ex \\server\share\shortcutb.nk
的目标可能有c:\temp
作为目标,这意味着您将获得本地路径,而不是远程计算机的UNC(请参阅{ {1}}在下面的示例输出中。)
警告:这很容易导致无限循环(循环引用)或长时间搜索(因为递归搜索)。
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"
如果你想只获得最深层次,你应该为每个对象添加一个“级别”计数器,每个递归调用增加,然后只保留最高级别等。根据你的需要,它可能会变得复杂,所以需要一个单独的详细问题。
答案 1 :(得分:0)
我找到了一个可以在命令提示符下工作的命令,但似乎从未使用过powershell:
DIR / AL / S F:\ Connect
运行需要一段时间......但确实如此。
另外,我发现一个程序在2秒内完成: http://sumtips.com/2012/10/find-symbolic-links-ntfs-junction-points-windows.html
我试图找到符号链接' ......我在说明目标。