Viime aikoina minulla oli tarve luoda symbolinen linkki suorittaessani skannausta joihinkin järjestelmiin, ja huomasin, että PowerShellissä ei ollut natiivia tapaa tämän toteuttamiseen. Nyt voin käyttää mklink.exe:tä saadakseni tämän toimimaan, mutta tämä toimii vain cmd.exe:ssä. Tämä tarkoittaa sitä, etten voi itse asiassa kutsua mklink.exe:tä PowerShellin alaisuudessa.
mklink.exe
Sen sijaan minun on kutsuttava ensin cmd.exe:tä ja sen jälkeen mklink.exe:tä päästäkseni käsiksi komentoon.
cmd.exe /c mklink.exe
Voi siis kuvitella, että olisin tyytyväinen tähän tulokseen. No, minä en ole. Minun ei pitäisi luottaa siihen, että kutsun ensin cmd.exe:n ennen kuin käytän mklink.exe:tä symbolisen linkin luomiseen. Ja kiitos Pinvoken käyttämisen Win32 API:n käyttämiseen, minun ei tarvitse hyväksyä tätä kohtaloa!
Mennessäni pinvoke.net-sivustolle näen kernel32:n alla, että siellä on CreateSymbolicLink-niminen funktio, joka vastaa etsimääni.
Tarpeeni perusteet ovat alla:
public static extern bool CreateSymbolicLink(strin
Minun piti lisätä avainsana ’public’ alkuun, jotta tämä funktio on käytettävissä, kun lisään sen istuntooni. Tämä ei ole koko koodi, vain se mitä oli saatavilla sivustolla. Jouduin tekemään hieman C#-koodausta, jotta tästä tulisi tyyppi, jonka voin tuoda PowerShell-istuntooni Add-Type-ohjelmalla.
Add-Type @"using System;using System.Runtime.InteropServices; namespace mklink{ public class symlink { public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); }}"@
| get-member -static
Nyt minulla on tyyppi, jota voidaan käyttää symbolisen linkin luomiseen. Se tarvitsee vain polun, jota käytetään linkkiä varten, ja varsinaisen SymNimen ja sitten joko 0 (Tiedosto) tai 1 (Hakemisto) päättämään, millainen symbolinen linkki luodaan. Tuloksena saatava arvo on boolean-arvo, joka voidaan helposti lisätä If/Else-lauseeseen muiden toimintojen hoitamiseksi.
::CreateSymbolicLink('C:\Users\Administrator\Desktop\SQL2008Install',"\dc1\SharedStorage\SQL 2008",1)
Katsomalla symbolista linkkiä SQL2008Install näet attribuuteista, että kyseessä on symbolinen linkki, sillä se on merkitty ReparsePointiksi:
Siten minulla on nyt työpöydälläni symbolinen linkki, joka osoittaa etäpalvelimella olevaan SQL2008-asennuskansioon.
Mikäli tämä menetelmä vaatii jonkin verran työtä, on luonnollista, että tästä voi tulla funktio, joka on uudelleenkäytettävissä.
New-SymLink
Tämä funktio tekee periaatteessa sen, mitä olen näyttänyt, mutta funktiomuodossa, joka on siirrettävissä ja helpompi käyttää. Sen avulla voit luoda symbolisen linkin joko hakemistolle tai tiedostolle.
Funktioni alkuosassa tarkistetaan, olenko jo ladannut pinvoke-tyyppini, ja jos näin ei ole, lisätään tyyppi käyttämällä Add-Type-tyyppiä.
Begin { Try { $null = } Catch { Add-Type @" using System; using System.Runtime.InteropServices; namespace mklink { public class symlink { public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); } }"@ }}
Prosessilohkossa (sallin putkilinjan syötteen Path-parametrille) käytän tyyppiäni symbolisen linkin luomiseen ja tarkkailen, onko prosessin aikana ongelmia. Lisäyksenä tulostan objektin, jossa näkyy symbolinen linkki ja kohdepolku, johon linkki viittaa.
Process { #Assume target Symlink is on current directory if not giving full path or UNC If ($SymName -notmatch "^(?::\)|(?:\\\w+\$)") { $SymName = "{0}\{1}" -f $pwd,$SymName } $Flag = @{ File = 0 Directory = 1 } If ($PScmdlet.ShouldProcess($Path,'Create Symbolic Link')) { Try { $return = ::CreateSymbolicLink($SymName,$Path,$Flag) If ($return) { $object = New-Object PSObject -Property @{ SymLink = $SymName Target = $Path Type = $PScmdlet.ParameterSetName } $object.pstypenames.insert(0,'System.File.SymbolicLink') $object } Else { Throw "Unable to create symbolic link!" } } Catch { Write-warning ("{0}: {1}" -f $path,$_.Exception.Message) } }}
Katsotaanpa tämä toiminnassa!
New-SymLink -Path "C:\Users\Administrator\Downloads" -SymName Downloads -Directory -Verbose
Ja näin funktio luo symbolisen linkin työpöydälläni olevaan latauskansioon. Linkki tämän toiminnon lataamiseen on alla. Kerro, mitä mieltä olet tästä funktiosta!
Lataus
Skriptivarasto