当前位置: 首页 > 知识库问答 >
问题:

用VBScript的FSO对象 /saveicacls读取结果失败

丌官炎彬
2023-03-14

我需要保存运行ICACLS命令的结果,更改它们,并将更改后的权限恢复回来。我使用vbcript来做到这一点。问题是,从保存的数据中读取行或整个数据会给我一个字符和一堆空格。但是如果我尝试读取结果数据的内容,由ICACLS上传,逐个字符,并动态打印,它会显示正确的内容。

Const ForReading=1 'I/O modes
dim FolderToSetPermissions,ShellObj,FSO,EffectivePermissionsFile,CurrentLine,ParentFolderName,ParentFolderObj
FolderToSetPermissions="c:\test"
Set FSO = CreateObject("Scripting.FileSystemObject")
ParentFolderName=FSO.GetParentFolderName(wscript.ScriptFullName)
Set ParentFolderObj =fso.GetFolder(ParentFolderName)    
Set ShellObj = WScript.CreateObject("WScript.Shell")
ShellObj.run "icacls.exe """&FolderToSetPermissions&"""\* /save " & ParentFolderObj.path & "\EffectivePermissions.txt /t", 0, True
set EffectivePermissionsFile =FSO.OpenTextFile(ParentFolderObj.path & "\EffectivePermissions.txt",ForReading,False)
Do Until EffectivePermissionsFile.AtEndOfStream
'CurrentLine=EffectivePermissionsFile.Read(1) ' works fine if prints right after 
 'reading from file. Concatenating all the chars in file causes the same result as 
 'reading the file by lines or with .ReadAll function of FSO
 CurrentLine= EffectivePermissionsFile.ReadLine
 WScript.Echo CurrentLine
Loop
EffectivePermissionsFile.Close

我怀疑,问题出在ICACLS本身:它不写一个真正的文本文件。我找到了另一个遇到这种情况的人(https://windowssecrets.com/forums/showthread.php/150866-Win7-ICACLS-redirected-output-and-NOTEPAD-don-t-play-well-together)。

P. S: CACLS写入正确的文本文件,读取时没有问题。但不幸的是,它不能在整个文件夹中进行递归。

共有1个答案

柯新翰
2023-03-14

读了几百页,我终于找到了解决办法!此函数转换由icacls创建的文本

Sub UTFConvert(filename)
  Set fso = CreateObject("Scripting.FileSystemObject")
  txt = fso.OpenTextFile(filename, 1, False, -1).ReadAll

  Set stream = CreateObject("ADODB.Stream")
  stream.Open
  stream.Type     = 2 'text
  stream.Position = 0
  stream.Charset  = "utf-8"
  stream.WriteText txt
  stream.SaveToFile filename, 2
  stream.Close
End Sub

随后,生成的文本将使用VBScript变得可读。

从这里得到答案: UCS-2小端到UTF-8转换会留下带有许多不需要的字符的文件

 类似资料:
  • 获取查询对象的结果集 // 查询邮箱或密码是否正确 async checkEmailAndPassword(loginData) { // 解构查询对象中的结果 const { dataValues: {id,username,password,email} } = await this.ctx.model.User.findOne({

  • 本文向大家介绍VBS基础篇 - vbscript TextStream对象,包括了VBS基础篇 - vbscript TextStream对象的使用技巧和注意事项,需要的朋友参考一下 TextStream对象是用于访问文本文件的对象,它是FileSystemObject一个独立的附属对象,但在使用TextStream对象时,我们仍要借助FileSystemObject 对象或其附属对象来创建一个

  • 问题内容: 好的,所以我试图从Wikidata中获取有关电影的信息,以以下电影为例: https //www.wikidata.org/wiki/Q24871 在页面上,数据清楚地以可读格式显示,但是当您尝试通过API提取数据时,会得到以下信息:https : //www.wikidata.org/w/api.php?action=wbgetentities&ids=Q24871 这是其中的一部分

  • 我正在使用和Web API来执行某些任务,当任务完成时,API会在OK方法中返回一个对象。 代码: 如何在响应中获取此 blob 对象,我认为,这应该是 IHttp 操作结果? 任何帮助是值得赞赏的!

  • 我有一个cucumber框架,数据按预期发送,但结果没有被正确读取。我怀疑是因为答案没有出现在计算器的文本框中: org.junit.比较失败:预期:3实际:0 功能文件功能:谷歌计算器应该计算正确的计算 场景概述:添加数字鉴于我在谷歌计算器页面上,当我将数字“”添加到数字“”时,我应该会得到一个答案“” 场景大纲:减去数字给定我在谷歌计算器页面当我减去数字“”到数字“”然后我应该得到“”的答案

  • 问题内容: 我正在使用以下代码来尝试使用读取Linux中命令的结果。 此代码是给我一个“内存错误”与“2”的退出状态,所以我可以看到 哪里 它的失败,我只是不明白 为什么 。 我将它们与在Ubuntu论坛和C ++参考 上找到的示例代码放在一起,所以我不喜欢它。如果有人可以建议一种更好的方式来读取system()调用的结果,那么我可以接受新的想法。 编辑原文: 好的,现在是负面的,现在我明白为什么