Удалить осиротевшие возвраты каретки из файла - PullRequest
3 голосов
/ 11 января 2020

У меня есть ежедневный процесс, который загружает и анализирует файлы с разделителями каналов в базу данных. Иногда эти файлы содержат один возврат каретки (без новой строки) в конце одного из полей в строке, что нарушает мой процесс. Мой планировщик (не планировщик windows, внутренний для нашей компании) позволяет мне запускать пакетные процессы или процессы PowerShell для этих файлов перед загрузкой их в базу данных, поэтому я хочу обрезать любой экземпляр возврата осиротевшей каретки в конце field (\ r |).

Эта команда PowerShell работает при запуске вручную:

(Get-Content CarriageReturnTest.txt -Raw).Replace("`r|","|") | Set-Content CarriageReturnTest.txt -Force

Однако, когда я помещаю это в планировщик, я получаю сообщение об ошибке, что «,» не распознается как внутренняя или внешняя команда. Я понял, что планировщик должен запускать команду windows из PowerShell "{command}", поэтому двойные кавычки заставляют командную строку думать, что я запускаю несколько разных команд. Я попытался заменить двойные кавычки в команде PowerShell одинарными кавычками, например:

(Get-Content CarriageReturnTest.txt -Raw).Replace('`r|','|') | Set-Content CarriageReturnTest.txt -Force

Это выполняется через планировщик, но на самом деле ничего не удаляется из файла, потому что PowerShell интерпретирует `как escape-символ, когда он заключен в одинарные кавычки.

Я пытался экранировать двойные кавычки с помощью "", `", \", and ^", но, похоже, ничего не работает.

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

1 Ответ

0 голосов
/ 11 января 2020

Исходя из того, что @JosefZ сказал, я попробовал это, и это сработало:

(Get-Content CarriageReturnTest.txt -Raw) -replace('\r\|','|') | Set-Content CarriageReturnTest.txt -Force

-replace позволяет мне использовать регулярное выражение в одинарных кавычках '\r' вместо "`r" в двойном, что помешало мне убежать

...