无法使用[System.IO.File] :: Copy编辑复制到不同文件夹中的文件

时间:2014-09-13 06:44:05

标签: .net powershell

我正在使用Powershell v3.0对文件执行不同的操作,而且这种情况让我感到困惑。

我有2个文件夹:
C:\ TMP1
C:\ TMP2

在文件夹C:\ Tmp1中,我有一个文件MyFile1.csv。我用Notepad ++手动打开这个文件,点击Enter,点击退格,保存文件。一切都很好。

我运行以下脚本,将原始文件的副本从Tmp1复制到Tmp2:

set-location -Path C:\Tmp1
$FileOld = (Get-Location).Path + "\MyFile1.csv"
set-location -Path C:\Tmp2
$FileNew = (Get-Location).Path + "\MyFile1.csv"

[System.IO.File]::Copy($FileOld, $FileNew)
[System.IO.File]::Close

然后我使用notepad ++,Enter,Backspace,Save打开C:\ Tmp2 \ MyFile1.csv,我收到一条消息告诉我确保该文件没有用其他程序打开。因此我无法修改此文件的副本,因为我无法保存它。即使在关闭PowerShell之后我也尝试过。但我可以删除该文件。

现在,如果我使用以下脚本将原始文件复制到同一原始文件夹中的其他文件中:

set-location -Path C:\Tmp1
$FileOld = (Get-Location).Path + "\MyFile1.csv"
$FileNew = (Get-Location).Path + "\MyFile2.csv"

[System.IO.File]::Copy($FileOld, $FileNew)
[System.IO.File]::Close

然后我可以用Notepad ++,Enter,Backspace,Save编辑MyFile2.csv,它可以保存文件。

为什么我不能使用[System.Io.File] :: Copy复制和编辑从一个文件夹复制到另一个文件夹的文件?

我如何解决此问题,因为我不想操纵原始文件夹中的原始文件?

编辑:我尝试过使用powershell命令Copy-Item $ FileOld $ FileNew,我遇到了同样的问题。所以它没有链接到[System.IO.File] :: Copy方法。但我的问题仍然存在。

编辑2 :我通过运行以下脚本找到了解决方法:

set-location -Path C:\Tmp1
$FileOld = (Get-Location).Path + "\MyFile1.csv"
$FileNew = (Get-Location).Path + "\MyFile2.csv"
Copy-Item $FileOld $FileNew

set-location -Path C:\Tmp2
$FileAgn = (Get-Location).Path + "\MyFile1.csv"
Move-Item $FileNew $FileAgn

使用此脚本,我可以使用Notepad ++,Enter,Backspace,Save打开,没有任何问题。

任何类型的副本到另一个文件夹似乎都不会释放新复制的文件。

1 个答案:

答案 0 :(得分:1)

听起来很像权限问题(可能由Copy-Item复制而不是::Copy或类似的东西) - 因为一旦ISE关闭,文件就无法打开。 powershell流程无法在文件关闭后保持打开状态(除了某些情况 - 见下文),所以我怀疑这是实际问题。

此外,我在上一份工作中管理过一次,创建了一个文件夹,我没有任何编辑文件的权限,但我可以自由删除它们 - 这听起来和你的情况完全一样。

  1. 为了确保powershell实际上没有以某种方式保存文件,请确保在退出PowerShell和/或ISE之后,它们中的任何一个似乎都没有在任务管理器中运行。具体来说,确保没有任何进程由脚本启动并给出指向此文件的指针并且仍在运行
  2. 检查实际文件权限(右键单击文件,转到属性)并确保为用户设置了写入/修改标志(直接或通过组权限)。还要确保文件没有设置只读标志
  3. 再次从powershell返回,尝试在文件上使用File::OpenWrite并查看您获得的异常 - 这将比Notepad ++提供的更详细