根据文件名

时间:2016-01-12 19:41:12

标签: powershell desktop-shortcut

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

文件全部以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

很抱歉,如果这是重复的,我找不到关于此特定问题的帖子。

3 个答案:

答案 0 :(得分:2)

以下是如何为目录中的所有文件创建.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()
}

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

答案 1 :(得分:0)

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()
}

答案 2 :(得分:0)

基于@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()

这是一种魅力。谢谢大家的帮助。