Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Копирование файлов с определёнными расширениями на сервер

Доброго времени суток, пытаюсь сделать скрипит копирования файлов по разрешениям на сервер я VBS изучать начал неделю назад и никак не могу понять, в чем я ошибся. Ошибка в 23 строчке подскажите, пожалуйста, что неправильно.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Option Explicit
Dim outFolder: outFolder = "C:\update"
Dim inFolder: inFolder = "\\server\"
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim WSNetwork: Set WSNetwork = CreateObject("WScript.Network")
 
If oFSO.FolderExists(outFolder) AND oFSO.FolderExists(inFolder) Then
  CopyFileOnMask outFolder, "exe txt rar" ' каталог и маски файлов для удаления
  WScript.Echo "Готово."
Else
  WScript.Echo "Не найден один из путей " & outFolder & " " & "ИЛИ" & " " & inFolder
End If
WScript.Quit(0)
 
Function CopyFileOnMask(s, sMask)
  Dim oFld, arrMask, v, i
  Set oFld = oFSO.GetFolder(s)
  arrMask = Split(LCase(sMask), " ")
  For Each v In oFld.Files
    For i = LBound(arrMask) To UBound(arrMask)
      If LCase(oFSO.GetExtensionName(s & "\" & v.Name)) = arrMask(i) Then
        oFSO.CopyFile v, inFolder, True
        Exit For
      End If
    Next
  Next
End Function
Добавлено через 24 минуты
Немного переделал функцию наверное так правильнее
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function CopyFileOnMask(s, sMask)
  Dim oFld, iFld, arrMask, v, i
  Set oFld = oFSO.GetFolder(s)
  Set iFld = oFSO.GetFolder(inFolder)
  arrMask = Split(LCase(sMask), " ")
  For Each v In oFld.Files
    For i = LBound(arrMask) To UBound(arrMask)
      If LCase(oFSO.GetExtensionName(s & "\" & v.Name)) = arrMask(i) Then
        v.Copy (inFolder), True
        Exit For
      End If
    Next
  Next
End Function
Хотя все равно не помогло к сожалению
Ответ: Добрый день.
Помогите пожалуйста разобраться.

Скачала скрипт на сайте-

Я его немного хочу переделать.
Добавила условие- по типам файлов
В итоге из папки назначения- копируются только нужные файлы, а во вложенных папках- все типы файлов.
Помогите пожалуйста разобраться, в чём дело.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
' ========== Script Information  ==========
' script name:   Fail_Copying
' version:       1.0
' date:          14.08.12
' autor:         MasterLin
' site:          [url]http://www.masterlin.ru[/url]
' description:   Скрипт копирует файлы, папки и подпапки с одного источника на несколько, в сети или локально (рассылка файлов). 
' При этом происходит проверка на наличие, доступность и время создания файлов. При отсутствии, либо старой версии файла
' происходит его копирование и замена на более новый.
 
'***********************************************
' Создание объектов оболочки и файловой системы 
 
Set oShell = CreateObject("wscript.shell")
Set oFSO = CreateObject("Scripting.Filesystemobject")
Set WSNetwork = CreateObject("WScript.Network")
LogFolder = "f:\BackUp\2016\1" ' место расположения лог-файла
StartFolder = "f:\BackUp\2016\2" ' откуда копируем
aEndFolder = array("f:\BackUp\2016\1") ' куда копируем
 
' мой вариант
sMask= "txt doc docx xls"
Dim arrMask
'array("\\user1\1","\\user2\1") ' куда копируем 2 адреса 
arrMask = Split(LCase(sMask), " ")
' конец моего варианта
'***********************************************
' обнуление и описание счетчиков, используемых в скрипте
num_EndFolder = 0       '- общее число папок, места назначения для копируемых данных
num_EndFolder_0 = 0     '- не доступное кол-во папок из  num_EndFolder
num_files = 0           '- общее число обработанных файлов
num_files_copy = 0      '- из них скопировано с заменой на новую версию
err_files_copy = 0      '- из них не скопировано в результате ошибки при работе с num_files_copy
num_files_new = 0       '- из них скопировано новых файлов
err_files_new = 0       '- из них не скопировано в результате ошибки при работе с num_files_new
num_SubFolder = 0       '- обработано папок и подпапок
num_SubFolder_copy = 0  '- из них скопировано новых папок и подпапок
err_SubFolder = 0       '- из них не скопировано в результате ошибки при работе с num_SubFolder
 
'***********************************************
' Создание лог-файла
' Задаем имя лога
sLogName = "LogTemp_" & Date & "_" & Time
' Заменяем в имени все знаки на подчеркивания
sLogName = Replace(sLogName, ".", "_")
sLogName = Replace(sLogName, ":", "_")
sLogName = LogFolder & sLogName
' Создаем файл
Set oLogFile = oFSO.CreateTextFile(sLogName & ".log",true)
oLogFile.WriteLine "========== Script Information  ==========" & vbCrLf
oLogFile.WriteLine "script name:   Fail_Copying"
oLogFile.WriteLine "version:       1.0"
oLogFile.WriteLine "date:          10.08.12"
oLogFile.WriteLine "autor:         MasterLin"
oLogFile.WriteLine "site:          http://www.masterlin.ru" & vbCrLf
oLogFile.WriteLine "========== Запуск скрипта ==========" & vbCrLf
 
'***********************************************
 
Set oEndFolder = CreateObject("Scripting.FileSystemObject")
' Цикл для перебора папок "куда копируем"
For i=0 to UBound (aEndFolder)
' Счетчик кол-ва папок для копируемых данных
num_EndFolder=num_EndFolder+1
' Проверяем доступность папки, в которую хотим произвести копирование
If oEndFolder.FolderExists ( aEndFolder(i) ) Then 
    ' Записываем результат в лог
    oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " доступна для работы" & vbCrLf
    CopyFolder StartFolder,aEndFolder(i),"txt doc docx xls"
    ' Счетчик доступных для копирования папок
    ' удолил :)     
else
    ' Записываем результат в лог
    oLogFile.Writeline
    oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена." & vbCrLf
    ' Дублируем сообщение, выводом предупреждения на экран
    WScript.Echo "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена."
    ' Счетчик недоступных для копирования папок
    num_EndFolder_0=num_EndFolder_0+1
End if 'oEndFolder.FolderExists ( aEndFolder(i) ) Then 
Next
oLogFile.WriteLine "========== Отчет о копировании ==========" & vbCrLf
oLogFile.WriteLine "Было задано " & num_EndFolder & " папок, для копирования в них данных." 
oLogFile.WriteLine "Часть папок оказалась не доступна - " & num_EndFolder_0 & " шт. (см.логи выше)"
oLogFile.WriteLine "Скриптом было обработано - " & num_files & " файлов."
oLogFile.WriteLine "Из них скопировано с заменой - " & num_files_copy & " шт., не скопировано в результате ошибки - " & err_files_copy & " шт."
oLogFile.WriteLine "Из них скопировано новых файлов - " & num_files_new & " шт., не скопировано в результате ошибки - " & err_files_new & " шт."
oLogFile.WriteLine "Скриптом было обработано - " & num_SubFolder & " подпапок."
oLogFile.WriteLine "Из них скопировано новых подпапок - " & num_SubFolder_copy & " шт., не скопировано в результате ошибки - " & err_SubFolder & " шт."
oLogFile.WriteLine
oLogFile.WriteLine "========== Выполнение скрипта завершено ==========" & vbCrLf
WScript.Echo "Выполнение скрипта завершено."
 
WScript.Echo "Выполнение скрипта завершено."
 
'***********************************************************************************
Sub CopyFolder(sCopyFolder,sEndCopyFolder,sMask)
Dim a
' Создание объекта Folder
Set oFolder = oFSO.GetFolder(sCopyFolder) 'откуда 
Set oEndCopyFolder = oFSO.GetFolder(sEndCopyFolder)'куда
' Получение коллекции файлов
Set colFiles = oFolder.Files
 'WScript.Echo colFiles
 
 
' Обработка каждого файла из коллекции
For each oFile in colFiles
        wscript.Echo oFile.Name
' мой вариант
    ' цикл по массиву расширений (моё)
        For a = LBound(arrMask) To UBound(arrMask)
            If (LCase(oFSO.GetExtensionName(oFile.Name)) = arrMask(a)) Then
' конец моего варианта
            oLogFile.Writeline "Дата создания копируемого файла:"
            oLogFile.Writeline oFile & vbTab & oFile.DateCreated
            ' Счетчик числа проверяемых файлов
            num_files=num_files+1
            ' Проверяем существует уже такой файл в папке, если его нет, то копируем. 
            ' Если есть, то проверяем его актуальность и заменяем более новым, если он устарел.
            
            
            
            If oFSO.FileExists(oFSO.BuildPath(oEndCopyFolder, oFile.Name)) Then 
                'wscript.Echo oFSO.GetExtensionName(oFile)
                'wscript.Echo arrMask(a)
                ' Записываем результат в лог
                oLogFile.Writeline "Такой файл уже существует в папке " & oEndCopyFolder
                ' Проверяем насколько это свежая копия файла, для этого сравниваем даты создания двух файлов
                oLogFile.Writeline "Проверяем актуальность копии:"
                ' Выгружаем полный путь к проверяемому файлу
                sFileEnd = oFSO.BuildPath(oEndCopyFolder, oFile.Name)
                ' Создаем объект File, для работы с этим файлом
                    Set oFileEnd = oFSO.GetFile(sFileEnd)
                    ' Сравниваем даты изменения файлов 
                    If oFileEnd.DateLastModified < oFile.DateLastModified Then
                        ' Проверяемый файл оказался устаревшим, поэтому заменяем его более новым
                        oLogFile.Writeline "Копия файла устарела, заменяем его новым.     **********" & vbCrLf
                        oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
                        ' Проверка на наличие ошибок
                        if err.Number <> 0 then
                            ' Запись сообщения об ошибке в лог
                            oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                            ' Очистка ошибки
                            Err.Clear
                            ' Счетчик ошибок при замене файлов
                            err_files_copy=err_files_copy+1
                        else
                            ' Счетчик файлов, которые были заменены на новые
                            num_files_copy=num_files_copy+1             
                        End if 'err.Number <> 0 then
                    else
                        ' В этом случае копия прошла проверку, просто продолжаем работу скрипта далее
                        oLogFile.Writeline "Копия актуальна. Продолжаем работу." & vbCrLf
                    End if 'oFileEnd.DateLastModified < oFile.DateLastModified Then
            
            else
            
                ' Записываем результат в лог
                oLogFile.Writeline "Этот файл отсутствует в папке " & oEndCopyFolder & " Давайка его скопируем." & vbCrLf
                oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
                ' Проверка на наличие ошибок
                if err.Number <> 0 then
                    ' Запись сообщения об ошибке в лог
                    oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                    ' Очистка ошибки
                    Err.Clear
                    ' Счетчик ошибок при копировании новых файлов
                    err_files_new=err_files_copy+1
                else
                    ' Счетчик новых скопированных файлов
                    num_files_new=num_files_copy+1              
                End if 'err.Number <> 0 then
            
           End if 'oFSO.FileExists(oFSO.BuildPath(oEndCopyFolder, oFile.Name)) Then 
        End if '(LCase(oFSO.GetExtensionName(oFile)) = "TXT" Or LCase(oFSO.GetExtensionName(oFile)) = "xls") Then
Next
 
Next
 
' ********************************************************************************* 
 
' Проверяем все папки и подпапки
oLogFile.Writeline "Обрабатываем и копируем все подпапки из папки " & oEndCopyFolder & vbCrLf
' Получение коллекции подпапок
Set colSubFolders = oFolder.SubFolders
 
' Обработка каждой подпапки
For Each oSubFolder In colSubFolders
oLogFile.Writeline "Проверяем подпапку " & oSubFolder
    ' Счетчик обработанных папок и подпапок
    num_SubFolder=num_SubFolder+1   
    ' Проверяем существует уже такая подпапка в папке, если ее нет, то копируем. 
    ' Если есть, то переходим к проверке файлов в подпапке.
        If oFSO.FolderExists(oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path))) Then
        
        ' Записываем результат в лог
            oLogFile.Writeline "Такая подпапка уже существует в папке " & oEndCopyFolder
            oLogFile.Writeline "Проверяем все файлы в этой подпапке: "
            ' Выгружаем полный путь к проверяемоой подпапке
            sSubFolderEnd = oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path)) & "" 
            ' Производим рекурсивный вызов процедуры копирования файлов - программа вызывает сама себя
            
            CopyFolder oSubFolder, sSubFolderEnd, "txt doc docx xls"            
            ' oLogFile.Writeline
        else
            ' Записываем результат в лог            
            oLogFile.Writeline "Эта подпапка отсутствует в папке " & oEndCopyFolder & " Давайка ее скопируем." & vbCrLf
            oFSO.CopyFolder oSubFolder, sEndCopyFolder, True
            ' Проверка на наличие ошибок
            if err.Number <> 0 then
                ' Запись сообщения об ошибке в лог
                oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                ' Очистка ошибки
                Err.Clear
                ' Счетчик ошибок при копировании новых папок и подпапок
                err_SubFolder=err_SubFolder+1
            else
                ' Счетчик новых скопированных папок и подпапок
                num_SubFolder_copy=num_SubFolder_copy+1         
            End if 'err.Number <> 0 then
            
        End if  
    
Next
End Sub
'***********************************************

Объясните пожалуйста, как скопировать только файлы, с выбранным расширением во вложенных папках.
Вопрос: Запуск программы по событию создания файла

Здравствуйте значит так есть программа которая ну совсем ни как не подключена к БД и подключению не подлежит.
С помощью этой программа бухгалтер создаёт файл 2 раза каждый день.
Опишу схему того как всё работает сейчас.
P.S.Внутри программы есть настройка в которой можно выбрать место сохранения файл и имя файла может это как-то поможет вам мне подсказать. =)
Действия:
1) Бухгалтер включает программу создаёт файл
2) Бухгалтер звонит программисту чтобы тот запустил процедуру которая находит этот файл и данные из этого фала заносит в БД отсылка к теме (Чтение данных из внешнего файла)
3) После отработки процедуры программист звонит бухгалтеру и говорит что данные залиты.
4) Бухгалтер снова включает программу создаёт тот же файл, но уже с другими данными
(так как разные счета банков) (объединить эти счета в один файл нельзя так как программа при формирование файла заменяет тот файл который был (сделать один файл с двумя счетами сразу тоже нельзя так как в программе такого не предусмотрено, сменить путь сохранения можно НО! бухгалтера этому не обучить так что вариант отпадает да и к тому же каждый день менять по два раза путь сохранения бред)
5) После того как 2 раз файл создался старый фал затёрся.
6) Бухгалтер звонит программисту чтобы тот запустил процедуру
7) После отработки процедуры программист звонит бухгалтеру и говорит что данные залиты
8) Конец.

Добавлено через 6 минут
Так вот я по напридумывал какой-то совсем невероятный вариант...
В общем как сделать так чтобы при создание файл это пункт "1)" в описание задачи система понимала что файл создался и сама запускала эту процедуру.
Вариант того как я хочу:
1) Бухгалтер включает программу создаёт файл.
2) Система поняла "Ага создали файл">>>Запуск процедуры она работает ну секунд 5 (за это время бухгалтер не успеет создать другой файл)
3) Бухгалтер включает программу создаёт файл.
4) Система поняла "Ага создали файл">>>Запуск процедуры
5) Конец.
Чтобы исключить эти звонки =)) надоело уже.

P.S Windows XP; База Oracle (последняя версия.) да да XP не смейтесь. Х_ы
Ответ: Мне кажется, мало отследить создание файла. Надо отследить закрытие файла. А то при отслеживании возможно попасть в ситуацию, что файл уже создан, но запись в него ещё не закончена.
Вопрос: Архивирование определенных файлов из разных каталогов с сохранением структуры

Здравствуйте.
Суть задачи. Есть определенный каталог (C:\X), в котором в разных подкаталогах лежат различные файлы и папки (количество, точное расположение файлов в каталоге C:\X и из расширения известны), которые необходимо заархивировать и сбросить полученный архив в определенную папку(C:\backup\Y). Среди этих файлов есть два, у которых периодически меняется содержимое и, что самое главное меняется их имя, и необходимо, разумеется, добавлять в архив только самую последнюю версию этих файлов (это файлы с расширением *.snb и *.jh)

С помощью изучения разных тем на Вашем форуме я дошел до следующего кода батника:
Кликните здесь для просмотра всего текста
Код Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Echo off
SetLocal EnableDelayedExpansion
 
cd c:\backup
 
::Переменные
set DD=%DATE:~0,2%
set MM=%DATE:~3,2%
set YY=%DATE:~-4%
set TT=%Time:~0,2%-%Time:~3,2%
Set $ARCHIVENAME=backup%DD%.%MM%.%YY%_%TT%.7z
Set $SRC=add.txt
Set $EXC=excl.txt
Set $DST=c:\backup\Y
Set $COMPR=1
Set $COPIES=5
Set $PSW=123123
Set SNBFOLD=C:\X\A\snbs
Set JHFOLD=C:\X\B\jhs
Set ARCTEMP=C:\backup\Y\temp
 
::копирование последнего *.jh во временную папку
pushd %JHFOLD%
dir /b /O:-D /T:W /A:-D *.jh > 1.txt
set /p jhllast=<1.txt
del 1.txt
echo filename %jhlast%
copy "%jhlast%" %ARCTEMP%
popd
 
::копирование последнего *.snb во временную папку
pushd %SNBFOLD%
dir /b /O:-D /T:W /A:-D *.snb > 1.txt
set /p snblast=<1.txt
del 1.txt
echo filename %snblast%
copy "%snblast%" %ARCTEMP%
popd
 
::Создание 7z архива
C:\"Program Files"\7-Zip\7z.exe a -t7z -mhe=on "%$DST%\%$ARCHIVENAME%" @%$SRC% -scsWIN -mx=%$COMPR% -ssw -xr@%$EXC% -p%$PSW%
For /F "Delims=" %%i In ('DIR /B/O:-N %$DST%\backup??.??.????_??-??.7z') Do (
Set /A $COPIES-=1
If !$COPIES! LSS 0 DEL "%$DST%\%%i"
)
 
 
::удаление временных файлов *.jh и *.snb
DEL /Q %ARCTEMP%
 
pause


На данный момент батник очень не оптимизирован, но работает. Принцип действия:
Основная работа происходит с помощью команды архиватору, который, сверяясь с текстовым файлом add.txt из рабочей папки батника, в котором указаны полные пути до нужных файлов, собственно и архивирует эти необходимые файлы. Два тех самых файла *.jh и *.snb архивируются из временной папки, куда копируются из своего родного каталога по имени, которое определяется с помощью конструкции (например для *.snb)
Кликните здесь для просмотра всего текста

Код Windows Batch file
1
2
3
4
5
6
7
8
9
10
pushd %SNBFOLD%
::список файлов по убыванию по дате изменения записывается в текстовик
dir /b /O:-D /T:W /A:-D *.snb > 1.txt
::в качестве имени последнего измененного файла берется первая строка из сформированного текстовика 
set /p snblast=<1.txt
del 1.txt
::вывод имени для проверки
echo filename %snblast%
copy "%snblast%" %ARCTEMP%
popd


Про вариант с определением имени последнего измененного файла указанным ниже способом знаю, но почему то он не всегда отрабатывает как надо (часто не видит файлы, которые изменялись очень давно, но тем не менее являются последними измененными)
Кликните здесь для просмотра всего текста
Код Windows Batch file
1
2
3
4
5
6
7
8
9
10
pushd "%SNBFOLD%"
 
for /f "tokens=*" %%i in (' dir /b *.snb ') do (
 
    for /f "tokens=1" %%j in ( "%%~ti" ) do if "%%j"=="%date%" set "file=%%i"
 
)
 
echo lastshbfile "%file%" 
popd

Оптимизировать эту часть батника буду позже.

На выходе в каталоге c:\backup\Y у меня получается архив, в корне которого лежат файлы и папки; чтобы вернуть их на место приходится отдельно копировать каждый файл/папку на свое место. Меня интересуют способы, как можно сохранить структуру корневого каталога с файлами C:\X при архивировании, т.е. в архиве получается каталог \X, в котором по полным путям лежат необходимые файлы/папки и для восстановления каталога C:\X достаточно будет скопировать каталог из архива, подтвердив слияние.
Знаю, что это можно сделать, сначала скопировав, все нужные файлы/папки с сохранением структуры куда-то во временную папку и заархивировать ее, но может кто-нибудь подскажет иной способ
Ответ:
Код Windows Batch file
1
C:\"Program Files"\7-Zip\7z.exe a  -r -t7z -mhe=on "%$DST%\%$ARCHIVENAME%" @%$SRC% -scsWIN -mx=%$COMPR% -ssw -xr@%$EXC% -p%$PSW%
по-прежнему только записывает в корень архива файлы и папки, которые перечислены в add.txt
Вопрос: Определение файла в папке, его печать и удаление и зацикливание

Вот мой скрипт

Код Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'On Error Resume Next
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "C:\Users\SergeiSorokin\Desktop\test\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 For Each lFile In lFiles
  PrintFile(gWatchFolder & lFile.Name)
 Next
 WScript.Sleep(1)
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(3)
 'msgbox(pFileName)
 'Мы (больше) не боимся пробелов :Р
 Dim objFS, objShell, objFolderItems
Dim strMask, arrFolders, strArguments, strVerb, intShowMode, strTemp, i, j
 
strMask = "*.pdf": strArguments = "": strVerb = "print": intShowMode = 0
arrFolders = Array("C:\Users\SergeiSorokin\Desktop\test")
Set objShell = CreateObject("Shell.Application")
If objShell.NameSpace(&h4).Items.Count > 1 Then
    Set objFS = CreateObject("Scripting.FileSystemObject")
    For i = 0 To UBound(arrFolders)
        If objFS.FolderExists(arrFolders(i)) Then
            Set objFolderItems = objShell.NameSpace(arrFolders(i)).Items
            objFolderItems.Filter 64 + 128, strMask
            On Error Resume Next
            For j = 0 To objFolderItems.Count - 1
                strTemp = objFolderItems.Item(j).Name
                objShell.ShellExecute strTemp, strArguments, arrFolders(i), strVerb, intShowMode
                If Err.Number = 0 Then
                    WScript.Echo "Задание печати файла " & strTemp & " обработано успешно."
                Else
                    WScript.Echo "Ошибка " & Err.Number & " при печати файла " & strTemp & vbNewLine & Err.Description
                    Err.Clear
                End If
            Next
            On Error GoTo 0
        Else
            WScript.Echo "Не найден путь " & arrFolders(i)
        End If
    Next
    Set objFolderItems = Nothing: Set objFS = Nothing
Else
    WScript.Echo "Не найдено ни одного подключения к принтеру."
End If
Set objShell = Nothing
WScript.Quit 0
gFSO.DeleteFile(pFileName)
 If gFSO.FileExists(pFileName) Then
  'Мало ли чего может случиться, лучше пусть у Иван Иваныча перестанет печатать, чем один файл много раз уйдет на принтер
  'msgbox("Не удалось удалить файл " & pFileName & "! Позвоните Василию по т. 123-456)
  WScript.Quit
 'Else
  'Пока не реализовано
  'ToLog("Файл " & lFileName & " удален.")
 End If
End sub
Что происходит: при попадании файла в папку печать идет, файл не удаляется. При последующих добавлениях файла в папку ничего не происходит.

Помогите, пожалуйста.

Добавлено через 1 час 17 минут
Всё, сделал, только осталось подправить интервалы времени, чтобы работало без ошибок.

Код Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "C:\Users\SergeiSorokin\Desktop\test\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 For Each lFile In lFiles
  PrintFile(gWatchFolder & lFile.Name)
 Next
 WScript.Sleep(1)
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(3)
 'msgbox(pFileName)
 'Мы (больше) не боимся пробелов :Р
 
 Dim objFS, objShell, objFolderItems
Dim strMask, arrFolders, strArguments, strVerb, intShowMode, strTemp, i, j
 
strMask = "*.pdf": strArguments = "": strVerb = "print": intShowMode = 0
arrFolders = Array("C:\Users\SergeiSorokin\Desktop\test")
Set objShell = CreateObject("Shell.Application")
If objShell.NameSpace(&h4).Items.Count > 1 Then
    Set objFS = CreateObject("Scripting.FileSystemObject")
    For i = 0 To UBound(arrFolders)
        If objFS.FolderExists(arrFolders(i)) Then
            Set objFolderItems = objShell.NameSpace(arrFolders(i)).Items
            objFolderItems.Filter 64 + 128, strMask
            On Error Resume Next
            For j = 0 To objFolderItems.Count - 1
                strTemp = objFolderItems.Item(j).Name
                objShell.ShellExecute strTemp, strArguments, arrFolders(i), strVerb, intShowMode
                If Err.Number = 0 Then
                    WScript.Echo "Задание печати файла " & strTemp & " обработано успешно."
                Else
                    WScript.Echo "Ошибка " & Err.Number & " при печати файла " & strTemp & vbNewLine & Err.Description
                    Err.Clear
                End If
            Next
            On Error GoTo 0
        Else
            WScript.Echo "Не найден путь " & arrFolders(i)
        End If
    Next
    Set objFolderItems = Nothing: Set objFS = Nothing
Else
    WScript.Echo "Не найдено ни одного подключения к принтеру."
End If
Set objShell = Nothing
 
 gFSO.DeleteFile(pFileName)
End sub
С интервалами кто может помочь?
Получается, что если в процессе ничего быстро не нажимать то все работает. А если в выскочившем окне быстро нажать "ок", то весь процесс сбивается.

Освещая проблему - настраиваю сетевой принтер, драйверов нормальных не нашлось. Установил PDF принтер.
Теперь настраиваю автоматическую печать с папки. Теперь надо чтобы любой человек не задумывался над тем как это работает, просто печатал.
Ответ: Спасибо большое.

Сделал следующим образом:

Код Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "C:\Users\SergeiSorokin\Desktop\test\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 For Each lFile In lFiles
  PrintFile(gWatchFolder & lFile.Name)
 Next
 WScript.Sleep(1)
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(3)
 'msgbox(pFileName)
 'Мы (больше) не боимся пробелов :Р
 
 Dim objFS, objShell, objFolderItems
Dim strMask, arrFolders, strArguments, strVerb, intShowMode, strTemp, i, j
 
strMask = "*.pdf": strArguments = "": strVerb = "print": intShowMode = 0
arrFolders = Array("C:\Users\SergeiSorokin\Desktop\test")
Set objShell = CreateObject("Shell.Application")
If objShell.NameSpace(&h4).Items.Count > 1 Then
    Set objFS = CreateObject("Scripting.FileSystemObject")
    For i = 0 To UBound(arrFolders)
        If objFS.FolderExists(arrFolders(i)) Then
            Set objFolderItems = objShell.NameSpace(arrFolders(i)).Items
            objFolderItems.Filter 64 + 128, strMask
            On Error Resume Next
            For j = 0 To objFolderItems.Count - 1
                strTemp = objFolderItems.Item(j).Name
                objShell.ShellExecute strTemp, strArguments, arrFolders(i), strVerb, intShowMode
                If Err.Number = 0 Then
                    WScript.Echo "Задание печати файла " & strTemp & " обработано успешно."
                Else
                    WScript.Echo "Ошибка " & Err.Number & " при печати файла " & strTemp & vbNewLine & Err.Description
                    Err.Clear
                End If
            Next
            On Error GoTo 0
        Else
            WScript.Echo "Не найден путь " & arrFolders(i)
        End If
    Next
    Set objFolderItems = Nothing: Set objFS = Nothing
Else
    WScript.Echo "Не найдено ни одного подключения к принтеру."
End If
Set objShell = Nothing
 WScript.Sleep(10000)
 gFSO.DeleteFile(pFileName)
End sub
оказалось проблема была в том, что стояла маленькая задержка WScript.Sleep. значения даются в миллисекундах, я ставил 3, 10, тестировал - не выходило. файл удалялся раньше чем печатался. потом дошло, что надо попробовать больше. поставил 10000 получилось.
Вопрос: Создайте командный файл, выполняющий переименование файлов заданного типа

Создайте командный файл, выполняющий переименование файлов заданного типа.
В качестве первого (обязательного) параметра должно быть задано имя папки, с которой начинается просмотр (для текущей папки задается символ "."). Вторым (необязательным) параметром является тип файла:
• text – для текстовых файлов (с расширением .txt);
• prog – для командных файлов (с расширением .bat);
• all – для всех файлов папки.
Если второй параметр не задан, выдается запрос на ввод имени файла (в имени файла могут быть использованы символы "?" и "*") и запрос на ввод расширения файла (должно быть одно из перечисленных выше расширений).
После этого определяется и выводится (в зависимости от значения второго параметра) количество файлов заданного типа или всех файлов в папке.
Затем (с использованием команды for с опцией /L) в цикле выводятся имена файлов (от 1 до количества файлов) и задаются запросы на новое имя файла (без расширения, которое не меняется). Если введена непустая строка, имя файла изменяется на новое имя (с помощью команды ren) и выводится сообщение об изменении файла, в противном случае имя файла не меняется и также выводится соответствующее сообщение.
Если файлов указанного типа нет в папке, выводится сообщение «В папке нет файлов типа имя-типа».
Ответ: Без понятия как можно с опцией /L для for перечислить файлы, поэтому сделал без нее.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@echo off 
echo Rename files
if "%1"=="" ( 
echo Do not specify the 1st parameter
echo Input /? to output help
pause 
goto :EOF
) 
if "%1"=="/?" ( 
echo Rename files of a certain extension
echo 1st parameter - folder name
echo 2nd parameter - file type
echo Types:
echo -text for *.txt 
echo -prog for *.bat 
echo -all for *.* 
pause 
goto exit
) 
if not exist %1 ( 
echo Folder is not exist
pause 
goto exit 
)
if not "%1"=="." ( 
pushd %1 
)
if "%2"=="" ( 
echo Do not specify the 2nd parameter 
set /p nam=Input file name: 
set /p ext=Input file extension: 
) else (goto run)
if not exist "*.%ext%" (
echo There are not *.%ext% files in this folder
pause
goto exit
) else (goto user_type)
:run
if "%2"=="text" (   
for %%I in (*.txt) do call :rename "%%I" .txt
pause 
goto exit 
)
if "%2"=="prog" ( 
for %%I in (*.bat) do call :rename "%%I" .bat 
pause 
goto exit 
)
if "%2"=="all" (
for %%I in ("*.*") do call :rename "%%I" %%~xI
pause 
goto exit 
)
:user_type
for %%I in (%nam%.%ext%) do call :rename "%%I" .%ext%
pause
goto exit 
pause
goto :exit
:rename
echo Renaming file %1
set /p n=Input new name: 
if "%n%"=="" (
echo The file is not renamed
) else (
ren %1 "%n%%2"
echo Renamed file
)
set "n="
exit /b  
:exit
if not "%1"=="." (cd ../)
Вопрос: Как запустить Batch-файл? Как диагностировать проблему или ошибки в синтаксисе, когда Bat-файл не работает или "вылета

Как запустить Batch-файл?
Как диагностировать проблему или ошибки в синтаксисе, когда Bat-файл не работает или "вылетает".


Чтобы увидеть ошибки в синтаксисе, которые приводят к критическому завершению Batch-файла,
необходимо запустить его из CMD.exe (интерпретатора).

Как?
Этап 1. Подготовка:
Если у Вас в скрипте указана директива для скрытия вывода выполняемых команд:
Bash
1
@echo off
Она обычно идет первой строкой в коде.
- Удалите ее, или закомментируйте:
Bash
1
::echo off
иначе будет сложно определить, какая команда вызывает "падение" скрипта или ошибку.

Этап 2. Выполнение скрипта с перенаправлением вывода в файл протокола

Вариант 1. Для систем Windows XP и ниже:

ПУСК -> Выполнить (либо Win + R), вводим CMD, нажимаем {ENTER}

Откроется маленькое черное окно - консоль.
В нем Вы увидите путь к каталогу, в котором будут выполняться команды в данный момент.
Вам нужно перейти в каталог, где расположен бат-файл.
Например, Вам нужно запустить Batch-файл с именем script.cmd, расположенном в папке temp на диске C,
тогда вводим команды:

(ввод каждой строки подтверждаем клавишей {ENTER})

Bash
1
2
cd /D "c:\temp"
script > log.txt
После ввода первой строки Вы увидете на экране приглашение вида:
c:\temp>
что свидетельствует об успешном переходе в каталог c:\temp

Вариант 2. Для систем Windows Vista и выше (переход в папку с батником сразу):

1. Перейдите на уровень выше от каталога, где находится Batch-файл
(иными словами: Вам нужно видеть пиктограмму значка папки, в которой находится Batch-файл)
Если Вы видите перед собой сам Batch-файл, достаточно нажать BackSpace (кнопка "стирания").

2. Наведите указатель мыши на папку с Batch-файлом.
Нажмите и удерживайте кнопку "Shift". Вместе с этим нажмите правую кнопку мыши.

3. Выберите пункт "Открыть окно команд".



Например, Вам нужно запустить Batch-файл с именем script.cmd, расположенном в папке temp на диске C,
тогда вводим команду:

Bash
1
script > log.txt
Нажимаем клавишу {ENTER}

Этап 3. Анализ файла-протокола.

После завершения работы Batch-файла в папке C:\temp будет создан файл log.txt
Передайте его специалистам, либо при наличии достаточного опыта проведите анализ самостоятельно.

Данный файл сохраняется в кодировке OEM-866, поэтому открывать его нужно в соответствующем редакторе:
Как правило, критические ошибки указаны в самом конце протокола и они предваряют команду, которая их вызвала.

Этап 4. (опционально)
Если бат-файл содержит цикл или является очень большим, полезным также будет подготовить лог уже с командой @echo off
Добавьте ее в самое начало кода и повторите всю процедуру.

Альтернатива вызову батника из-под интерпретатора.
В самом начале кода пишем:
Bash
1
Echo. 1>&3 2>&4 3>log.txt 4>&3
и запускаем Batch-файл.
Все команды, выводимые на экран будут сразу перенаправляться в файл.
Ответ: Перехват ошибки (вывода) консольного окна, запущенного из-под чужого GUI приложения.

Можно выполнить при помощи программы Console Window Interceptor (Автор - Dragokas)

Сфера применения:
Автоматически подключается к любому всплывающему консольному окну и не дает его закрыть по завершению работы (exit).
Перехватывает текст и выводит его в окне формы.

Будет полезен для получения текста консольных приложений, которые нельзя запустить через cmd /c.

Состав: EXE + VB6 src.



-----------------------------------------------------------------------------------------------------------

Пример перехвата ошибки в выводе команды ExecuteFile программы AVZ:

1. Запускаем Console Interceptor.
Выставляем интервал поиска окон в 1 мс.
Нажимаем "Искать консольные окна".

2. Запускаем AVZ. Файл -> Выполнить скрипт:

Pascal
1
2
3
begin
  ExecuteFile('ipconfig', 'flushdns', 1, 0, false);
end.
Запустить. Результат:



В чем ошибка, думаю, сами должны догадаться.

Примечание по ExecuteFile:

Режим (Mode) должен быть обязательно не 0 (видимое окно).
Terminate = false или WaitTime = 0 необязательно выставлять такими.
AVZ в любом случае получит сигнал о завершении работы процесса,
тем не менее консольное окно не закроется, пока к нему подключено в качестве отладчика другое приложение.


Чтобы не повалить перехватчик, необходимо сперва отключиться от консольного окна ("Deattach") кнопкой "Отключиться от окна".
Вопрос: Определение файла в папке, его печать и удаление и зацикливание

Вот мой скрипт

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'On Error Resume Next
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "C:\Users\SergeiSorokin\Desktop\test\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 For Each lFile In lFiles
  PrintFile(gWatchFolder & lFile.Name)
 Next
 WScript.Sleep(1)
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(3)
 'msgbox(pFileName)
 'Мы (больше) не боимся пробелов :Р
 Dim objFS, objShell, objFolderItems
Dim strMask, arrFolders, strArguments, strVerb, intShowMode, strTemp, i, j
 
strMask = "*.pdf": strArguments = "": strVerb = "print": intShowMode = 0
arrFolders = Array("C:\Users\SergeiSorokin\Desktop\test")
Set objShell = CreateObject("Shell.Application")
If objShell.NameSpace(&h4).Items.Count > 1 Then
    Set objFS = CreateObject("Scripting.FileSystemObject")
    For i = 0 To UBound(arrFolders)
        If objFS.FolderExists(arrFolders(i)) Then
            Set objFolderItems = objShell.NameSpace(arrFolders(i)).Items
            objFolderItems.Filter 64 + 128, strMask
            On Error Resume Next
            For j = 0 To objFolderItems.Count - 1
                strTemp = objFolderItems.Item(j).Name
                objShell.ShellExecute strTemp, strArguments, arrFolders(i), strVerb, intShowMode
                If Err.Number = 0 Then
                    WScript.Echo "Задание печати файла " & strTemp & " обработано успешно."
                Else
                    WScript.Echo "Ошибка " & Err.Number & " при печати файла " & strTemp & vbNewLine & Err.Description
                    Err.Clear
                End If
            Next
            On Error GoTo 0
        Else
            WScript.Echo "Не найден путь " & arrFolders(i)
        End If
    Next
    Set objFolderItems = Nothing: Set objFS = Nothing
Else
    WScript.Echo "Не найдено ни одного подключения к принтеру."
End If
Set objShell = Nothing
WScript.Quit 0
gFSO.DeleteFile(pFileName)
 If gFSO.FileExists(pFileName) Then
  'Мало ли чего может случиться, лучше пусть у Иван Иваныча перестанет печатать, чем один файл много раз уйдет на принтер
  'msgbox("Не удалось удалить файл " & pFileName & "! Позвоните Василию по т. 123-456)
  WScript.Quit
 'Else
  'Пока не реализовано
  'ToLog("Файл " & lFileName & " удален.")
 End If
End sub
Что происходит: при попадании файла в папку печать идет, файл не удаляется. При последующих добавлениях файла в папку ничего не происходит.

Помогите, пожалуйста.

Добавлено через 1 час 17 минут
Всё, сделал, только осталось подправить интервалы времени, чтобы работало без ошибок.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "C:\Users\SergeiSorokin\Desktop\test\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 For Each lFile In lFiles
  PrintFile(gWatchFolder & lFile.Name)
 Next
 WScript.Sleep(1)
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(3)
 'msgbox(pFileName)
 'Мы (больше) не боимся пробелов :Р
 
 Dim objFS, objShell, objFolderItems
Dim strMask, arrFolders, strArguments, strVerb, intShowMode, strTemp, i, j
 
strMask = "*.pdf": strArguments = "": strVerb = "print": intShowMode = 0
arrFolders = Array("C:\Users\SergeiSorokin\Desktop\test")
Set objShell = CreateObject("Shell.Application")
If objShell.NameSpace(&h4).Items.Count > 1 Then
    Set objFS = CreateObject("Scripting.FileSystemObject")
    For i = 0 To UBound(arrFolders)
        If objFS.FolderExists(arrFolders(i)) Then
            Set objFolderItems = objShell.NameSpace(arrFolders(i)).Items
            objFolderItems.Filter 64 + 128, strMask
            On Error Resume Next
            For j = 0 To objFolderItems.Count - 1
                strTemp = objFolderItems.Item(j).Name
                objShell.ShellExecute strTemp, strArguments, arrFolders(i), strVerb, intShowMode
                If Err.Number = 0 Then
                    WScript.Echo "Задание печати файла " & strTemp & " обработано успешно."
                Else
                    WScript.Echo "Ошибка " & Err.Number & " при печати файла " & strTemp & vbNewLine & Err.Description
                    Err.Clear
                End If
            Next
            On Error GoTo 0
        Else
            WScript.Echo "Не найден путь " & arrFolders(i)
        End If
    Next
    Set objFolderItems = Nothing: Set objFS = Nothing
Else
    WScript.Echo "Не найдено ни одного подключения к принтеру."
End If
Set objShell = Nothing
 
 gFSO.DeleteFile(pFileName)
End sub
С интервалами кто может помочь?
Получается, что если в процессе ничего быстро не нажимать то все работает. А если в выскочившем окне быстро нажать "ок", то весь процесс сбивается.

Освещая проблему - настраиваю сетевой принтер, драйверов нормальных не нашлось. Установил PDF принтер.
Теперь настраиваю автоматическую печать с папки. Теперь надо чтобы любой человек не задумывался над тем как это работает, просто печатал.
Ответ: спасибо, у меня тоже заработало

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
'pinter_PDF.vbs
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Установите программу SumatraPDF http://www.softportal.com/software-7568-sumatra-pdf.html
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "E:\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 WScript.Sleep(10000)
 For Each lFile In lFiles 
' msgbox(gWatchFolder) 
 'msgbox(lFile.Name)
  PrintFile(gWatchFolder & lFile.Name)
 Next
 
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(10)
 'msgbox(pFileName)
 'Укажите путь к программе SumatraPDF
 s = """C:\Program Files\SumatraPDF\SumatraPDF.exe""  -exit-on-print -print-to-default   """ & pFileName & """"
 'msgbox (s)
 Call gShell.Run(s,0,true)
 'msgbox(pFileName)
 WScript.Sleep(10)
 gFSO.DeleteFile(pFileName)
 If gFSO.FileExists(pFileName) Then
  'Мало ли чего может случиться, лучше пусть у Иван Иваныча перестанет печатать, чем один файл много раз уйдет на принтер
  msgbox("Не удалось удалить файл " & pFileName & "! Позвоните компьютерщику")
  WScript.Quit
 'Else
  'Пока не реализовано
  'ToLog("Файл " & lFileName & " удален.")
 End If
End sub
 
'Доделывал чужое под себя +7 902 44 00 00 6 Компьютерщик www.2133790.Ru
'брал исходник здесь https://habrahabr.ru/post/112404/ и спасибо автору за ответы на мои вопросы
'отсюда http://autoit-script.ru/index.php?topic=21264.0
'и отсюда http://www.cyberforum.ru/vbscript-wsh/thread1445205.html
Добавлено через 5 минут
Вопрос: Кодировка имени файлов и папок

Здравствуйте. У меня вопрос связанный с кодировочными таблицами в операционных системах. Изрыл весь интернет по своему вопросу, 3 дня искал на разных поисковиках, ответа так и не нашёл, возможно кто-то из спецов здесь поможет в данном вопросе?

Windows XP/Vista/7 - в них я создаю файл/папку и первым-же делом машина мне присваивает на файл/папку имя ("Новая папка" или "Текстовый документ.txt") дальше уже меняешь имя как хочешь, т.е. ни файл ни папка вообще без имени существовать не могут.

Вопрос такой: в какой кодировке он мне прописал это русское имя созданной папки/файла? Например винда русская делает это в ASCII но если я создам папку/файл в Linux Ubuntu 14.04 с русским именем, то он мне должен русские символы создать в UTF-8, но как это проверить??? ведь в убунте может для русских автоматически тот-же ASCII использовать??? И проблема в том, что когда я всё это скину на USB-флешку и воткну её в др. систему, например Mac OS X у меня будет что-то вроде: лдвтлдмвы если конечно-же в Маке нет ASCII <- будет ли такое на самом деле?

И вообще, как проверить кодировку русских символов ? Например я хотел в какой нить оси (пусть даже portable или урезанной) найти её кодировочные таблицы, удалить все кроме UTF-8 (русской/китайской/корейской) и на ней я сразу бы знал что пишу я имя файла русскими символами из кодовой таблице UTF-8, вставив флешку с папками/файлами сразу бы увидел кракозябры которые могут быть чем угодно но не UTF-8 и *знал бы это* - своего рода получился бы детектор кодировок не utf8.

В поисках места нахождения кодировочных таблиц у windows xp понял что их там тупо нет! она использует псевдо-кодировку вытаскивая всякие символы из всяких там шрифтов так чтоб в итоге соответствовало кодовым стандартным таблицам, но самих таблиц нет.

Может кто нибудь посоветовать операционную систему, которая использует кодовые таблицы, в которой я оставлю только таблицы utf8 - разных языков, в том числе и русских симвоов (система не запорится т.к. ось пишется на англ. символах и цифрах а их местоположение во всех кодировках одинаково (вроде))...

Или может ли помочь какой нить дистрибутив который не знает ASCII будет писать русские имена файлов в utf? но тут ещё вопрос, мне нужен именно utf-8, не 16 не 32 не KOI*** а именно utf8.

Хочу называть файлы и папки русскими в перемешку с корейскими/китайскими символами (это будет перемешка utf8-русский/utf8-8-корейский/utf8-китайский), нужен мировой стандарт и лучше чем кодировку utf-8 для этого не нашёл.
Ответ: Вобщем, проблему я пока что так и не решил... Может кто подскажет что я сделал не так?

Напомню - вопрос в том, что нужно определить кодировку в именах файлах и папок в маздае (Windows) интересует исключительно UTF-8 а не всякие cp-1251, cp-1252 (+расширенная), koi8-r и прочая маздаевская фигня т.к. написав имена файлов и папок в винде русскими символами в других системах будут каракули а UTF-8 считается как мировой эталон и определится нормально в любой среде (если у неё есть русская лаколизация)...

Я сделал следующее: Установил Ubuntu 14.04 на USB-HDD, загрузился с неё, просмотрел список установленных локалей командой: locale -a

удалил лишние локали кроме интересующих меня английской.utf8 и русской.utf8 командой: sudo locale-gen --purge en_US.utf8 ru_RU.utf8 && echo "Success!"

сново проверил удалилось ли ненужное: locale -a

он мне выдал: С.UTF8
en_US.UTF8
POSIX
ru_RU.UTF8
т.е. всё казалось бы нормально.... (и тут Остапа понесло)... Подключаю HDD с маздаем (или монтирую ntfs, неважно), открываю... а там - ВСЁ НОРМАЛЬНО!!! --- КАК??? Я удалил все русские локали кроме UTF8 RUS.

Винда имена файлов пишет в 1251 или кои8? Убунту не должна была прочитать правильно эти русские виндовские шрифты т.к. я 1251 и кои8 локали УДАЛИЛ!!! а убунта их видет правильно (мне нужны были кракозябры!) а так получается что Windosw XP SP3 имена файлов и папок пишет мне в UTF8 ???? Иначе как объяснить это явление?

Решил попробовать другой момент, в Тотал Коммандоре у меня стоит плагин (Транслятор) в котором я русские имена файлов и папок переделываю в UTF8 и он мне их тут-же переименовывает в каракули, но когда я гружу Ubuntu то она эти каракули так-же видет как и винда - не распознаёт, КАК??? на убунте же Ru-UTF8 локаль стоит!!! Что за бред? Выходит что мне Тоталовский транслятор переименовывает не в UTF8 (саму кодировку) а в бредятину как оно бы отображалось если бы у меня винда не понимала бы UTF8 ???

Вобщем вопрос: так и не понят, почему Убунту, имеющая только русский утф8 отлично распознаёт виндовский русский (или винда мне их уже в утф8 катает или в убунте что-то не удалено)

Для доказательства того, что локаль правильно отображается внутри файла я в тегах .ogg и .mp3 написал коменты на русском (в винде), убунта распознала русский тег в .ogg нормально т.к. по "паспорту" в .ogg теги заносятся с кодировкой UTF8 а вот .mp3 показала мне убунта каракули (как и должно быть, т.к. мп3-теги в утф16 кодировки а я её в убунте удалил) Но вот почему сами имена файлов и папок русские написаные в маздае продолжают распознаваться в Убунте - я не могу понять. Если есть у кого идеи - отпишитесь...
Вопрос: Перемещение всех файлов с подпапок в корневую директорию, перемещение обратно

Здравствуйте, немного предыстории: у человека потерялись файлы на флэшке, я занялся их восстановлением, на свою голову нашёл занятие на выходные (язык мой - враг мой), большинство было Word'всяких документов 3х форматов doc, docx и TMP, папок на этой флешке просто очень много, да к тому же и в каждой папке есть файлы и подпапки - я с 12 часов успел только 4 папки обработать с подпапками полностью. 1) Могу ли я Вас, уважаемые жители форума, попросить написать BAT файл, который все файлы в подпапках скопирует в один каталог, откуда программе по восстановлению будет удобнее сканировать файлы?
Программа тоже хитро устроена, каждый файл после восстановления она кидает в
Код Code
1
[Папка в которую будут скидываться восстановленные файлы]\[<название документа>.<расширение которое было у файла до восстановления>]\<название документа>.doc
(то есть имена, за исключением расширения сохраняются такими какими были) - но думаю 1й батник и с этим справится
!Но в некоторых папках всё-же могут попасться одинаковые файлы - особенно файлы TMP - они же временные, так что в каждой папке они почти одинаково называются и номеруются - например: xWRL1208.TMP
2) Нужен батник, который сравнивает две папки на наличие файлов <filename>.<*> и если в папке 1 есть такой файл, которого нет в папке 2, то такой файл переносится в папку 1/Не восстановленно.
---
Это относится к 1-му батнику - В подпапках папки 1 могут присутсвовать папки с названием "Открываютя" - нужно их игнорировать.
Ответ: Ваш подход с восстановлением в корне неверный.

Каждое обращение к флеш-накопителю уменьшает шансы на успешное восстановление.
Происходит размагничивание. Работать нужно с образом. Потратите час, ну может, 2 времени.

Цитата Сообщение от Drink
Создайте образ флешки в файл, например, в DMDE: запустить, нажать Отмена, потом Сервис - Копировать секторы - где Источник - выбрать Диск - выбрать флешку, где Место для записи - выбрать ФАЙЛ (!), сохранить в директории на жд. Будет образ (файл), с которым работайте. Сделайте его копию. Этот файл и открывайте в программах восстановления, которые это позволяют. Внимательнее с dmde, не перепутайте диски.

Потом попробуйте recuva free с этой флешкой, для начала.
Вопрос: Удаление "неудаляемых" файлов и папок в Microsoft Windows

 
 
Задавая вопрос, обязательно указывайте свою ОС и тип файловой системы!
Перед тем как спрашивать здесь, попробуйте воспользоваться следующими советами:
  1. Возможно, что на файле просто стоит атрибут Read-Only. Снять его можно командой:
    attrib -R file
     
  2. Файл может не удаляться, так как используется каким ни будь процессом. Узнайте каким и завершите его. Сама замечательную утилиту от SysInternals.
     
    Кроме того, вам поможет программа
     
  3. Попробуйте удалить с помощью файлового менеджера FAR через его функцию "Уничтожить файл" (wipe the file) которая вызывается по Alt+Del. (Это отлично работает даже в таком сложном случае: русское имя с пробелами и с точкой в конце. Проверено на FAR version 1.70 beta 3)
     
  4. Напрямую невозможно удалить файлы/папки с зарезервированными именами устройств, такими как AUX, CON, COM1, PRN или LPT1. Решение описано в статье kb :
    Код:
    Попробуйте удалить командой DEL (для файлов) или RD (для каталогов), при этом
    - для FAT используйте wildcards ? и *:
       DEL PR?.*
       DEL LPT?.*

    - на NTFS подставляйте перед буквой диска \\.\ или \\?\
       DEL \\.\c:\prn\foo\ltp1

  5. Если не удаляется файл на NTFS, у которого не указан владелец, перед удалением сделайте владельцем пользователя, от которого вы будете удалять это файл. (Назначить владельца можно, имея права администратора, логично его и сделать владельцем.)
     
  6. При проблемах с удалением файлов с длинными именами пробуем через
    Если слишком длинное полное имя (с путём) - можно сделать следующее:
    текущий каталог расшарить с полным доступом - зайти в него и удалить(или подключить как диск и оттуда удалить).
     
  7. Если средствами всё-же не получилось, то попробуйте удалить файл из-под другой ОС.
    Это может быть что-то загружаемое с дискеты или CD, как на пример Recovery Console, DOS-NTFS, WinPE, или LiveCD дистрибутив Linux с поддержкой вашей ФС.
     
  8. Иногда встречается комбинация причин, усложняющая процесс удаления файла. Например, при проблемном имени файла нельзя изменить права доступа с помощью GUI-редактора ACL.
     
    В этом случае можно воспользоваться утилитой Subinacl из Server Resource Kit с параметром /onlyfile  для смены владельца и разрешений на файл, недоступный иным образом, например:
      subinacl /onlyfile "\\?\c:\путь_к_проблемному_файлу" /setowner=Домен\Администратор /grant=Домен\Администратор=F

     
    Данная командная строка изменяет файл C:\путь_к_проблемному_файлу, содержащий конечный пробел, таким образом, что учетная запись Домен\Администратор становится владельцем файла и получает полный доступ к нему. Теперь можно удалить файл с помощью команды Del с тем же синтаксисом «\\?\».
     
    Подробнее см. статью kb
     
  9. Если в папку NTFS примонтирован раздел, то при доступе к нему в рамках ФС базового раздела невозможно удалить файлы/папки в корзину (см. статью kb ).
     
    Т.е. если в папку C:\Большой_Диск примонтирован другой раздел, то файлы с примонтированного раздела нельзя удалять, пользуясь путём через эту папку, например, C:\Большой_Диск\Ещё_куда-нибудь\Удали.Меня
     
    Решение - удалять, минуя корзину (Shift+Del) или удалять в корзину непосредственно на том разделе, а не через точку монтирования
Ответ: Я обратил внимание что иногда, когда FAR отказывается удалять какие-то файлы, помогает RAR m -m0 trash ...
 
Потом я вычитал в соответствующих конференциях что это зависит от того, какие функции из Win32 API и в какой последовательности используются для работы с файловой системой. Поистене велик и загадочен...