Извлечь строку без интервала в командлете powershell

#string #powershell #comparison

#строка #powershell #сравнение

Вопрос:

У меня есть некоторый скрипт powershell. Вместо totalcmd* вы можете ввести другой процесс, который вы хотите.

 $tc = get-process -Name totalcmd* | format-wide -property Name 
echo $tc
if ($tc -eq "Totalcmd64")
{
Stop-Process -Name totalcmd*
}
Start-Sleep 10
  

Я думаю, это не сработает, потому что мой $ tc не равен строке «totalcmd». Как я могу удалить ненужные пробелы из выходных данных командлета get-process -Name totalcmd* | format-wide -property Name и правильно сравнить строки?

Комментарии:

1. Если в конечном итоге будет запущено более одного процесса, который начинается с «totalcmd», то ваша инструкция «if» никогда не примет значение true, потому что объект array $tc никогда не будет равен объекту string «Totalcmd64».

Ответ №1:

В конечном итоге строка не получается, потому что вы передаете в format-wide . Эти командлеты лучше всего подходят для представления данных на экране. Вместо этого выберите свойство и используйте -ExpandProperty , чтобы вернуть его в виде строки:

 $tc = get-process -Name totalcmd* | Select-Object -ExpandProperty Name 
echo $tc
...
  

Ответ №2:

В целом вы правы в том, что $ tc не равно «totalcmd», и это потому, что когда вы устанавливаете $ tc, вы создаете массив (скорее всего, из одного элемента). Вы можете проверить это, выполнив $tc | get-member , чтобы увидеть, с каким типом объекта вы работаете.

Для работы со строковыми объектами вы также можете использовать Out-String командлет.

Ответ №3:

Если вы хотите явно остановить процессы TotalCmd64, почему бы просто не использовать:

 Get-Process -Name TotalCmd64 | Stop-Process
  

Если вы хотите переключаться между 64/32-разрядными версиями программы, используйте инструкцию switch (непроверенную):

 $tc = (Get-Process -Name TotalCmd*).Name
switch ($tc){
    'TotalCmd'   {Get-Process -Name TotalCmd  |Stop-Process;"Start TotalCmd64";Break}
    'TotalCmd64' {Get-Process -Name TotalCmd64|Stop-Process;"Start TotalCmd32";Break}
    default      {"No TotalCmd* processes found"}
}
  

Комментарии:

1. Возможно, вы правы. В глобальном масштабе мне нужен скрипт для перезапуска Totalcmd64.exe для Totalcmd.exe и наоборот.

2. Смотрите расширенный ответ для переключения между 64/32-разрядными версиями.