根据文件名在不同文件夹中创建多个快捷方式

Create multiple shortcuts in different folders based on file name

基本上,我们有很多 .mht 文件(使用 MicroStrategy 定期生成),我们需要在不同的文件夹中提供这些文件以应用安全性。为了避免 space 消耗,我们考虑在多个文件夹上创建快捷方式。

所有文件均以 4 位数字和下划线组成的分组开头(例如 0001_0041、0001_0043 等)。

这是我现在拥有的:

Get-Childitem -Path "C:\Users\Max\Google Drive\Portal\Mermaid" -Recurse -Include "0002*.mht"
Foreach-Object {
  $ruta = Get-Childitem -Path "C:\Users\Max\Google Drive\Portal\Mermaid" -Recurse -Include "0002*.mht"
  $nombre = Get-Childitem -Name "C:\Users\Max\Google Drive\Portal\Mermaid" -Recurse -Include "0002*.mht"
  $ncorto = $nombre | ForEach-Object {$nombre.Substring(0,9)}
  $container = "C:\Users\Max\Google Drive\Portal\Mermaid\MHT_Shortcuts$ncorto"
  if (!(Test-Path $container)) {
    New-Item -ItemType directory -Path $container | Out-Null
  }
  $TargetFile = $ruta
  $ShortcutFile = "$container$nombre.lnk"
  $WScriptShell = New-Object -ComObject WScript.Shell
  $Shortcut = $WScriptShell.CreateShortcut($ShortcutFile)
  $Shortcut.TargetPath = $TargetFile
  $Shortcut.Save()
}

只要只有一个以 0002 开头的文件,这就有效。但是,他们会保留具有相同名称和时间戳的历史文件。

如果有多个文件以 0002 开头(因为它们保留了这些文件的历史版本),我得到错误:

Exception setting "TargetPath": "The parameter is incorrect. (Exception from
HRESULT: 0x80070057 (E_INVALIDARG))"
En C:\Users\Max\Desktop\MK_LNK_V01.ps1: 25 Character: 7
+                         $Shortcut.TargetPath = $TargetFile
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValueTI

抱歉,如果这是重复的,我找不到关于这个特定问题的 post。

以下是如何为目录中的所有文件创建 .lnk 文件的简短示例:

$shortcutPath = "C:\TextFiles"
$wshShell = New-Object -ComObject "WScript.Shell"
Get-ChildItem (Join-Path $shortcutPath "*.txt") | ForEach-Object {
  $lnkFilename = Join-Path $shortcutPath ("{0}.lnk" -f [IO.Path]::GetFilenameWithoutExtension($_.FullName))
  $shortcut = $wshShell.CreateShortcut($lnkFilename)
  $shortcut.TargetPath = $_.FullName
  $shortcut.Save()
}

当然,您需要修改此示例以满足您的需要。

WshShortcut 对象的 TargetPath 属性 需要单个路径,而不是路径列表。另外,我建议将不需要重复执行的所有内容移到循环之外。

$app = New-Object -ComObject 'WScript.Shell'

$container = 'C:\shortcut\folder'
$path = 'C:\Users\Max\Google Drive\Portal\Mermaid'

if (!(Test-Path $container)) {
  New-Item -Type Directory -Path $container | Out-Null
}

Get-Childitem -Path $path -Recurse -Include "0002*.mht" | Foreach-Object {
  $ShortcutFile = "$container$nombre.lnk" -f $_.BaseName
  $Shortcut = $app.CreateShortcut($ShortcutFile)
  $Shortcut.TargetPath = $_.FullName
  $Shortcut.Save()
}

根据@Bill_Stewart提供的脚本,我添加了一些行来首先删除链接,然后根据文件名的前9个字符创建包含文件夹并在其中创建快捷方式:

$shortcutPath = "C:\Origin"
$contenedor = "C:Destination"
$wshShell = New-Object -ComObject "WScript.Shell"
Get-ChildItem -Path $contenedor -Include *.lnk -File -Recurse | foreach { $_.Delete()}
Get-ChildItem (Join-Path $shortcutPath "*.mht") | ForEach-Object {
  $nombre = $_.BaseName
  $ncorto = $nombre.SubString(0, 9)
  $destino = Join-Path $contenedor $ncorto
  if (!(test-Path $destino)) {
                        New-Item -ItemType directory -Path $destino | Out-Null}     
  $lnkFilename = Join-Path $destino("{0}.lnk" -f [IO.Path]::GetFilenameWithoutExtension($_.FullName))
  $shortcut = $wshShell.CreateShortcut($lnkFilename)
  $shortcut.TargetPath = $_.FullName
  $shortcut.Save()

这很有魅力。感谢大家的帮助。