Как избежать ошибки «Вы не можете вызвать метод с нулевым выражением», если файл может быть пустым? - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу открыть файл, заменить некоторое содержимое и добавить в другой файл.Я написал скрипт Powershell:

(Get-Content file.txt).replace("abc", "def") | Add-Content other.txt

Это прекрасно работает, если file.txt не пуст.Затем выдается ошибка

Вы не можете вызвать метод для выражения с нулевым значением.

Почему выдается эта ошибка?И как мне избежать этого?

Я ожидал, что при открытии пустого файла будет возвращено пустое значение, а не ноль, как это было бы в Unix

cat file.txt | sed -r s/abc/def/g >> other.txt

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018
$path = "\test.txt"
$path2 = "\test2.txt"

try{
    $content = (Get-Content $path).replace("abc", "def") | Add-Content $path2
    Write-Host "Successfully added content" -ForegroundColor Green
}catch{
    if(!$content){
        Write-Host "$path is empty" -ForegroundColor Yellow
    }else{
        throw $_
    }
}

Я думаю, что вы всегда должны работать с try / catch при запуске командлетов ..

Надеюсь, это поможет

0 голосов
/ 21 ноября 2018

Используйте оператор -Replace PowerShell вместо метода Replace для возвращенного String (равным нулю для пустого файла).

(Get-Content file.txt) -Replace "abc", "def" | Add-Content other.txt
0 голосов
/ 21 ноября 2018

Сделайте снимок:

(Get-Content file.txt).replace("abc", "def") | Add-Content other.txt -erroraction SilentlyContinue

Существуют и другие варианты для типа erroraction, поэтому просто используйте завершение табуляции, чтобы просмотреть их и проверить, если SilentlyContinue не выполняет то, что вы ищетеfor!

РЕДАКТИРОВАТЬ: Если вам нужно знать, что что-то не удалось, потому что это пусто, пожалуйста, посмотрите ответ Бернарда.В противном случае этот лайнер также должен работать, все зависит от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...