Разница между VBScript в.hta и.wsf
У меня есть простой фрагмент VBScript, который "дополняет" файл.csv, чтобы иметь определенное количество столбцов (полезно, когда файл.csv не имеет одинакового количества столбцов). Мой файл.wsf работает отлично, но когда я включил его в файл.hta как часть набора инструментов, он потерпел неудачу.
Я не ищу помощи с кодом как таковым, а просто объясняю, почему он не работает в одном файле, а не в другом. Извините за плохой код, но у кого-нибудь есть идеи?
Works.wsf
<JOB ID="CSVPad">
<SCRIPT LANGUAGE="VBScript">
Dim delim, colNum
'Set delim based on delimiter type of CSV file: 1 = Comma 2 = Pipe 3 = Caret
delim = 2
'Set colNum based on the number of columns to pad out to
colNum = 10
''Get location of .csv file
'set the type of dialog box you want to use: 1 = Open 2 = SaveAs 3 = File Picker 4 = Folder Picker
Const msoFileDialogOpen = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set objWord = CreateObject("Word.Application")
Set WshShell = CreateObject("WScript.Shell")
'Launch at default path
strInitialPath = WshShell.ExpandEnvironmentStrings("V:\Toolbox\Test")
objWord.ChangeFileOpEndirectory(strInitialPath)
With objWord.FileDialog(msoFileDialogOpen)
.Title = "Select the file to process"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "CSV Files / TXT Files", "*.csv; *.txt"
.Filters.Add "All Files", "*.*"
If .Show = -1 Then
For Each File in .SelectedItems
Set objFile = fso.GetFile(File)
Next
End If
End With
objWord.Quit
Dim oFso, oReg, objInputFile, objOutputFile, sLine, lCount
Const ForReading = 1
Set oReg = New RegExp
Set oFso = CreateObject("Scripting.FileSystemObject")
Set objInputFile = oFso.OpenTextFile(objFile.Path,1)
Set objOutputFile = oFso.OpenTextFile(objFile.Path&".bak",8,True)
Do Until objInputFile.AtEndOfStream
sLine = objInputFile.ReadLine
oReg.Global = True
If delim = 1 Then
oReg.Pattern = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
ElseIf delim = 2 Then
oReg.Pattern = "\|(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
ElseIf delim = 3 Then
oReg.Pattern = "\^(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
End If
lCount = oReg.Execute(sLine).Count + 1
Do While lCount < colNum
If delim = 1 Then
sLine = sLine + ","
ElseIf delim = 2 Then
sLine = sLine + "|"
ElseIf delim = 3 Then
sLine = sLine + "^"
End If
lCount = oReg.Execute(sLine).Count + 1
Loop
objOutputFile.WriteLine(sLine)
Set lCount = Nothing
Loop
objInputFile.Close
objOutputFile.Close
Set oFso = Nothing
Set oReg = Nothing
Set delim = Nothing
Set sLine = Nothing
Set lCount = Nothing
Msgbox "Operation Complete"
</SCRIPT>
NotWork.hta
<JOB ID="CSVPad">
<HEAD>
<TITLE>Support Toolbox</TITLE>
<HTA:APPLICATION
ID="Test"
APPLICATIONNAME="Test"
BORDER="thin"
CONTEXTMENU="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="yes"
RESIZE="no"
SCROLL="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
VERSION="1.0"
NAVIGABLE="yes"
/>
<SCRIPT LANGUAGE="VBScript">
Sub padCSV
If isNumeric(csvPadNo.value) Then
Dim delim, colNum
If Delimeter(0).Checked Then
delim = "1"
End If
If Delimeter(1).Checked Then
delim = "2"
End If
If Delimeter(2).Checked Then
delim = "3"
End If
'Set colNum based on the number of columns to pad out to
colNum = csvPadNo.value
''Get location of .csv file
'set the type of dialog box you want to use: 1 = Open 2 = SaveAs 3 = File Picker 4 = Folder Picker
Const msoFileDialogOpen = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set objWord = CreateObject("Word.Application")
Set WshShell = CreateObject("WScript.Shell")
'Launch at default path
strInitialPath = WshShell.ExpandEnvironmentStrings("V:\Toolbox\Test")
objWord.ChangeFileOpEndirectory(strInitialPath)
With objWord.FileDialog(msoFileDialogOpen)
.Title = "Select the file to process"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "CSV Files / TXT Files", "*.csv; *.txt"
.Filters.Add "All Files", "*.*"
If .Show = -1 Then
For Each File in .SelectedItems
Set objFile = fso.GetFile(File)
Next
End If
End With
objWord.Quit
Dim oFso, oReg, objInputFile, objOutputFile, sLine, lCount
Const ForReading = 1
Set oReg = New RegExp
Set oFso = CreateObject("Scripting.FileSystemObject")
Set objInputFile = oFso.OpenTextFile(objFile.Path,1)
Set objOutputFile = oFso.OpenTextFile(objFile.Path&".bak",8,True)
Do Until objInputFile.AtEndOfStream
sLine = objInputFile.ReadLine
oReg.Global = True
If delim = 1 Then
oReg.Pattern = ",(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
ElseIf delim = 2 Then
oReg.Pattern = "\|(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
ElseIf delim = 3 Then
oReg.Pattern = "\^(?=(([^""\\]|\\.)*""([^""\\]|\\.)*"")*([^""\\]|\\.)*$)"
End If
lCount = oReg.Execute(sLine).Count + 1
Do While lCount < colNum
If delim = 1 Then
sLine = sLine + ","
ElseIf delim = 2 Then
sLine = sLine + "|"
ElseIf delim = 3 Then
sLine = sLine + "^"
End If
lCount = oReg.Execute(sLine).Count + 1
Loop
objOutputFile.WriteLine(sLine)
Set lCount = Nothing
Loop
objInputFile.Close
objOutputFile.Close
Set oFso = Nothing
Set oReg = Nothing
Set delim = Nothing
Set sLine = Nothing
Set lCount = Nothing
Msgbox "Operation Complete"
Else
MsgBox "Please enter a number"
End If
End Sub
</SCRIPT>
</HEAD>
<BODY>
<span id="CSVPad">
<div id="PageCSVPad" class="PageCSVPad">
<table class="CSVPad" Border="0" Cellspacing="0" Align="Left">
<tr>
<td width=25%><b>Delimiter Type: </b></td>
<td><input type="radio" name="Delimeter" value="1" checked>Comma</td>
<td><input type="radio" name="Delimeter" value="2">Pipe</td>
<td><input type="radio" name="Delimeter" value="3">Caret</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td colspan="2"><b>Number of Columns: </b></td>
<td><input type="text" name="csvPadNo"></td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><input type="button" value="Browse" onclick="padCSV" name="Radb"><br></tr>
</tr>
</table>
</div>
</span>
</BODY>
Код только слегка изменен, чтобы разрешить ввод значений, но для меня это должно работать точно так же.
Я что-то пропустил?
Спасибо, парни!
1 ответ
В строке 78 ОМТ:
Do While lCount < colNum
вы не сравниваете то, что вы думаете, вы сравниваете. Вставьте следующую строку непосредственно перед строкой выше, и вы увидите, что отличается:
MsgBox "lCount: " & TypeName(lCount) & vbNewLine & "colNum: " & TypeName(colNum)
Что касается решения проблемы, измените эту строку:
colNum = csvPadNo.value
в это:
colNum = CInt(csvPadNo.value)
и проблема исчезнет.