Powershell/WScript Создать ярлык, если он не существует

Мне интересно, может ли кто-нибудь мне помочь? Я вырезал несколько скриптов powershell, которые нашел в Интернете, которые создают ярлыки из $source в $destination. Тем не менее, кажется, что он перезаписывается каждый раз, и я хочу, чтобы он создавал .lnk только для нового.

Исходный источник скрипта находится здесь. и это мой текущий нерабочий скрипт. Я добавил следующее, но, похоже, это не работает. Я думаю, мне нужно как-то заставить его проверить $destination, а затем продолжить, если $file.lnk не существует

If ($status -eq $false) {($WshShell.fso.FileExists("$Destination") + "*.lnk")

Полный сценарий:

    function Create-ShortcutForEachFile {

    Param(
        [ValidateNotNullOrEmpty()][string]$Source,
        [ValidateNotNullOrEmpty()][string]$Destination,
        [switch]$Recurse
    )

    # set recurse if present
    if ($Recurse.IsPresent) { $splat = @{ Recurse = $true } }

    # Getting all the source files and source folder
    $gci = gci $Source @splat
    $Files = $gci | ? { !$_.PSisContainer }
    $Folders = $gci | ? { $_.PsisContainer }

    # Creating all the folders
    if (!(Test-Path $Destination)) { mkdir $Destination -ea SilentlyContinue > $null }
    $Folders | % {
        $Target = $_.FullName -replace [regex]::escape($Source), $Destination
        mkdir $Target -ea SilentlyContinue > $null
    }

    # Creating Wscript object
    $WshShell = New-Object -comObject WScript.Shell

    # Creating all the Links
    If ($status -eq $false) {($WshShell.fso.FileExists("$Destination") + "*.lnk")

      $Files | % {
          $InkName = "{0}.lnk" -f $_.sBaseName
          $Target = ($_.DirectoryName -replace [regex]::escape($Source), $Destination) + "\" + $InkName
          $Shortcut = $WshShell.CreateShortcut($Target)
          $Shortcut.TargetPath = $_.FullName
          $Shortcut.Save()
          }
        }
}
Create-ShortcutForEachFile -Source \\myserver.domain.local\Folder1\Folder2\Test -Destination \\myserver2.domain.local\Folder1\Folder2\Test -Recurse

Надеюсь, кто-нибудь может мне помочь, извиняюсь за то, что я новичок в powershell/scripting.


person Martin Adams    schedule 06.10.2020    source источник
comment
Источник и место назначения одинаковы... неудивительно, что они перезаписываются. Кстати, как вы придумали $status? он никогда не определяется в сценарии   -  person Theo    schedule 06.10.2020
comment
Привет, Тео, спасибо за ваш ответ. Я отредактировал, так что теперь он показывает myserver и myserver2 (я изменил их по сравнению с исходным сценарием по соображениям конфиденциальности).   -  person Martin Adams    schedule 06.10.2020


Ответы (1)


Мой брат любезно переработал сценарий, чтобы он лучше соответствовал моим потребностям.

Вот:

    #################################################
<#
    CREATE-SHORTCUT - creates shortcut for all files from a source folder
    version       : 1.0
    Author        : 
    Creation Date : 
    Modified Date : 
#>

#------------------------------------------------------------[ variables ]----------------------------------------------------------

$sourceDir="D:\scripts\create-shortcut\source"
$targetDir="D:\scripts\create-shortcut\dest"

#-------------------------------------------------------------[ Script ]-----------------------------------------------------------
# get files/files from folder
$src_gci=Get-Childitem -path $sourceDir -Recurse
$src_files=$src_gci | ? { !$_.PSisContainer }
$src_folders=$src_gci | ? { $_.PSisContainer }

# create subfolders
$src_folders | Copy-Item -Destination { join-path $targetDir $_.Parent.FullName.Substring($sourceDir.Length) } -Force

# create shortcuts
$WshShell = New-Object -comObject WScript.Shell
$src_files | % {
    $lnkName="{0}.lnk" -f $_.BaseName
    $Target = ($_.DirectoryName -replace [regex]::escape($sourceDir), $targetDir) + "\" + $lnkName
    $Shortcut = $WshShell.CreateShortcut($Target)
    $Shortcut.TargetPath = $_.FullName
    $Shortcut.Save()
    # change to SourceFiles ModifiedDate #
    $src_date=$_.LastWriteTime
    Get-ChildItem $Target | % { $_.LastWriteTime = "$src_date" }
}
person Martin Adams    schedule 07.10.2020