Een PowerShell-script uitvoeren vanuit een batchbestand

Ik probeer dit script in PowerShell uit te voeren. Ik heb het onderstaande script opgeslagen als ps.ps1op mijn bureaublad.

$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}

Ik heb een batchscript gemaakt om dit PowerShell-script uit te voeren

@echo off
Powershell.exe set-executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1
pause

Maar ik krijg deze foutmelding:


Antwoord 1, autoriteit 100%

U hebt de parameter -ExecutionPolicynodig:

Powershell.exe -executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1

Anders beschouwt PowerShell de argumenten als een regel om uit te voeren en terwijl Set-ExecutionPolicyiseen cmdlet, heeft het geen parameter -File.


Antwoord 2, autoriteit 40%

Ik leg uit waarom je een PowerShell-script vanuit een batchbestand wilt aanroepen en hoe je dit doet in mijn blogpost hier.

Dit is eigenlijk wat u zoekt:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"

En als u uw PowerShell-script als beheerder moet uitvoeren, gebruikt u dit:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"

In plaats van het volledige pad naar het PowerShell-script hard te coderen, raad ik echter aan het batchbestand en het PowerShell-scriptbestand in dezelfde map te plaatsen, zoals in mijn blogbericht wordt beschreven.


Antwoord 3, autoriteit 7%

Als u wilt starten vanuit de huidige map zonder een volledig gekwalificeerd pad, kunt u het volgende gebruiken:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"

Antwoord 4, autoriteit 6%

Als u een batchbestand uitvoert dat PowerShell aanroept als beheerder, kunt u het beter als volgt uitvoeren, zodat u alle moeite bespaart:

powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"

Het is beter om Bypasste gebruiken…


Antwoord 5, autoriteit 2%

Kleine steekproef test.cmd

<# :
  @echo off
    powershell /nologo /noprofile /command ^
         "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
  exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...

Antwoord 6

Als je een paar scripts wilt uitvoeren, kun je Set-executionpolicy -ExecutionPolicy Unrestrictedgebruiken en vervolgens resetten met Set-executionpolicy -ExecutionPolicy Default.

Houd er rekening mee dat het uitvoeringsbeleid alleen wordt gecontroleerd wanneer u de uitvoering ervan start (of zo lijkt het) en dus kunt u taken op de achtergrond uitvoeren en het uitvoeringsbeleid onmiddellijk opnieuw instellen.

# Check current setting
Get-ExecutionPolicy
# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com  | tee ping__google.com.txt  }
# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es

Antwoord 7

Nog een eenvoudige manier om een ​​PS-script uit te voeren van batch is om het eenvoudigweg op te nemen tussen de ECHO en de omleiders, (& GT; en & GT; & GT;),
Voorbeeld:

@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"

Laatste regel verwijdert het gemaakte temp-bestand.


Antwoord 8

Als uw PowerShell-inlogscript na 5 minuten draait (zoals de mijne was) op een 2012-server, is er een GPO-instelling op een server – ‘Inloggen SCRIPT-vertraging configureren’ De standaardinstelling ‘Niet geconfigureerd’, dit zal een 5 instellen -Minute vertraging voordat u het inlogscript uitvoert.


Antwoord 9

Geplaatst het hier ook:
Hoe Powershell-opdracht in batchbestand te gebruiken

volgende thread:
https://community. idera.com/database-tools/powershell/powertips/b/tips/posts/converting-powershell-to-batch

u kunt elk PowerShell-script gemakkelijk converteren naar een batchbestand met deze PowerShell-functie:

function Convert-PowerShellToBatch
{
    param
    (
        [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [string]
        [Alias("FullName")]
        $Path
    )
    process
    {
        $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $Path -Raw -Encoding UTF8)))
        $newPath = [Io.Path]::ChangeExtension($Path, ".bat")
        "@echo off`npowershell.exe -NoExit -encodedCommand $encoded" | Set-Content -Path $newPath -Encoding Ascii
    }
}

Als u allePowerShell-scripts in een map wilt converteren, voert u gewoon de volgende opdracht uit:

Get-ChildItem -Path <DIR-PATH> -Filter *.ps1 |
  Convert-PowerShellToBatch

Waar is het pad naar de gewenste map. Bijvoorbeeld:

Get-ChildItem -Path "C:\path\to\powershell\scripts" -Filter *.ps1 |
  Convert-PowerShellToBatch

Als u een enkelPowerShell-script wilt converteren, voert u eenvoudig dit uit:

Get-ChildItem -Path <FILE-PATH> |
  Convert-PowerShellToBatch

Waar is het pad naar het gewenste bestand.

De geconverteerde bestanden bevinden zich in de bronmap. d.w.z. <FILE-PATH>of <DIR-PATH>.

Alles bij elkaar:
maak een .ps1-bestand (PowerShell-script) met de volgende code erin:

function Convert-PowerShellToBatch
{
    param
    (
        [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [string]
        [Alias("FullName")]
        $Path
    )
    process
    {
        $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $Path -Raw -Encoding UTF8)))
        $newPath = [Io.Path]::ChangeExtension($Path, ".bat")
        "@echo off`npowershell.exe -NoExit -encodedCommand $encoded" | Set-Content -Path $newPath -Encoding Ascii
    }
}
# change <DIR> to the path of the folder in which the desired powershell scripts are.
# the converted files will be created in the destination path location (in <DIR>).
Get-ChildItem -Path <DIR> -Filter *.ps1 |
  Convert-PowerShellToBatch

En vergeet niet dat als u slechts één bestand wilt converteren in plaats van meerdere, u het volgende kunt vervangen

Get-ChildItem -Path <DIR> -Filter *.ps1 |
  Convert-PowerShellToBatch

met dit:

Get-ChildItem -Path <FILE-PATH> |
  Convert-PowerShellToBatch

zoals ik eerder heb uitgelegd.

Other episodes