Удалите пустое пространство из текстового файла

#powershell #hyper-v

Вопрос:

У меня есть скрипт для импорта имен виртуальных машин из hyper-v в файл txt. Проблема в том, что иногда имена имеют пробелы на обороте, и когда я пытаюсь отключить или включить их с помощью скрипта, он не находит эти машины из-за пробелов.

Есть ли способ удалить пробелы из файла?

 $vm = Get-VM | select name | Out-File -FilePath $ListVM 
(Get-Content $ListVM | Select-Object -Skip 3) | ? {$_.trim() -ne ""} | Set-Content $ListVM
 

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

1. Зачем вам экспортировать в текстовый файл с возможностью экспорта в CSV и забывать о подобных проблемах?

2. На сервере не установлен office.

3. Export-Csv и Import-Csv являются встроенными командлетами PS…….

Ответ №1:

Выдерживая соответствующий альтернативный комментарий/подход Сантьяго. причиной вашей проблемы может быть:

Как правило Out-* , командлеты заставляют объекты проходить через систему форматирования PowerShell для отображения. Вы можете использовать Set-Content с самого начала, чтобы избежать этого, однако вы не можете просто выбрать свойство name, при этом будут созданы объекты с одним свойством «имя». Когда Set-Content видит, что он запишет синтаксис хэша/объекта в файл, пытающийся представить объект, например:

 @{Name=MachineName}
 

Чтобы избежать этого, просто разверните свойство, которое вы хотите сохранить в файле:

 Get-VM | 
Select-Object -ExpandProperty Name | 
Set-Content -FilePath $ListVM
 

Или:

 (Get-VM).Name | Set-Content -FilePath $ListVM
 

Примечание: вы назначаете $VM вывод, однако это приведет к $VM тому, что значение будет равно нулю. Я не уверен, в чем заключается цель, но если вы хотите, чтобы результирующий список хранился в переменной, добавьте такой -PassThru параметр, как:

 $vm = (Get-VM).Name | Set-Content -FilePath $ListVM -PassThru