Powershell Get-Content внезапно провалился - PullRequest
0 голосов
/ 04 февраля 2019

У меня довольно простой скрипт PS, который работал отлично, а теперь неожиданно начал выдавать ошибки.Я сузил проблемную часть до пары операторов Get-Content.Вот как выглядит уязвимая часть скрипта:

$pathSource = "D:\FileDirectory"
Set-Location -Path $pathSource
Get-Content -Encoding UTF8 -Path FilesA*.txt | Out-File -Encoding ASCII FilesA_Digest.txt
Get-Content -Encoding UTF8 -Path FilesB*.txt | Out-File -Encoding ASCII FilesB_Digest.txt

Эта часть скрипта собирает коллекцию файлов с одинаковыми именами и объединяет их в один текстовый файл для загрузки на FTP-сайт.Требуется Get-Content / Out-File, поскольку исходные файлы неправильно закодированы для FTP-сайта.Сценарий работал отлично, один раз каждую ночь в течение нескольких недель.Теперь при получении инструкций Get-Content появляется следующая ошибка:

Get-Content : A parameter cannot be found that matches parameter name 'Encoding'.
At D:\FileDirectory\Script.ps1

Среда - это Windows Server 2016. Я пробовал разные варианты параметров Get-Content, но ничего не помогло.Я знаю, что есть ошибка, которая влияет на диски, подключенные к сети, но здесь это не так - все файлы являются локальными.

Есть идеи / предложения?

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Кажется, проблема с командой out.Можете ли вы попробовать ниже код:

$pathSource = "D:\FileDirectory"
Set-Location -Path $pathSource
Get-Content -Encoding UTF8 -Path FilesA*.txt | Set-Content  -Encoding ASCII -path FilesA_Digest.txt
Get-Content -Encoding UTF8 -Path FilesB*.txt | Set-Content  -Encoding ASCII -path FilesB_Digest.txt
0 голосов
/ 05 февраля 2019

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

Я использую те же самые вызовы командлета Get-Content с параметром -Encodingи канал к Out-File со своим собственным параметром -Encoding.Я делаю те же действия, что и предыдущая версия скрипта.Единственная часть, которая существенно отличается, - это часть, которая выполняет передачу обработанных файлов по FTP.Сейчас я использую только PowerShell для выполнения передачи, а не CuteFTP, и все, похоже, работает правильно.

Спасибо всем, кто внес вклад.

Cheers Norm

0 голосов
/ 04 февраля 2019

Единственное правдоподобное объяснение, которое я могу придумать, состоит в том, что пользовательская команда *1003* Get-Content, в которой отсутствует параметр -Encoding, является затенение (переопределение) стандартным Get-Content cmdlet в сеансе PowerShell, в котором выполняется ваш сценарий.

Для демонстрации:

# Define a custom Get-Content command (function) that accepts only 
# a (positional) -Path parameter, not also -Encoding.
function Get-Content { [CmdletBinding()] param([string] $Path) }

# Now try to use Get-Content -Encoding
Get-Content -Encoding Utf8 FilesA*.txt

Вы увидите то же сообщение об ошибке, что и в вашем вопросе.

Используйте Get-Command Get-Content -All, чтобы увидеть все команды с именем Get-Content, с первой в списке командой ffective .

Затем проверьте, откуда могут поступать любые пользовательские команды;например, ваш $PROFILE сценарий может содержать один.

К исключить $PROFILE в качестве виновника , запустить PowerShell без загрузки сценария профиля и проверить Get-Content, затем:

powershell -noprofile  # Windows PowerShell
pwsh -noprofile        # PowerShell Core

A простой способ исключить пользовательские переопределения ad hoc заключается в вызове команды по ее квалифицированному имени модуля :

Microsoft.Powershell.Management\Get-Content ...

Вы можете определить имя источника встроенного командлета следующим образом:

PS> (Get-Command Get-Content -All)[-1].ModuleName
Microsoft.PowerShell.Management

В крайнем случае вы также можете сделать вывод имя исходного модуля из URL-адреса раздела справки :

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