2016-02-19 241 views
2

我试图用PowerShell使用technique outlined in another SO question将文件的格式转换为UTF-8。Powershell - WriteAllLines方法 - '访问被拒绝'

我使用下面的语句:

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

第一个参数是文件路径(C:\用户\ rsax \文件\测试),第二个参数是文件的名称。

但是,该命令不能正常工作,并返回以下错误:

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中运行命令为管理员。
  • 我已验证该文件在文件夹中。
  • 我可以运行在访问该文件的目录其他cmdlet,例如 如:

    获取内容的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