web-dev-qa-db-ja.com

VBSのCopyFileで許可が拒否されました

ファイルをユーザーのホームディレクトリにプッシュすることを自動化しようとしていますが、CopyPermission呼び出しで、ここで6行目にスローされた「Permission Denied」エラーでスタックしています。

同じソースディレクトリと宛先ディレクトリを使用してフォルダコンテンツを作成およびコピーするスクリプトの他の部分(図示せず)があり、完全に機能します。失敗するのは、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
27
Triz

次の3つのシナリオのいずれかで CopyFile が「permission denied」エラーで失敗するのを見たことがあるだけです。

  • 発信元または宛先の実際の許可の問題。
  • 宛先パスはフォルダーですが、末尾のバックスラッシュはありません。
  • ソースファイルはアプリケーションによってロックされています。
86
Ansgar Wiechers

私にとっては、/を追加すると、フォルダの場所の最後で機能しました。したがって、フォルダにコピーする場合は、/を忘れずに入れてください

3

もう1つ確認すべきことは、アプリケーションがまだファイルを保持しているかどうかです。

MoveFileにいくつかの問題がありました。権限の問題の一部は、スクリプトがファイル(この場合はExcel)を開き、変更を加えて閉じ、それを「処理済み」フォルダーに移動することでした。

いくつかのことをデバッグする際に、スクリプトが数回クラッシュしました。許可拒否エラーを詳しく調べると、クラッシュが原因でスクリプトがアプリケーションを適切に終了できなかったため、バックグラウンドでExcelの4つのインスタンスが実行されていることがわかりました。どうやら、そのうちの1人はまだファイルを保持していたため、「許可が拒否されました」。

1
CargoPantsMan

ソース変数(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
0
Dave

私にとって、MoveFolder呼び出しの10回のうち7〜9回しか成功していませんでした。さらに、テストを再実行するたびに、別のフォルダーが失敗します。

パスにバックスラッシュがあったので、それは私の問題ではありませんでした。

フォルダー内の開いているすべてのExcelファイルを閉じていたので、それは問題ではありませんでした。

そこで、WorkBook.CloseとFSO.MoveFolderの呼び出しの間にDoEventsとApplication.Wait(DateAdd( "S"、1#、now))を配置して、問題を解決しようとしました。

これにより状況は改善されましたが、それでも完璧ではありませんでした。

これを修正するために行ったのは、動作するまでmove move呼び出しをループに入れることでした。これは通常、最初の呼び出しで、場合によっては2回目の呼び出しで行われます。私はフォースムーブループの10回の試行すべてに失敗するのを見たことはありません!

隠された非同期関数の世界では、すべてのレベルで実際に終了するまで少し時間をかける必要があります!

0
user2715390

あなたはこれを行うことができます:

fso.CopyFile "C:\Minecraft\options.txt", "H:\Minecraft\.minecraft\options.txt"

コピー先のフォルダーにファイル名を含めます。

0
Tanner Clark

私はあなたの問題を読みました、そして私は同じ問題を抱えていました。しかし、私がいくつかを変更した後、私の問題「Permission Denied」は解決されました。

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
HzzKyGcs