Распечатать переменную на 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)"
Таким образом, вы:
- не должен избегать вещей.
- может преобразовать его в строку.
- может вызвать его с помощью оператора invoke (
&
или же.
). - иметь подсветку синтаксиса при редактировании в ISE.
- любые синтаксические ошибки обнаруживаются при его анализе, а не при выполнении.
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'"