Tentando usar o arquivo em lote em um local e chamar o script powershell elevado

1

Estou tentando usar o arquivo de lote abaixo, que encontra a unidade de CD na máquina, e quero iniciar um script PowerShell a partir do CD e executá-lo nessa pasta. Aqui está o arquivo em lote.

@echo off
setlocal
for /f "skip=1 tokens=1,2" %%i in ('wmic logicaldisk get caption^, drivetype') do (if [%%j]==[5] pushd %%i)
cd WIN2k8\Non-Supressed\
start powershell -NoLogo -NoProfile -WindowStyle Maximized -NoExit -ExecutionPolicy Bypass -File .\PatchTest.ps1
echo Press Space Bar to continue
pause
endlocal
    
por Degthat 21.01.2017 / 03:37

3 respostas

0

Trying to use batch file in one location and call powershell script elevated

Você pode realizar o que está tentando fazer com a sintaxe abaixo do que testei e confirmei do meu lado. Eu incorporei algumas técnicas em sua lógica com como eu fiz esse tipo de coisa com outras soluções de processo de arquivo do PowerShell e do Batch, como explicado no passado.

Eu adicionei o caminho WIN2k8\Non-Supressed após a variável %~j para que o loop FOR /F use o caminho completo para SET a variável ( FPath ) para usar posteriormente para usar essa variável como o caminho completo de o script do PowerShell que está sendo executado. Não há necessidade de usar o comando PUSHD por esse método.

Eu também uso um CD /D explícito para o diretório do Windows do aplicativo PowerShell, chamo o PowerShell de lá e, em seguida, transmito os argumentos, comandos, switches, etc. - com o caminho completo do script do PowerShell (por exemplo, -ExecutionPolicy Bypass -Command "& '%FPath%\PatchTest.ps1'" ).

Exemplo de script em lote

@ECHO ON

SETLOCAL 
FOR /F "SKIP=1 TOKENS=1,2" %%i IN ('"wmic logicaldisk get caption, drivetype"') DO (IF [%%~j]==[5] SET FPath="%%~i\WIN2k8\Non-Supressed")

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%FPath%\PatchTest.ps1'"

ECHO Press Space Bar to continue 
PAUSE 
ENDLOCAL

Mais recursos

por 21.01.2017 / 04:35
1

Após o script comentado .bat , verifique todas as unidades de CD na máquina e :

se um meio for inserido e o meio inserido contiver a pasta esperada e executar uma sessão do elevado powershell, será alterado local para esta pasta e executa o script especificado de dentro dela:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

rem set initial values
set "_folder=WIN2k8\Non-Supressed"
set "_folder=content\recipes\cze_CZE"                          my testing value
SET "_fullPath="                                               necessary

FOR /F "SKIP=1 TOKENS=1-5" %%i IN ('
   "wmic logicaldisk get Caption, DriveType, Size, SystemName, VolumeSerialNumber" ') DO (
  rem next test: is CD/DVD? could be omitted using 'wmic … Where "DriveType=5" get …'  
  IF [%%~j]==[5] (
    rem next test: medium inserted? 
    IF NOT [%%~m]==[] (
      rem next test: right medium inserted?
      if exist "%%~i\%_folder%\" (
        SET "_fullPath=%%~i\%_folder%"
      )
    )
  )
)
rem set auxiliary values to keep final 'PowerShell' line in a reasonable length 
set "_elevate=Start-Process PowerShell -Verb RunAs"
set "_torun=.\PatchTest.ps1"
set "_torun=Get-Childitem 81*;pause"                           my testing value
set "_arguments='Push-Location -literalPath ''"%_fullPath%"'';%_torun%'"

IF defined _fullPath (

  PowerShell %_elevate% -ArgumentList %_arguments%

)

pause
    
por 21.01.2017 / 14:24
1

Esse lote se elevará (se necessário) antes de avaliar a unidade de CD e, em seguida, executará o script powershell.

@echo off
setlocal
::Check if elevated
net file 1>nul 2>&1 || (powershell -ex ByPass -Command ^
  "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c %~f0 %*'"
  goto :eof
)
:: Put code here that needs elevation
Set "CDPath=\WIN2k8\Non-Supressed\"
Set "Script=PatchTest.ps1"

for /f %%i in (
  'wmic logicaldisk  where "DriveType=5" get caption^, drivetype^|findstr ":"'
) do IF exist "%%i%CDPath%Script%" Set "CDPath=%%i%CDPath%" & Goto :Found

Echo Can't locate CD drive / script
Pause
Goto :Eof

:Found
PushD "%CDPath%"
start powershell -NoLogo -NoProfile -WindowStyle Maximized -NoExit -Ex Bypass -File .\PatchTest.ps1

echo Press Space Bar to continue
pause
endlocal
    
por 21.01.2017 / 19:23

Tags