VBS中复制文件时出现“Permission denied”错误

40

我想自动将一个文件推送到我的用户主目录中,但是却遇到了"Permission Denied"错误 —— 在这里的第6行引发了CopyFile调用。

脚本的其他部分(未显示)使用相同的源和目标目录创建并复制文件夹内容,它们工作得很完美。只有在使用CopyFile时才会失败。

Dim fso

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists("H:\Minecraft\.minecraft\options.txt") Then
    fso.CopyFile "C:\Minecraft\options.txt", "H:\Minecraft\.minecraft\"
End If

Set fso = Nothing

H: 是一个网络家目录,当前用户拥有完整的读写权限。

我尝试过从路径中添加/删除尾部斜杠,向目标路径添加"options.txt",删除false参数...不确定还能尝试什么。有什么想法吗?

顺便提一下,上述容易出错的代码块之前紧接着的这段代码每次执行都完美无误:

If Not fso.FolderExists("H:\Minecraft\.minecraft\bin\") Then
    If Not fso.FolderExists("H:\Minecraft\.minecraft\") Then
        fso.CreateFolder("H:\Minecraft\.minecraft\")
    End If
    fso.GetFolder("C:\Minecraft\bin\").Copy "H:\Minecraft\.minecraft\"
End If
8个回答

120

我只在以下三种情况下见过使用 CopyFile 失败并报告“拒绝访问”错误:

  • 实际上,源文件或目标文件夹存在权限问题。
  • 目标路径是一个文件夹,但是没有以反斜杠结尾。
  • 源文件正在被某个应用程序锁定。

1
所以这绝对不是#2,可能也不是#3... 目标文件夹的权限没问题,因为我可以复制其他文件。我该如何检查/修复源文件夹的权限?(也就是说,为了允许文件复制,它们需要什么权限?只需读取权限,对吗?它已经有了...) - Triz
1
删除了文本文件,重新创建了它,现在脚本可以工作了。所以可能是一些我看不到的奇怪权限问题。感谢您帮助缩小了范围! - Triz
32
目标路径是一个文件夹,但缺少尾部反斜杠。 - Matt Hanson
4
这对我来说也是第二个项目。 - Bek
没有冒犯之意,我也同意有时编写VBScript可能会非常令人沮丧(例如当涉及到圆括号的不同含义时)。 - Ansgar Wiechers
显示剩余3条评论

6

对我来说,在文件夹位置末尾添加 / 即可解决问题。因此,如果您将其复制到文件夹中,请不要忘记添加 /


1

根据您的源变量 (sourcePath = "C:\Minecraft\bin\"),我怀疑您的硬编码指向了错误的位置。

fso.CopyFile "C:\Minecraft\options.txt", destinationPath, false

应该是

fso.CopyFile "C:\Minecraft\bin\options.txt", destinationPath

或者

fso.CopyFile sourcePath & "options.txt", destinationPath

啊,抱歉,你说得没错,但实际上并不是错误的。我在脚本的另一个部分使用了那个\bin路径;options.txt文件确实位于C:\Minecraft\options.txt。 - Triz
把以下與程式設計相關的內容從英文翻譯成中文,僅返回經過翻譯的文字。 - Triz
错误的源路径会产生一个“文件未找到”的错误。 - Ansgar Wiechers

1
你可以做这个:
fso.CopyFile "C:\Minecraft\options.txt", "H:\Minecraft\.minecraft\options.txt"

将文件名包含在您复制到的文件夹中。


1
另一个需要检查的事情是是否有任何应用程序仍在占用该文件。我在使用MoveFile时遇到了一些问题。我的权限问题的一部分是,我的脚本打开文件(在这种情况下是Excel),进行修改,关闭它,然后将其移动到“已处理”文件夹中。在调试一些东西时,脚本崩溃了几次。当我深入研究权限被拒绝的错误时,我发现我有4个Excel实例在后台运行,因为由于崩溃,脚本无法正确终止应用程序。显然其中一个仍在占用该文件,因此出现“权限被拒绝”的错误。

0

我已经阅读了你的问题,而且我曾经遇到过同样的问题。但是在我做了一些更改之后,我的问题“权限被拒绝”得到了解决。

Private Sub Addi_Click()
'On Error Resume Next
'call ds
browsers ("false")
Call makeAdir
ffgg = "C:\Users\Backups\user\" & User & "1\data\"
Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.Getfolder("c:\users\Backups\user\" & User & "1\data")
    f.Attributes = 0
Set fso = VBA.CreateObject("Scripting.FileSystemObject")
Call fso.Copyfile(filetarget, ffgg, True)

看一下这个代码:ffgg = "C:\Users\Backups\user\" & User & "1\data\",在我修改之前是这样的:ffgg = "C:\Users\Backups\user\" & User & "1\data" 当我在"\data\"后面添加反斜杠时,我的问题得到了解决。尝试添加反斜杠,也许可以解决你的问题。祝你好运。


0

你的防病毒软件可能会阻止脚本的运行。我曾经遇到过 AVG 防病毒软件在静默模式下运行时(这意味着它不会提示您每个保护步骤,因此您会遇到权限错误,而不知道 AVG 正在阻止操作),出现了这种情况。

在我的情况下,我打开了详细模式(关闭了静默模式),执行了脚本,AVG 弹出了拦截警告,让我训练 AVG 允许该脚本运行。


0

值得检查任务管理器是否有任何卡住的wscript.exe任务。 这可能是其中一个阻止访问文件的原因。


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