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:
- 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)
- 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\"
- 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
- No Powershell, digite
set-executionpolicy remotesigned
e pressione Enter
- 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).
- Digite
& "C:\MyPowerShells\Edit-LNK-files.ps1"
- Pressione Enter para executar um "Dry Run" (ótima idéia, Terrence! mas eu mudei para o padrão)
- 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.
- 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"