Waarom kan ik mijn .PS1-bestand niet kopiëren naar een andere computer en het uitvoeren?
PowerShell is is standaard niet gekoppeld aan de .PS1-bestandsextensie.
We hoeven het batchbestand dus niet opnieuw te schrijven voor elk script, of telkens wanneer we een script verplaatsen, het maakt gebruik van een zelfreferentievariabele om het bestandspad voor het PowerShell-script te bouwen. Om dit te laten werken, moet het batchbestand in dezelfde map worden geplaatst als uw PowerShell-script en dezelfde bestandsnaam hebben. Dus als uw PowerShell-script 'MyScript.ps1' wordt genoemd, moet u uw batchbestand 'MyScript.bat' een naam geven en ervoor zorgen dat het zich in dezelfde map bevindt. Plaats vervolgens deze regels in het batch-script:
@ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1'" PAUSE
Als de andere beveiligingsbeperkingen niet aanwezig waren, zou dat echt genoeg om een PowerShell-script uit een batchbestand te laten draaien. In feite zijn de eerste en laatste regels hoofdzakelijk een kwestie van voorkeur - het is de tweede regel die het werk echt doet. Hier is de uitsplitsing:
@ECHO OFF
schakelt commando-echoën uit. Hierdoor blijven alleen uw andere opdrachten op het scherm zichtbaar wanneer het batchbestand wordt uitgevoerd. Deze regel is zelf verborgen door het gebruik van het symbool at (@) ervoor. PowerShell.exe -Command "& '% ~ dpn0.ps1'"
voert feitelijk het PowerShell-script uit. PowerShell.exe kan natuurlijk worden gebeld vanuit elk CMD-venster of batchbestand om PowerShell te starten naar een kale console zoals gebruikelijk. U kunt het ook gebruiken om opdrachten rechtstreeks uit een batchbestand uit te voeren, door de -Command-parameter en de juiste argumenten op te nemen. De manier waarop dit wordt gebruikt om ons .PS1-bestand te targeten, is met de speciale variabele% ~ dpn0. Uitvoeren van een batchbestand,% ~ dpn0 evalueert naar de stationsletter, het mappad en de bestandsnaam (zonder extensie) van het batchbestand. Omdat het batchbestand en PowerShell-script zich in dezelfde map bevinden en dezelfde naam hebben, vertaalt% ~ dpn0.ps1 naar het volledige pad naar het PowerShell-script. PAUSE
pauzeert gewoon de batchuitvoering en wacht op gebruikersinvoer. Dit is over het algemeen handig om aan het einde van uw batchbestanden te hebben, zodat u de mogelijkheid hebt om de uitvoer van een opdracht te beoordelen voordat het venster verdwijnt. Terwijl we door het testen van elke stap gaan, zal het nut hiervan duidelijker worden. Dus het basisbatchbestand is ingesteld. Voor demonstratiedoeleinden wordt dit bestand opgeslagen als "D: Script Lab MyScript.bat" en staat er een "MyScript.ps1" in dezelfde map. Laten we eens kijken wat er gebeurt als we dubbelklikken op MyScript.bat.
Natuurlijk is het PowerShell-script niet uitgevoerd, maar dat is te verwachten - we hebben tenslotte alleen de eerste van onze vier problemen aangepakt. Er zijn echter enkele belangrijke bits hier getoond:
De titel van het venster laat zien dat het batchtype PowerShell succesvol heeft gestart.
Write-Output 'Aangepast PowerShell-profiel is effectief!'
De ExecutionPolicy op het testsysteem hier is ingesteld op RemoteSigned. Hiermee kunnen scripts lokaal worden gemaakt (zoals het profielscript), terwijl scripts van externe bronnen worden geblokkeerd, tenzij ze zijn ondertekend door een vertrouwde instantie. Voor demonstratiedoeleinden werd de volgende opdracht gebruikt om MyScript.ps1 te markeren als afkomstig van een externe bron:
Add-Content -Path 'D: Script Lab MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3 "-Stream 'Zone.Identifier'
Hiermee wordt de alternatieve gegevensstroom Zone.Identifier ingesteld op MyScript.ps1, zodat Windows denkt dat het bestand afkomstig is van internet. Het kan eenvoudig worden omgekeerd met de volgende opdracht:
Clear-Content -Path 'D: Script Lab MyScript.ps1' -Stream 'Zone.Identifier'
Stap 2: Kennismaken met ExecutionPolicy.
PowerShell.exe -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"
De parameter -ExecutionPolicy kan worden gebruikt om de ExecutionPolicy aan te passen die wordt gebruikt wanneer u een nieuwe PowerShell-sessie maakt. Dit zal na die sessie niet blijven bestaan, zodat we PowerShell zo kunnen uitvoeren wanneer we dat nodig hebben zonder de algemene beveiligingshouding van het systeem te verzwakken. Nu we dat hebben opgelost, laten we er nog een keer tegenaan:
Nu het script correct is uitgevoerd, kunnen we zien wat het eigenlijk doet. Het laat ons weten dat we het script uitvoeren als een beperkte gebruiker. Het script wordt in feite uitgevoerd door een account met beheerdersrechten, maar gebruikersaccountbeheer staat in de weg. Hoewel details over hoe het script controleert of beheerders toegang hebben buiten het bestek van dit artikel vallen, is hier de code die wordt gebruikt voor demonstratie:
if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) {Write-Output 'Running as Administrator!'} Else {Write-Output 'Running Limited!'} Pauzeren
Je zult ook opmerken dat er nu twee "Pauze" -bewerkingen zijn in de scriptuitvoer - een uit het PowerShell-script en een uit het batchbestand. De reden hiervoor zal in de volgende stap duidelijker zijn.
Stap 3: toegang krijgen tot de beheerder.
Helaas is er geen manier om UAC te activeren voor elevatie vanuit een batchbestand of CMD-sessie. PowerShell staat ons echter wel toe om dit te doen met Start-Process. Bij gebruik in combinatie met "-Verb RunAs" probeert Start-Process een toepassing met beheerdersrechten te starten. Als de PowerShell-sessie nog niet is verhoogd, wordt er een UAC-prompt geactiveerd. Om dit vanuit het batchbestand te gebruiken voor het starten van ons script, zullen we uiteindelijk twee PowerShell-processen opstarten - een om Start-Process af te vuren en een andere, gestart door Start-Process, om het script uit te voeren. De tweede regel van het batchbestand moet hier worden gewijzigd:
PowerShell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' - Verb RunAs} "
Wanneer het batchbestand wordt uitgevoerd, is de eerste regel van de uitvoer die we zien van het PowerShell-profielscript. Vervolgens verschijnt er een UAC-prompt wanneer Start-Process MyScript.ps1 probeert te starten.
Nadat u op de UAC-prompt hebt geklikt, wordt een nieuwe PowerShell-instantie gemaakt. Omdat dit een nieuwe instantie is, zien we natuurlijk opnieuw het profielscript. Vervolgens wordt MyScript.ps1 uitgevoerd en we zien dat we inderdaad in een verhoogde sessie zitten.
En daarom hebben we hier ook twee pauzes. Als dat niet het geval is in het PowerShell-script, zien we nooit de uitvoer van het script: het PowerShell-venster verschijnt gewoon en verdwijnt zodra het script is voltooid. En zonder de pauze in het batchbestand kunnen we niet zien of er fouten zijn opgetreden bij het starten van PowerShell.
Stap 4: aangepaste PowerShell-profielen verkennen
PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "'-Verb RunAs}"
Door de parameter -NoProfile aan beide exemplaren van PowerShell toe te voegen die door het script worden gestart, betekent dit dat het profielscript van de gebruiker in beide stappen volledig wordt omzeild en ons PowerShell-script wordt uitgevoerd in een redelijk voorspelbare, standaardomgeving. Hier ziet u dat er geen aangepast profielbericht is in beide shells.
Als u geen beheerdersrechten in uw PowerShell-script nodig hebt en stap 3 hebt overgeslagen, kunt u het doen zonder de tweede PowerShell-instantie en de tweede regel van uw batchbestand zou er als volgt uit moeten zien:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"
De uitvoer ziet er dan als volgt uit:
( Natuurlijk, voor niet-beheerdersscripts, zou je op dit moment ook zonder een einde-van-scriptpauze in je PowerShell-script kunnen doen, omdat alles in hetzelfde consolevenster wordt vastgelegd en daar wordt gehouden door de pauze aan het einde van de batchbestand.)
Voltooide batchbestanden.
Zonder beheerdersrechten:
@ECHO OFF PowerShell.exe -NoProfile -ExecutionPoli cy Bypass -Command "& '% ~ dpn0.ps1'" PAUSE
Met beheerderstoegang:
@ECHO OFF PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile - ExecutionPolicy Bypass -File "% ~ dpn0.ps1 " '-Verb RunAs} "PAUSE
Vergeet niet om het batchbestand in dezelfde map te plaatsen als het PowerShell-script waarvoor u het wilt gebruiken, en geef het dezelfde naam . Vervolgens, ongeacht het systeem waar u deze bestanden naartoe kunt nemen, kunt u uw PowerShell-script uitvoeren zonder dat u zich hoeft bezig te houden met de beveiligingsinstellingen op het systeem. Je zou die veranderingen zeker elke keer handmatig kunnen doen, maar dit bespaart je problemen en je zult je geen zorgen hoeven te maken dat je de wijzigingen later terug zult zetten.
Referenties:
PowerShell-scripts uitvoeren vanuit een batchbestand - Programmablog van Daniel Schroeder
Een scanner gebruiken op uw Mac OS X Computer
Het scannen van een document in Mac OS X is uiterst eenvoudig, maar voor degenen die misschien niet bekend zijn of afkomstig zijn uit Windows, is het handig om een korte rondleiding door het proces te maken. GERELATEERD: Documenten naar PDF scannen met de camera van uw Android-telefoon Het is vermeldenswaard dat u een goed deel van de tijd alleen de camera van uw smartphone kunt gebruiken en scan het eenvoudig naar PDF.
Een Windows-achtige pop-upkalender maken in OS X
We houden heel erg van OS X van Apple, maar er zijn dingen die ontbreken en zelfs verrassend achterblijven bij Windows. Een van die functies is de mogelijkheid om snel op de datum / tijd in het systeemvak te klikken om een kleine pop-upkalender te bekijken. Het is leuker dan een volledige agenda te openen en vervolgens opnieuw te klikken om deze te sluiten.