PowerShell移动项目访问被拒绝。

4

使用按钮运行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)已启用,脚本是否以“管理员身份运行”?您能否将带有变量的路径写出到控制台或消息框中,以确保正确处理路径? - ATek
@TessellatingHeckler 他没有从 DVD 上移动。DVD 是 F:\ 而不是 D:\,对吗? - Nate
为了确保不是权限问题,您想尝试将$VariableName的父文件夹设置为“EVERYONE”以便其子项拥有完全访问权限吗?或者如果您正在使用ISE,请关闭并以管理员身份重新打开它?如果您可以通过explorer.exe移动它但无法通过脚本移动它,那么仍然听起来像是权限问题。 - Nate
马特 - 是的,我一开始措辞不当。错误并没有涉及到变量名,而是它的实际值。此外,Folder01始终存在于系统构建中;它是设计的一部分,路径是正确的。 - JoeBlow
Nate - 已添加完全控制的所有人,仍然不行。相同的错误。 - JoeBlow
显示剩余5条评论
2个回答

1

虽然 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,因为我只想要文件夹名称,不需要枚举其中的文件。

1

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

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

至于获取文件。我们可以使用带有开关-Recurse的Get-ChildItem,因为它会抓取第一个目录中包括子文件夹的所有文件。一旦我们获取了文件和文件夹,我们将其管道传输到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中还有许多其他不应该被移动的文件夹。 - JoeBlow
那是我的错,当时不知道它不适用于PowerShell V2.0。我现在的理解是目录Folder1有很多子文件夹,我们只想要等于$VariableName的目录。然后你希望FolderName02将文件放入另一个文件夹名称$VariableName中。 我已更新代码。 - Zach Olinske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接