Altere os destinos de atalho em massa?

5

Tenho centenas de atalhos para sites em que o alvo se parece com isso:

C:\Users\Herb\AppData\Local\Google\Chrome\Application\chrome.exe www.somesite.com/foo

Acabei de atualizar para o Windows 8, e o executável do Chrome agora está armazenado em Arquivos de Programas; Então, para que esses atalhos funcionem, tenho que mudá-los para isso:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" www.somesite.com/foo

Existe alguma maneira de automatizar essa mudança? Eu sou um programador, mas não fiz muito com o script do Windows.

    
por Herb Caudill 29.10.2012 / 14:23

4 respostas

9

Recentemente, encontrei-me com um problema semelhante e decidi modificar o script dos links conforme solicitado originalmente. Talvez outra pessoa ache isso útil. Este é um script do PowerShell baseado em um link mencionado anteriormente , mas tem algumas melhorias (apenas gatilhos no nome do caminho principal, modifica o link existente em vez de excluir / criar, tem um modo de execução a seco, etc).

Não tenho muito conhecimento sobre o PowerShell, portanto, agradeço sugestões de melhoria:

$oldPrefix = "\OldServer\Archive\"
$newPrefix = "\NewServer\Archive\"

$searchPath = "Z:\"

$dryRun = $TRUE

$shell = new-object -com wscript.shell

if ( $dryRun ) {
   write-host "Executing dry run" -foregroundcolor green -backgroundcolor black
} else {
   write-host "Executing real run" -foregroundcolor red -backgroundcolor black
}

dir $searchPath -filter *.lnk -recurse | foreach {
   $lnk = $shell.createShortcut( $_.fullname )
   $oldPath= $lnk.targetPath

   $lnkRegex = "^" + [regex]::escape( $oldPrefix ) 

   if ( $oldPath -match $lnkRegex ) {
      $newPath = $oldPath -replace $lnkRegex, $newPrefix

      write-host "Found: " + $_.fullname -foregroundcolor yellow -backgroundcolor black
      write-host " Replace: " + $oldPath
      write-host " With:    " + $newPath

      if ( !$dryRun ) {
         $lnk.targetPath = $newPath
         $lnk.Save()
      }
   }
}
    
por 18.09.2013 / 18:57
3

Tornar

C:\Users\Herb\AppData\Local\Google

uma junção de diretório que aponta para

C:\Program Files (x86)\Google

usando Mklink , problema resolvido.

    
por 29.10.2012 / 14:25
3

Eu tenho administradores de rede malucos que sempre mudam o caminho UNC para meu diretório de trabalho. Usando um domínio de exemplo para ilustrar as mudanças, juro que vi pelo menos esses quatro UNCs diferentes no mesmo diretório e arquivos nos últimos 6 meses:

\contoso\Projects\rhinoexhibit\
\contoso\Design\Projects\rhinoexhibit\
\contoso.com\Design\Projects\rhinoexhibit\
\city.contoso.com\Departments\Design\Projects\rhinoexhibit\
\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\

Eu também uso arquivos .LNK que são vinculados diretamente a um arquivo na caixa Destino:

\contoso\Projects\rhinoexhibit\rhinospecifications.pdf

e arquivos .LNK vinculados a um aplicativo para abrir um arquivo com parâmetros específicos (aqui, estou usando o Foxit Reader para abrir um arquivo PDF em uma página específica) na caixa Destino:

"C:\Program Files (x86)\FOXIT READER\Foxit Reader.exe" /A page=37 "\contoso\Projects\rhinoexhibit\rhinospecifications.pdf"

Esses diretórios estão em compartilhamentos de rede corporativa e não tenho acesso para alterar o UNC para os compartilhamentos ou usar qualquer tipo de redirecionamento, portanto, uma modificação da resposta do Terrence funcionou melhor para mim. Como eu era novo no PowerShell, tive que descobrir como usá-lo também, então vou dar instruções passo a passo sobre como usar minha modificação de seu excelente script:

  1. Usando o Bloco de notas, cole o código abaixo em um novo documento de texto. Salve o documento como Edit-LNK-files.ps1 em um diretório fácil de localizar e curto para digitar (como C: \ MyPowerShells)
  2. No Bloco de Notas, edite o parâmetro $oldString (linha 4) para conter a cadeia que você deseja localizar e o parâmetro $newString (linha 7) para conter a string que você deseja para substituí-lo por. Edite o parâmetro $searchPath (linha 10) para especificar o diretório seu em que seus arquivos .LNK para editar residem. Como alternativa, você pode especificar essas variáveis mais tarde, conforme desejar, executando o script a partir da linha de comando do PowerShell e editando os parâmetros (por exemplo, & "C:\MyPowerShells\Edit-LNK-files.ps1" -oldString E:\ -newString D:\ -searchPath "C:\My LNKs\"
  3. Execute o Windows Powershell como administrador: iniciar > Todos os programas > Acessórios > Windows PowerShell, clique com o botão direito do mouse em Windows PowerShell e clique em Executar como Administrador
  4. No Powershell, digite set-executionpolicy remotesigned e pressione Enter
  5. Digite Y e pressione Enter para permitir que o PowerShell execute o script que você acabou de criar no Bloco de Notas (talvez você queira alterá-lo de volta depois de ter feito isso para manter seu sistema protegido).
  6. Digite & "C:\MyPowerShells\Edit-LNK-files.ps1"
  7. Pressione Enter para executar um "Dry Run" (ótima idéia, Terrence! mas eu mudei para o padrão)
  8. Revise a saída da "Execução Seca" - os caminhos mudaram adequadamente? Caso contrário, altere as variáveis $newString e $oldString adequadamente e repita as etapas de 6 a 8 para repetir a execução a seco. Do contrário, continue para o passo 9.
  9. Se a execução a seco parecer boa, repita a etapa 6, mas desta vez adicione o parâmetro -RealRun para que pareça & "C:\MyPowerShells\Edit-LNK-files.ps1" -RealRun . Agora, quando você apertar Enter, ele vai realmente mudar os arquivos .LNK

Aqui está o script editado:

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$False,Position=1)]
    [string] $oldString="\contoso\Projects\rhinoexhibit\",

    [Parameter(Mandatory=$False,Position=2)]
    [string]$newString="\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\",

    [Parameter(Mandatory=$False,Position=3)]
    [string]$searchPath="C:\My LNKs\",

    [switch]$RealRun
)

$shell = new-object -com wscript.shell
$filesFound= 0

if ( $RealRun ) {
   write-host "Executing real run" -foregroundcolor red -backgroundcolor black
} else {
   write-host "Executing dry run" -foregroundcolor green -backgroundcolor black
}

dir $searchPath -filter *.lnk -recurse | foreach {
   $lnk = $shell.createShortcut( $_.fullname )
   $oldPath= $lnk.targetPath
   $oldArgs= $lnk.Arguments


   $lnkRegex = ",*" + [regex]::escape( $oldString )

   if ( $oldPath -match $lnkRegex ) {
      $newPath = $oldPath -replace $lnkRegex, $newString

      write-host "Found: " $_.fullname -foregroundcolor yellow -backgroundcolor black
      write-host " Replace: " $oldPath
      write-host " With:    " $newPath
      $filesFound++

      if ( $RealRun ) {
         $lnk.targetPath = $newPath
         $lnk.Save()
      }
   }

   if ( $oldArgs -match $lnkRegex ) {
      $newArgs = $oldArgs -replace $lnkRegex, $newString

      write-host "Found:  " $_.fullname -foregroundcolor yellow -backgroundcolor black
      write-host "Target: " $oldPath -foregroundcolor yellow -backgroundcolor black
      write-host " Replace Args: " $oldArgs
      write-host " With Args:    " $newArgs
      $filesFound++

      if ( $RealRun ) {
         $lnk.Arguments = $newArgs
         $lnk.Save()
      }
   }
}

if ($filesFound -eq 0) {
    write-host "No LNK files found with " $oldString "in target or arguments" -foregroundcolor red -backgroundcolor black
}
else {
    if ($RealRun) {
        write-host $filesFound "files found and edited" -foregroundcolor red -backgroundcolor black
    }
    else {
        write-host $filesFound "files found" -foregroundcolor green -backgroundcolor black
    }
}

A execução desse script deve alterar com êxito os arquivos de atalho .LNK com o seguinte na caixa Target:

\contoso\Projects\rhinoexhibit\rhinospecifications.pdf

para

\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\rhinospecifications.pdf

e de

"C:\Program Files (x86)\FOXIT READER\Foxit Reader.exe" /A page=37 "\contoso\Projects\rhinoexhibit\rhinospecifications.pdf"

para

"C:\Program Files (x86)\FOXIT READER\Foxit Reader.exe" /A page=37 "\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\rhinospecifications.pdf"
    
por 17.11.2014 / 22:46
-1

Isso deve ser possível com o PowerShell no Windows 8 . Eu encontrei algumas informações aqui e here . Eu não sou especialista em PowerShell, mas como você é um programador, tenho certeza que você poderia encontrar uma maneira (e talvez publicá-la como resposta aqui para os outros verem).

    
por 29.10.2012 / 14:52