首页 文章

从VBScript写入文件时出现随机“权限被拒绝”错误

提问于
浏览
-1

这是我第一次在stackoverflow上发帖 . 我一直在这个网站上找到有用的答案,但这一次,我找不到这个问题的帮助 .

一般情况

我编写了一个由调度程序软件执行的脚本(S:\ Universe_bo \ prod \ batch \ BO * .wsf)中包含的VBScript Toolkit脚本(S:\ Universe_bo \ prod \ batch \ BO \ libs \ PXI_Toolkit.vbs) .

该系统是Windows Server 2003服务器(此服务器是主动 - 被动Windows群集的一部分,S:驱动器是此群集的资源) . 运行脚本的Windows用户具有在目录中写入的权限,并且是管理员 .

在脚本中,我打开一个新文件并在其中写入一些文本(它是电子邮件的内容) .

问题

这是发生了什么(今天,它在10次中失败了7次):

(---)[24/03/2012 10:34:23] Ouverture du fichier [S:\ universe_bo \ prod \ data \ email_rad98038.tmp] S:\ universe_bo \ prod \ batch \ BO \ BOLANC_BOAPP500_TOP100.wsf( 2451,8)Erreurd'exécutionMicrosoftVBScript:Permissionrefusée

这意味着“运行时错误Microsoft VBScript:权限被拒绝” .

脚本中的第2451行如下:

Set objFichier = fso.OpenTextFile(_
      pvstrNomFichierCorpsEmail, _
      ForWriting, _
      True)

我们已经在测试服务器(不是集群)上使用它们两年没有问题,但现在它最终通过 生产环境 ,它不能一直工作 .

我不知道问题是什么,我全都耳朵,并会采取任何建议 .

提前致谢 .

纪尧姆

源脚本

.wsf脚本

.wsf脚本如下所示:(我删除了不相关的部分,因为我们的注释是法语的)

'===============================================================================
' BOLANC_BOAPP500_TOP100.wsf (script)
'===============================================================================
<job><?job debug="true"?>
<script language="VBScript" src="libs/PXI_Toolkit.vbs"/>
<script language="VBScript">
Dim codeRetour ' Le code retour du script
codeRetour = 0 ' est initialisé à 0 (tout va bien)

' [...]
' Irrelevant stuff
' [...]

' Exécuter le rapport
codeRetour = rapport.Executer


LibererRessources
Wscript.Quit codeRetour
</script>
</job>

工具包脚本

以下是PXI_Toolkit.vbs脚本的相关部分:

Option Explicit
'===============================================================================
' PXI_Toolkit.vbs (script)
'===============================================================================


'*******************************************************************************
' fso (objet)
'       Scripting.FileSystemObject
'*******************************************************************************
dim fso
set fso = CreateObject("Scripting.FileSystemObject")

'*******************************************************************************
' Constantes pour l'ouverture des fichiers
'*******************************************************************************
Private Const ForReading = 1 ' Ouvre un fichier en lecture seule. 
Private Const ForWriting = 2 ' Ouvre un fichier en écriture.
Private Const ForAppending = 8 ' Ouvre un fichier et permet l'écriture à la fin
                               ' du fichier.

'*******************************************************************************
' WshShell (objet)
'       Objet Permettant d'accéder aux fonctionnalités systèmes Windows.
'*******************************************************************************
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")

'*******************************************************************************
' WshSysEnv (tableau de chaînes)
'       Tableau contenant les variables d'environnements. WshSysEnv est indexé
'       par le nom des variables qu'il contient.                            
'       Exemple : Ecrire "Utilisateur="& WshSysEnv("USERNAME")
'*******************************************************************************
Dim WshSysEnv
Set WshSysEnv = WshShell.Environment("Process")

' Lots of stuff

'*******************************************************************************
' EcrireErr (procédure)
'       Affiche un message d'erreur.
'
' Paramètres :
' - pstrMessage (chaîne)
'       Message d'erreur à afficher.
'*******************************************************************************
Sub EcrireErr(pstrMessage)
  WScript.stdErr.WriteLine "(!!!) ["& Now &"] "& Cstr(pstrMessage)
End Sub ' EcrireErr

'*******************************************************************************
' EcrireLog (procédure)
'       Journalise un message dans les logs.
'
' Paramètres :
' - pstrChaine (chaîne)
'       Texte à journaliser.
'*******************************************************************************
Sub EcrireLog(pstrChaine)
  Ecrire "(---) ["& Now &"] "& Cstr(pstrChaine)
End Sub ' EcrireLog

'*******************************************************************************
' LibererRessources (procédure) 
'       Libère les ressources potentiellement ouvertes au cours de l'exécution
'       des fonctions de ce script.
'
' Paramètres : Aucun
'*******************************************************************************
Sub LibererRessources()
  EcrireLog "LibererRessources"

  ' Libérer les variables système
  Set WshArguments = Nothing
  Set WshSysEnv = Nothing
  Set WshShell = Nothing
  Set fso = Nothing
End Sub ' LibererRessources

Class ClsRapportBO
  Private pvarrstrMessageEmail pvstrNomFichierCorpsEmail

  Public Function Executer()
    ' Ecriture du fichier contenant le corps du mail
    If Not IsEmpty(pvarrstrMessageEmail) Then
      Dim objFichier, strLigne

      EcrireLog "Ouverture du fichier ["& pvstrNomFichierCorpsEmail &"]"
      Set objFichier = fso.OpenTextFile(_
          pvstrNomFichierCorpsEmail, _
          ForWriting, _
          True)

      ' Ecriture de l'en-tête du message
      objFichier.WriteLine "Bonjour"
      objFichier.WriteLine

      ' Lecture des éléments du tableau construire le fichier
      For Each strLigne In pvarrstrMessageEmail
        objFichier.WriteLine strLigne
      Next

      ' Ecriture du pied de page
      objFichier.WriteLine 
      objFichier.WriteLine "NB : Ce message est envoyé automatiquement. "&_
                           "Merci de ne pas y répondre."

      objFichier.Close
    End If

    ' More stuff

    If Not IsEmpty(pvarrstrMessageEmail) And fso.FileExists(pvstrNomFichierCorpsEmail) Then
      EcrireLog "Suppression du fichier ["& pvstrNomFichierCorpsEmail &"]"
      fso.DeleteFile(pvstrNomFichierCorpsEmail)
    End If
  End Function ' Executer
End Class ' ClsRapportBO

Function CreerRapportBO(pstrChemin, parrstrInvites, pstrToken)
  Dim objRapport

  Set objRapport = new ClsRapportBO
  ' ...
  Set CreerRapportBO = objRapport
End Function ' CreerRapportBO

' Tests de la boîte à outils
Sub TestsUnitaires()
  ' Unit tests...
End Sub ' TestsUnitaires

1 回答

  • 0

    “S:\ universe_bo \ prod \ data \ email_rad98038.tmp”是由脚本创建的文件,还是由其他进程创建的文件?此问题的一个可能原因是该文件正在使用中 . 你可以用以下内容包装语句:

    On Error Resume Next
    Set objFichier = fso.OpenTextFile(_
      pvstrNomFichierCorpsEmail, _
      ForWriting, _
      True)
    On Error GoTo 0
    
    If Not IsObject(objFichier) Then
    ...
    More Logic Here
    ...
    End If
    

相关问题