Распечатать переменную на Powershell

Мне нужно напечатать на Powershell строковое командование через переменную, я назвал $em_result, например, em_result=20, спасибо.

$em_result = ´gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} |  Measure -Sum | Select -Exp Sum'´
Write-Host"$em_result"

3 ответа

Если вы хотите сохранить командную строку в переменную, я бы рекомендовал сохранить ее как ScriptBlock скорее как String:

$em_result = {gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} |  Measure -Sum | Select -Exp Sum'}
Write-Host "`$em_result = $(&$em_result)"

Таким образом, вы:

  1. не должен избегать вещей.
  2. может преобразовать его в строку.
  3. может вызвать его с помощью оператора invoke (& или же .).
  4. иметь подсветку синтаксиса при редактировании в ISE.
  5. любые синтаксические ошибки обнаруживаются при его анализе, а не при выполнении.
  6. ScriptBlock связан с его файлом и строкой, так что вы можете установить точки останова в нем.

Хотя я не уверен в мотивации того, что вы пытаетесь выполнить, похоже, что вы пытаетесь сохранить команду $em_result так что вы можете бежать, когда захотите. Таким образом, вы сохраняете не результат по времени, а каждый раз, когда вы называете его, результат будет с того времени.

Как ответил Тони Хинкль, нужно сохранить команду в виде строки. Тем не менее, есть нечто большее, чем просто цитаты. Переменная конвейера $_ также вступит в игру. В данном случае простая строка сделает это так, что вам не придется беспокоиться о том, чтобы избежать чего-либо.

$em_result = @'
gc 'C:\Users\mtmachadost\Desktop\Test\logError.txt' | ?{$_ -match 'cajica11'} | %{($_ -split "\s+")[3]} |  Measure -Sum | Select -Exp Sum
'@

Теперь вы можете вызвать эту строку и получить результаты

Write-Host "`$em_result = $(Invoke-Expression $em_result)"

Я предполагаю, что вы пытались использовать пару backtick как и escape-пару, что заставило меня думать, что это то, что вы хотели. Backtick будет экранировать только один следующий символ. Invoke-Expression выполнит строку, которую мы передадим как код.

При назначении вам нужно указать, что это строка, иначе Powershell попытается ее выполнить. Вам также необходимо разделить его двойными кавычками и экранировать двойные кавычки и знаки доллара в команде с помощью обратного кавычки, чтобы они считались частью строки, а не разделителем для конца строки.

$em_result = [string]"gc C:\Users\mtmachadost\Desktop\Test\logError.txt | ?{`$_ -match 'cajica11'} | %{(`$_ -split `"\s+`")[3]} |  Measure -Sum | Select -Exp Sum'"
Другие вопросы по тегам