使用按钮运行PS表单。按下按钮会执行某些操作然后调用模块。我需要使用模块将文件夹从D:\ FolderName01 \ MyFolderName移动到D:\ FolderName02。
我以管理员身份登录。 Server 2012-R2
当按下按钮并且自动脚本运行时,代码会运行 NOT 。
DOES 在编辑代码时运行没有问题,我突出显示它并使用"运行选择"。
这就是整个模块。没有其他事情要做。
代码:
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资源管理器手动移动文件夹,因此它们似乎与打开的应用程序无关。
答案 0 :(得分: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
}
让我知道这是否有效。
答案 1 :(得分: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,因为我想要的只是文件夹名,不需要枚举其中的文件。