如何修复VBscript中的列

时间:2021-11-16 09:13:29

I'm a beginner in VBscript and I got a script which obtains disk space usage of local drives. However, when some columns would contain long numeric value, some adjacent columns and even values are moving to the right and thus makes the output disorganized. I already

我是VBscript的初学者,我得到了一个获取本地驱动器磁盘空间使用的脚本。但是,当某些列包含长数值时,某些相邻列和偶数值将向右移动,从而使输出无组织。我已经

Please see below the contents of the script:

请看下面脚本的内容:

Option Explicit

const strComputer = "."
const strReport = "F:\dba_scripts\diskspace.txt"


Dim objWMIService, objItem, colItems
Dim strDriveType, strDiskSize, txt

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk WHERE DriveType=3")
txt = "DRIVE" & vbtab & vbtab & "SIZE" & vbtab & vbtab & "USED" & vbtab & vbtab & "FREE" & vbtab & vbtab & "FREE(%)" & vbcrlf
For Each objItem in colItems

    DIM pctFreeSpace,strFreeSpace,strusedSpace

    pctFreeSpace = INT((objItem.FreeSpace / objItem.Size) * 1000)/10
    strDiskSize = round((objItem.Size /1073741824),1) & " GB"
    strFreeSpace = round((objItem.FreeSpace /1073741824),1) & " GB"
    strUsedSpace = round(((objItem.Size-objItem.FreeSpace)/1073741824),1) & " GB"
    txt = txt & objItem.Name & vbtab & vbtab & strDiskSize & vbtab & vbtab & strUsedSpace & vbTab & vbtab & strFreeSpace & vbtab & vbtab & pctFreeSpace & vbcrlf

Next

writeTextFile txt,strReport
wscript.echo "Report written to " & strReport & vbcrlf & vbcrlf & txt

' Procedure to write output to a text file
private sub writeTextFile(byval txt,byval strTextFilePath)
    Dim objFSO,objTextFile

    set objFSO = createobject("Scripting.FileSystemObject")

    set objTextFile = objFSO.CreateTextFile(strTextFilePath)

    objTextFile.Write(txt)

    objTextFile.Close
    SET objTextFile = nothing
end sub

The output file looks OK but when I send/email it using the free bmail, the results are disorganized (meaning some columns and values moved to the right.

输出文件看起来不错,但是当我使用免费的bmail发送/发送电子邮件时,结果会混乱(意味着某些列和值会向右移动)。

My question is are there ways to make the columns and values results fixed ( meaning no columns and values are moving to the right )?

我的问题是有没有办法使列和值结果固定(意味着没有列和值向右移动)?

2 个解决方案

#1


Function RightJustified(ColumnValue, ColumnWidth)
   RightJustified = Space(ColumnWidth - Len(ColumnValue)) & ColumnValue
End Function

Usage example:

output = output & _
         RightJustified(strDiskSize, 15) & _
         RightJustified(strUsedSpace, 15) & _
         RightJustified(strFreeSpace, 15) & _
         RightJustified(pctFreeSpace, 15) & _
         vbCrLf

EDIT

Add the RightJustified function to your script.

将RightJustified函数添加到脚本中。

Then, replace this line of your code:

然后,替换以下代码行:

txt = txt & objItem.Name & vbtab & vbtab & strDiskSize & vbtab & vbtab & strUsedSpace & vbTab & vbtab & strFreeSpace & vbtab & vbtab & pctFreeSpace & vbcrlf

with:

txt = txt & objItem.Name & _
      RightJustified(strDiskSize, 15) & _
      RightJustified(strUsedSpace, 15) & _
      RightJustified(strFreeSpace, 15) & _
      RightJustified(pctFreeSpace, 15) & _
      vbCrLf

EDIT 2

I added the RightJustified function at the bottom of your script, and then called it within your loop to format the columns. I also used it on the column headers. Below is the script and at the bottom is the output on my machine.

我在脚本底部添加了RightJustified函数,然后在循环中调用它来格式化列。我也在列标题上使用它。下面是脚本,底部是我的机器上的输出。

Option Explicit

const strComputer = "."
const strReport = "F:\dba_scripts\diskspace.txt"


Dim objWMIService, objItem, colItems
Dim strDriveType, strDiskSize, txt

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk WHERE DriveType=3")

txt = RightJustified("DRIVE", 10) & _
      RightJustified("SIZE", 15) & _
      RightJustified("USED", 15) & _
      RightJustified("FREE", 15) & _
      RightJustified("FREE(%)", 15) & _
      vbCrLf

For Each objItem in colItems

    DIM pctFreeSpace,strFreeSpace,strusedSpace

    pctFreeSpace = INT((objItem.FreeSpace / objItem.Size) * 1000)/10
    strDiskSize = round((objItem.Size /1073741824),1) & " GB"
    strFreeSpace = round((objItem.FreeSpace /1073741824),1) & " GB"
    strUsedSpace = round(((objItem.Size-objItem.FreeSpace)/1073741824),1) & " GB"

    txt = txt & _
      RightJustified(objItem.Name, 10) & _
      RightJustified(strDiskSize, 15) & _
      RightJustified(strUsedSpace, 15) & _
      RightJustified(strFreeSpace, 15) & _
      RightJustified(pctFreeSpace, 15) & _
      vbCrLf
Next

writeTextFile txt,strReport
wscript.echo "Report written to " & strReport & vbcrlf & vbcrlf & txt

' Procedure to write output to a text file
Sub writeTextFile(byval txt,byval strTextFilePath)
    Dim objFSO,objTextFile
    set objFSO = createobject("Scripting.FileSystemObject")
    set objTextFile = objFSO.CreateTextFile(strTextFilePath)
    objTextFile.Write(txt)
    objTextFile.Close
    Set objTextFile = nothing
End Sub

Function RightJustified(ColumnValue, ColumnWidth)
   RightJustified = Space(ColumnWidth - Len(ColumnValue)) & ColumnValue
End Function

Output produced:

 DRIVE           SIZE           USED           FREE        FREE(%)
    C:        48.4 GB        40.6 GB         7.8 GB           16.1
    D:       100.6 GB        56.8 GB        43.8 GB           43.5

#2


You could write out a table using HTML. This should work in an email.

你可以用HTML写出一个表。这应该在电子邮件中工作。

#1


Function RightJustified(ColumnValue, ColumnWidth)
   RightJustified = Space(ColumnWidth - Len(ColumnValue)) & ColumnValue
End Function

Usage example:

output = output & _
         RightJustified(strDiskSize, 15) & _
         RightJustified(strUsedSpace, 15) & _
         RightJustified(strFreeSpace, 15) & _
         RightJustified(pctFreeSpace, 15) & _
         vbCrLf

EDIT

Add the RightJustified function to your script.

将RightJustified函数添加到脚本中。

Then, replace this line of your code:

然后,替换以下代码行:

txt = txt & objItem.Name & vbtab & vbtab & strDiskSize & vbtab & vbtab & strUsedSpace & vbTab & vbtab & strFreeSpace & vbtab & vbtab & pctFreeSpace & vbcrlf

with:

txt = txt & objItem.Name & _
      RightJustified(strDiskSize, 15) & _
      RightJustified(strUsedSpace, 15) & _
      RightJustified(strFreeSpace, 15) & _
      RightJustified(pctFreeSpace, 15) & _
      vbCrLf

EDIT 2

I added the RightJustified function at the bottom of your script, and then called it within your loop to format the columns. I also used it on the column headers. Below is the script and at the bottom is the output on my machine.

我在脚本底部添加了RightJustified函数,然后在循环中调用它来格式化列。我也在列标题上使用它。下面是脚本,底部是我的机器上的输出。

Option Explicit

const strComputer = "."
const strReport = "F:\dba_scripts\diskspace.txt"


Dim objWMIService, objItem, colItems
Dim strDriveType, strDiskSize, txt

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk WHERE DriveType=3")

txt = RightJustified("DRIVE", 10) & _
      RightJustified("SIZE", 15) & _
      RightJustified("USED", 15) & _
      RightJustified("FREE", 15) & _
      RightJustified("FREE(%)", 15) & _
      vbCrLf

For Each objItem in colItems

    DIM pctFreeSpace,strFreeSpace,strusedSpace

    pctFreeSpace = INT((objItem.FreeSpace / objItem.Size) * 1000)/10
    strDiskSize = round((objItem.Size /1073741824),1) & " GB"
    strFreeSpace = round((objItem.FreeSpace /1073741824),1) & " GB"
    strUsedSpace = round(((objItem.Size-objItem.FreeSpace)/1073741824),1) & " GB"

    txt = txt & _
      RightJustified(objItem.Name, 10) & _
      RightJustified(strDiskSize, 15) & _
      RightJustified(strUsedSpace, 15) & _
      RightJustified(strFreeSpace, 15) & _
      RightJustified(pctFreeSpace, 15) & _
      vbCrLf
Next

writeTextFile txt,strReport
wscript.echo "Report written to " & strReport & vbcrlf & vbcrlf & txt

' Procedure to write output to a text file
Sub writeTextFile(byval txt,byval strTextFilePath)
    Dim objFSO,objTextFile
    set objFSO = createobject("Scripting.FileSystemObject")
    set objTextFile = objFSO.CreateTextFile(strTextFilePath)
    objTextFile.Write(txt)
    objTextFile.Close
    Set objTextFile = nothing
End Sub

Function RightJustified(ColumnValue, ColumnWidth)
   RightJustified = Space(ColumnWidth - Len(ColumnValue)) & ColumnValue
End Function

Output produced:

 DRIVE           SIZE           USED           FREE        FREE(%)
    C:        48.4 GB        40.6 GB         7.8 GB           16.1
    D:       100.6 GB        56.8 GB        43.8 GB           43.5

#2


You could write out a table using HTML. This should work in an email.

你可以用HTML写出一个表。这应该在电子邮件中工作。