Запуск Powershell из командной строки, вызывающей CMD, для неправильного анализа - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь запустить следующий код PowerShell через оболочку CMD:

$logfile = "x:\test.log"
try {
get-service
Add-Content - Path $logfile -Value "It Worked"
} catch {
Add-Content -Path $logfile -Value $_.Exception.Message
}

Из сценария CMD я вызываю сценарий следующим образом:

Powershell.exe -executionpolicy bypass -command "I paste the code above 
here"

Я также попробовал это следующим образом:

Powershell.exe -executionpolicy bypass -command "& 'Command From Above'"

Как вы видите из ошибки, похоже, что она не пытается выполнить всю команду, потому что она, похоже, пытается выполнить мою команду журнала:

! https://imgur.com/y62FzB2

Если я запускаю что-то простое, оно работает без проблем. Следующим образом:

Powershell.exe -executionpolicy bypass -command "get-service"

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Что касается что вы пробовали :

  • При вызове из cmd.exe, PowerShell код вы переходите к CLI Windows PowerShell, powershell.exe (pwsh.exe для PowerShell Core ) должно быть однострочный

    • Ваш скриншот показывает, что вы действительно использовали одну строку, но вам не хватает ; символов. между вашими высказываниями ; эти разделители операторов необходимы, когда вы хотите разместить несколько операторов в одной строке.
  • Ваша следующая проблема связана с передачей кода в виде отдельных аргументов в -command, которые соединяются PowerShell перед выполнением (в отличие от попытки передать один аргумент с внешним двойным -quoting).

    • В передаваемых аргументах по отдельности любые вложения "..." очищаются при разборе PowerShell, так что "x:\test.log" превращается в x:\test.log - нет кавычки - что вызвало ошибку, которую вы увидели.

A решение :

Автор:

  • правильно разделяя ваши заявления с ;
  • экранирование " символов. в вашей команде как \" (sic)

вы можете заставить свою команду работать:

powershell -c $logfile = \"x:\test.log\"; try { get-service; Add-Content -Path $logfile -Value \"It Worked\" } catch { Add-Content -Path $logfile -Value $_.Exception.Message }

Как правило, однако, обратите внимание, что если ваш код содержит символы (также), зарезервированные в cmd.exe - в частности, & | < > % ^ - вам придется индивидуально ^ -экранировать их.

Трудно получить цитаты прямо в командной строке, и , в конечном счете, единственное надежное решение - если не избегать проблемы путем создания (временного) файла сценария - это используйте параметр командной строки
-EncodedCommand интерфейса командной строки
, который принимает представление кода PowerShell в кодировке Base64 с использованием кодировки символов UTF-16LE.

К сожалению, такое представление не так легко найти в пакетных файлах.

0 голосов
/ 11 июня 2019

У меня всегда были проблемы с вызовом многострочных сценариев PowerShell через cmd.

Я видел, как люди конвертировали свои сценарии в base64 и запускали эту строку из PowerShell, но я не помню, как.

Самый простой способ - сохранить ваш скрипт в формате .PS1 и запустить PowerShell -NoProfile -ExecutionPolicy Bypass -file "C:\ps.ps1"

В противном случае вы можете вывести каждую строку в файл .ps1, а затем запустить его.Будет работать как файл .bat.

@echo off
set WD=%~dp0
ECHO $logfile = "x:\test.log" >> "%WD%Script.ps1"
ECHO try { >> "%WD%Script.ps1"
ECHO     get-service; >> "%WD%Script.ps1"
ECHO     Add-Content - Path $logfile -Value "It Worked" >> "%WD%Script.ps1"
ECHO } catch { >> "%WD%Script.ps1"
ECHO     Add-Content -Path $logfile -Value $_.Exception.Message >> "%WD%Script.ps1"
ECHO } >> "%WD%Script.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%Script.ps1"
del "%WD%Script.ps1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...