【问题标题】:Powershell move-item access deniedPowershell移动项目访问被拒绝
【发布时间】:2017-03-22 05:17:47
【问题描述】:

使用按钮运行 PS 表单。按钮按下做一些事情然后调用一个模块。我需要使用模块将文件夹从 D:\FolderName01\MyFolderName 移动到 D:\FolderName02。

我以管理员身份登录。服务器 2012-R2

当通过按下按钮调用代码并运行自动化脚本时,代码确实运行。

确实在我编辑代码时运行没有问题,我突出显示它并使用“运行选择”。

这实际上是整个模块。什么都没有做。

代码:

 function MoveTheFolder($VariableName){

    if ( -not (Test-Path "D:\FolderName02") ) {
       md "D:\FolderName02"}

    cd -Path d:\
    Move-Item -Path "D:\FolderName01\$VariableName" -Destination "D:\FolderName02" -Force

 }

FolderName02 的创建没有问题。 $VariableName 被传递到模块中,并且根据断点分析和实际错误消息是正确的。原始路径是 DVD 驱动器(F: 上的 .iso 文件)。

给出的错误是

move-item: Access to the path '[D:\FolderName01\$VariableName]' is denied.

我可以使用 Windows 资源管理器手动移动文件夹,因此它们似乎不会与打开的应用程序绑定。

【问题讨论】:

  • 如果启用 UAC,脚本是否“以管理员身份运行”?您可以将带有变量的路径写入控制台或消息框以确保其正确处理路径吗?
  • 出于好奇,如果您使用COPY 而不是move-item,目录会被复制到目的地吗?
  • @TessellatingHeckler 他没有从 DVD 中移出。 DVD 是 F:\ 而不是 D:\,对吧?
  • @Nate - 复制确实有效,但有 20GB 以上的数据。复制需要几分钟,而移动是即时的。 D:\ 驱动器位于 HD 上。该脚本正在从 F:\ 驱动器运行。 ssaviers - 我已经确认变量在 move-item 调用之前的断点处是正确的。变量名也在实际的错误消息中。
  • UAC 在注册表中被禁用(EnableLUA = 0)

标签: powershell move


【解决方案1】:

PowerShell 2.0 您需要在复制之前创建目录。

在 PowerShell 3.0 中,您不需要创建,因为 Move-Item 或 Copy-Item 将为您创建。

就获取文件而言。我们可以使用Get-ChildItem-Recurse 开关,因为它会抓取第一个目录中的所有文件,包括子文件夹。获取文件和文件夹后,我们将其通过管道传输到 Move-Item,并带有选项 -Force。请注意,Move-Item 会将文件移动到新目录。如果这是您想要的,那么我们需要使用Copy-Item。我还添加了-Verbose 开关进行调试。让我们知道哪些文件不起作用。

Function MoveTheFolder($VariableName){
if ( -not (Test-Path "D:\FolderName02") ) {New-Item "D:\FolderName02\$VariableName" -Type Directory}
        cd D:\ #You do not need this, but its ok. 
Get-ChildItem -Path "D:\FolderName01\$VariableName\*" -Recurse | Move-Item -Destination "D:\FolderName02\$VariableName" -Force -Verbose
Get-ChildItem -Path "D:\FolderName01\$VariableName\*" -Recurse | Copy-Item -Destination "D:\FolderName02\$VariableName" -Force -Verbose
        }

让我知道这是否有效。

【讨论】:

  • 如果 D:\Folder02 不存在,它就不会生成它,所以我需要保留该检查。其余的工作,但还没有正确。 $VariableName 中的文件是从它们各自的子文件夹中提取出来的,并放在 D:\Folder02\$VariableName 的根目录下。我需要将整个 $VariableName 文件夹从 Folder01 移到 Folder02。而且 Folder01 中还有很多其他文件夹不应该移动。
  • 那是我的错,当时不知道它不适用于 PowerShell V2.0。我现在的理解是目录 Folder1 有很多子文件夹。我们只需要等于 $VariableName 的目录。然后,您希望 FolderName02 将文件放入另一个文件夹名称 $VariableName。我已经更新了代码。
【解决方案2】:

所以 Zach 的解决方案虽然不完全正确,但确实让我得到了实际答案。这是工作代码:

Function MoveTheFolder($VariableName){
    if ( -not (Test-Path "D:\FolderName02") ) {
        New-Item "D:\FolderName02\$VariableName" -Type Directory
    }
    Get-ChildItem -Path "D:\FolderName01\$VariableName\" | Move-Item -Destination "D:\FolderName02\$VariableName" -Force
    Remove-Item -Path "D:\Folder01\$VariableName" -Force
}

去掉了通配符和-recurse,因为我想要的只是文件夹名称,不需要枚举其中的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2017-10-25
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多