проверять имена в папке и удалять двойные кавычки в CSV с помощью цикла PowerShell

Я пытаюсь зациклить файлы в определенной папке и удалить в них двойные кавычки

кто-нибудь мог это объяснить, я сделал это:

Get-ChildItem "c:\temp\test\" -filter SplitCSV* | 

    ForEach-Object {
    (Get-Content $_) -replace '(?m)"([^,]*?)"(?=,|$)', '$1' | Set-Content $_   }

С этим сообщением об ошибке:

Get-Content : Impossible de trouver le chemin d'accès «
C:\Users\cptspinstalldev\SplitCSV_03-08-2020_9.csv», car il n'existe pas.

Итак, я переместил свои файлы в C: \ Users \ cptspinstalldev \, и это сработало, но почему мои get-childitems не смотрели в нужную папку, то есть c: \ temp \ test \

Похоже, я был не в той папке, так тупой

2 ответа

Решение

Поскольку удалять все кавычки в существующих файлах CSV небезопасно, рассмотрите возможность использования моей функции ConvertTo-CsvNoQuotes, чтобы сделать это за вас.

Добавьте функцию поверх своего скрипта и выполните:

Get-ChildItem -Path "c:\temp\test" -Filter 'SplitCSV*.csv' -File | 
    ForEach-Object {
        (Import-Csv -Path $_.FullName) | ConvertTo-CsvNoQuotes | Set-Content $_.FullName
    }

Если вы используете PowerShell 7.0, вы можете обойтись без этой функции и просто написать код как

Get-ChildItem -Path "c:\temp\test" -Filter 'SplitCSV*.csv' -File | 
    ForEach-Object {
        $file = $_.FullName
        (Import-Csv -Path $file) | Export-Csv -Path $file -UseQuotes AsNeeded
    }

В Powershell Get-Content а также Set-Contentфункции ожидают полного пути. В$_ переменная - это FileInfo или DirectoryInfoобъект. Попробуйте пройти полный путь, используя$_.FullName, как это:

Get-ChildItem "c:\temp\test\" -filter SplitCSV* | 

ForEach-Object {
(Get-Content $_.FullName) -replace '(?m)"([^,]*?)"(?=,|$)', '$1' | Set-Content $_.FullName   }
Другие вопросы по тегам