2016-02-19 4 views
2

Я пытаюсь преобразовать формат файла в UTF-8 с помощью PowerShell, используя technique outlined in another SO question.Метод Powershell - WriteAllLines - «Доступ запрещен»

Я использую следующее заявление:

[IO.File]::WriteAllLines((Get-Item -Path ".\" -Verbose).FullName,"Test.txt") 

Первым параметром является путь к файлу (C: \ Пользователи \ rsax \ документы \ Test), а второй параметр является именем файла.

Однако команда не работает, и возвращает следующее сообщение об ошибке:

Exception calling "WriteAllLines" with "2" argument(s): "Access to the path 'C:\users\rsax\documents\Test' is denied." 
At line:1 char:25 
+ [IO.File]::WriteAllLines <<<< ((Get-Item -Path ".\" -Verbose).FullName,"Test.txt") 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 
  • Я бегу команду из PowerShell в качестве администратора.
  • Я проверил, что файл находится в папке.
  • я могу запускать другие командлеты в каталоге, доступ к файлу, такие как:

    Get-Content Test.txt | Out-File TestOut.txt

  • Я не смог найти ответ на MSDN MethodInvocationException page.

Что я делаю неправильно?

+0

Первый аргумент должен быть полный путь, а не только каталог. Второй аргумент - это исходное содержимое. – TheMadTechnician

ответ

4

Я не уверен, что вы понимаете перегрузку, которую используете. Первым аргументом считается путь к файлу, а второй - это содержимое (а не имя файла). (Get-Item -Path ".\" -Verbose).FullName будет путь к папке, а не файлу. Кроме того, переключатель -Verbose не требуется.

PS> [IO.File]::WriteAllLines.OverloadDefinitions 
static void WriteAllLines(string path, string[] contents) 

Пример:

$content = Get-Content .\Test.txt 
$outfile = Join-Path (Get-Item -Path ".\Test.txt").DirectoryName "TestOut.txt" 
[IO.File]::WriteAllLines($outfile, $content) 
+1

Вы правы - я не понял перегрузки. Спасибо за решение - он работал отлично. – RSax

2

WriteAllLines берет полный путь к файлу, а затем строки текста для записи. Не разделяйте части файла. Также обратите внимание, что вы не говорите , что вообще написать.

$content = 'a','b','c' 
$path = (Get-Item -Path ".\" -Verbose).FullName | Join-Path -ChildPath 'Test.txt' 
[IO.File]::WriteAllLines($path,$content) 
+0

'Get-Item -Path". \ Test.txt "' не удастся, если файл еще не существует. – PetSerAl

+0

@PetSerAl хороший пункт, фиксированный. – briantist

Смежные вопросы