Skip to content

Commit cda0dff

Browse files
committed
add optional external post-processing toolchain, add brief chinese readme
1 parent 1b46078 commit cda0dff

8 files changed

Lines changed: 340 additions & 12 deletions

File tree

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# meta
2+
.vscode/
3+
__pycache__/
4+
5+
# third party tools
6+
tools/*
7+
!tools/README.md
8+
!tools/*.cmd
9+
!tools/busybox.exe

README.md

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ Try interpolating on the hidden vectors of conditioning prompt to make seemingly
3434

3535
⚪ Features
3636

37+
- 2023/01/20: `v2.0` add optional external [post-processing pipeline](#post-processing-pipeline) to highly boost up smoothness, greate thx to [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) and [RIFE](https://github.com/nihui/rife-ncnn-vulkan)!!
3738
- 2023/01/16: `v1.5` add upscale options (issue #12); add 'embryo' genesis, reproducing idea of [stable-diffusion-animation](https://replicate.com/andreasjansson/stable-diffusion-animation) except [FILM](https://github.com/google-research/frame-interpolation) support (issue #11)
3839
- 2023/01/12: `v1.4` remove 'replace' & 'grad' mode support, due to webui's code change
3940
- 2022/12/11: `v1.3` work in a more 'successive' way, idea borrowed from [deforum](https://github.com/deforum-art/deforum-for-automatic1111-webui) ('genesis' option)
@@ -58,6 +59,7 @@ Try interpolating on the hidden vectors of conditioning prompt to make seemingly
5859
- freeze all other settings (`steps`, `sampler`, `cfg factor`, `seed`, etc.)
5960
- note that only the major `seed` will be forcely fixed through all processes, you can still set `subseed = -1` to allow more variances
6061
- export a video!
62+
- follow [post-processing pipeline](#post-processing-pipeline) to get much better result 👌
6163

6264
⚪ Txt2Img
6365

@@ -73,13 +75,18 @@ Try interpolating on the hidden vectors of conditioning prompt to make seemingly
7375
| Eular a | ![i2i-f-euler_a](img/i2i-f-euler_a.gif) | ![i2i-s-euler_a](img/i2i-s-euler_a.gif) | ![i2i-e-euler_a](img/i2i-e-euler_a.gif) |
7476
| DDIM | ![i2i-f-ddim](img/i2i-f-ddim.gif) | ![i2i-s-ddim](img/i2i-s-ddim.gif) | ![i2i-e-ddim](img/i2i-e-ddim.gif) |
7577

76-
Reference image for img2img:
78+
post-processing pipeline (case `i2i-f-ddim`):
7779

78-
![i2i-ref](img/i2i-ref.png)
80+
| w/o. post-processing | w/. post-processing |
81+
| :-: | :-: |
82+
| ![i2i-f-ddim](img/i2i-f-ddim.gif) | ![i2i-f-ddim-pp](img/i2i-f-ddim-pp.gif) |
7983

80-
Embryo image decoded (case `i2i-e-euler_a` with `embryo_step=8`):
84+
other stuff:
85+
86+
| reference image for img2img | embryo image decoded <br/> case `i2i-e-euler_a` with `embryo_step=8` |
87+
| :-: | :-: |
88+
| ![i2i-ref](img/i2i-ref.png) | ![embryo](img/embryo.png) |
8189

82-
![embryo](img/embryo.png)
8390

8491
Example above run configure:
8592

@@ -106,7 +113,7 @@ Hypernet: (this is my secret :)
106113
- prompt: (list of strings)
107114
- negative prompt: (list of strings)
108115
- input multiple lines of prompt text
109-
- we call each line of prompt a stage, usually you need at least 2 lines of text to starts travel (unless in 'grad' mode)
116+
- we call each line of prompt a stage, usually you need at least 2 lines of text to starts travel
110117
- if len(positive_prompts) != len(negative_prompts), the shorter one's last item will be repeated to match the longer one
111118
- steps: (int, list of int)
112119
- number of images to interpolate between two stages
@@ -116,8 +123,8 @@ Hypernet: (this is my secret :)
116123
- `fixed`: starts from pure noise in txt2img pipeline, or from the same ref-image given in img2img pipeline
117124
- `successive`: starts from the last generated image (this will force txt2img turn to actually be img2img from the 2nd frame on)
118125
- `embryo`: starts from the same half-denoised image, see [=> How does it work?](https://replicate.com/andreasjansson/stable-diffusion-animation#readme)
119-
- (experimental): it only processes 2 lines of prompts, and does not interpolate on negative_prompt, and with no FILM postprocessing :(
120-
- genesis_extra_params:
126+
- (experimental) it only processes 2 lines of prompts, and does not interpolate on negative_prompt :(
127+
- genesis_extra_params
121128
- denoise_strength: (float), denoise strength in img2img pipelines (for `successive`)
122129
- embryo_step: (int or float), steps to hatch the common embryo (for `embryo`)
123130
- if >= 1, taken as step cout
@@ -143,6 +150,38 @@ Manual install:
143150
2. (Optional) Restart the webui
144151

145152

153+
### Post-processing pipeline
154+
155+
There are still two steps away from a really smooth and high resolution animation, namely image **super-resolution** & video **frame interpolation** (see `third-party tools` below).
156+
⚠ Media data processing is intrinsic resource-exhausting, and it's also not webui's work or duty, hence we separated it out. 😃
157+
158+
#### setup once
159+
160+
⚪ auto install
161+
162+
- run `tools/install.cmd`
163+
- if you got any errors like `Access denied.`, try run it again until you see `Done!` without errors 😂
164+
- you will have three components: [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN-ncnn-vulkan), [RIFE](https://github.com/nihui/rife-ncnn-vulkan) and [FFmpeg](https://ffmpeg.org/) installed under the [tools](tools) folder
165+
166+
⚪ manually install
167+
168+
- understand the `tools` folder layout => [tools/README.txt](tools/README.txt)
169+
- if you indeed wanna put the tools elsewhere, modify paths in [tools/link.cmd](tools/link.cmd) and run `tools/link.cmd` 😉
170+
- download [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN/releases) (e.g.: `realesrgan-ncnn-vulkan-20220424-windows.zip`)
171+
- (optional) download interesting seperated model checkpoints (e.g.: `realesr-animevideov3.pth`)
172+
- download [rife-ncnn-vulkan](https://github.com/nihui/rife-ncnn-vulkan/releases) bundle (e.g.: `rife-ncnn-vulkan-20221029-windows.zip `)
173+
- download [FFmpeg](https://ffmpeg.org/download.html) binary (e.g.: `ffmpeg-release-full-shared.7z` or `ffmpeg-git-full.7z`)
174+
175+
#### run each time
176+
177+
- check params in [postprocess.cmd](postprocess.cmd)
178+
- pick one way to start 😃
179+
- run `postprocess.cmd path/to/<image_folder>` from command line
180+
- drag & drop any image folder over `postprocess.cmd` icon
181+
182+
ℹ Once processing finished, the explorer will be auto lauched to locate the generated file named with `synth.mp4`
183+
184+
146185
### Related Projects
147186

148187
⚪ extensions that inspired this repo
@@ -155,18 +194,23 @@ Manual install:
155194
- deforum (img2img + depth model): [https://github.com/deforum-art/deforum-for-automatic1111-webui](https://github.com/deforum-art/deforum-for-automatic1111-webui)
156195
- seed-travel (varying seed): [https://github.com/yownas/seed_travel](https://github.com/yownas/seed_travel)
157196

158-
⚪ third-party gives us power
197+
⚪ third-party tools
159198

160199
- image super-resoultion
161-
- Real-ESRGAN: [https://github.com/xinntao/Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN)
162-
- ESRGAN: [https://github.com/xinntao/ESRGAN](https://github.com/xinntao/ESRGAN)
200+
- ESRGAN:
201+
- ESRGAN: [https://github.com/xinntao/ESRGAN](https://github.com/xinntao/ESRGAN)
202+
- Real-ESRGAN: [https://github.com/xinntao/Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN)
203+
- Real-ESRGAN-ncnn-vulkan (recommended): [https://github.com/xinntao/Real-ESRGAN-ncnn-vulkan](https://github.com/xinntao/Real-ESRGAN-ncnn-vulkan)
163204
- video frame interpolation
164-
- FILM: [https://github.com/google-research/frame-interpolation](https://github.com/google-research/frame-interpolation)
205+
- FILM (recommended): [https://github.com/google-research/frame-interpolation](https://github.com/google-research/frame-interpolation)
165206
- RIFE:
166207
- ECCV2022-RIFE: [https://github.com/megvii-research/ECCV2022-RIFE](https://github.com/megvii-research/ECCV2022-RIFE)
167-
- rife-ncnn-vulkan: [https://github.com/nihui/rife-ncnn-vulkan](https://github.com/nihui/rife-ncnn-vulkan)
208+
- rife-ncnn-vulkan (recommended): [https://github.com/nihui/rife-ncnn-vulkan](https://github.com/nihui/rife-ncnn-vulkan)
168209
- Squirrel-RIFE: [https://github.com/Justin62628/Squirrel-RIFE](https://github.com/Justin62628/Squirrel-RIFE)
169210
- Practical-RIFE: [https://github.com/hzwer/Practical-RIFE](https://github.com/hzwer/Practical-RIFE)
211+
- GNU tool-kits
212+
- busybox: [https://www.busybox.net/](https://www.busybox.net/)
213+
- ffmpeg: [https://ffmpeg.org/](https://ffmpeg.org/)
170214

171215
⚪ my other experimental toy extensions
172216

README.zh_CN.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# 提示词跃迁
2+
3+
在模型隐层旅行以制作伪动画,项目 AUTOMATIC1111/stable-diffusion-webui 的插件。
4+
5+
----
6+
7+
对语言理解模型 CLIP 的输出进行插值,从而实现多条提示词之间的语义过渡,产生看似连续的图像序列,或者说伪动画。😀
8+
9+
⚠ 我们成立了插件反馈 QQ 群: 616795645 (赤狐屿),欢迎出建议、意见、报告bug等 (w
10+
11+
ℹ 实话不说,我想有可能通过这个来做ppt童话绘本<del>甚至本子</del>……
12+
ℹ 聪明的用法:先手工盲搜两张好看的图 (只有提示词差异),然后再尝试在其间跃迁 :lolipop:
13+
14+
15+
### 使用方法 & 它如何工作
16+
17+
- 在提示词/负向提示词框里输入**多行**文本,每一行被称作一个**阶段**
18+
- 逐帧生成图像,在每个阶段内,所使用的提示词向量是经过插值运算的
19+
- 为了保证某种连续性,所有其他参数将被固定
20+
- 虽然所有图的主随机数种子将被统一固定,但你仍然可以启用 `subseed` 去增加随机性
21+
- 导出视频!
22+
- 使用额外的 [后处理流程](#post-processing-pipeline) 可以获得更好的画质和流畅度 👌
23+
24+
25+
### 参数选项
26+
27+
- 提示词: (多行文本)
28+
- 反向提示词: (多行文本)
29+
- 就是提示词和反向提示词的输入框,但是你必须输入多行文本,每一行是一个阶段
30+
- 如果提示词和反向提示词的阶段数量不一致,少的那一方会被重复到对齐多的一方
31+
- 插帧数/steps: (整数,或者逗号分隔的多个整数)
32+
- 每个阶段之间插帧的数量
33+
- 若为单个整数,每个阶段使用相同的插帧数量
34+
- 若为西文逗号分隔的多个整数,每个阶段使用不同的插帧数量,比如有4个阶段则可给出3个独立步数:`12, 24, 36`
35+
- 起源/genesis: (选项), 每张图像的内容先验
36+
- `固定/fixed`: 在 txt2img 流程中,始终从高斯噪声开始降噪;在 img2img 流程中,始终从给定的参考图开始降噪
37+
- `连续/successive`: 从上一帧的内容开始降噪 (这会导致 txt2img 流程从第二步开始强制转为 img2img 流程)
38+
- `胚胎/embryo`: 从某个已部分降噪的公共先祖胚胎开始降噪,参考 [=> 原理](https://replicate.com/andreasjansson/stable-diffusion-animation#readme)
39+
- (该功能为实验性质) 只支持两个阶段跃迁,并且不能为逆向提示词插值 :(
40+
- 起源的额外参数
41+
- 降噪强度: (浮点数), 在 img2img 流程中所用的降噪强度 (仅对 `连续/successive` 模式)
42+
- 胚胎步数: (整数或浮点数), 产生公共胚胎的预降噪步数 (仅对 `胚胎/embryo` 模式)
43+
- 如果 >= 1,解释为采样步数
44+
- 如果 < 1,解释为占总采样步数的比例
45+
- 视频相关
46+
- 帧率/fps: (浮点数), 导出视频的帧率,设置为 `0` 将禁用导出
47+
- 文件格式/fmt: (选项), 导出视频的文件格式
48+
- 首尾填充/pad: (整数), 重复首尾帧 `N` 次以留出一段入场/退场时间
49+
- 帧选择器/pick: (切片器), 使用 [Python切片语法](https://www.pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python) 精心选择所需要导出的帧,注意切片发生在填充之前 (例如:设为 `::2` 将只使用偶数帧 , 设为 `:-1` 将去除最后一帧)
50+
- 调试开关: (逻辑值)
51+
- 是否在控制台显示详细日志
52+
53+
54+
### 后处理流程
55+
56+
单凭CLIP模型自身能实现语义插值就已经到达能力天花板了,但我们距离高清丝滑的动画还差两步: **图像超分辨率****视频插帧**
57+
⚠ 多媒体数据的处理是非常消耗资源的,我们不能指望 webui 去做这件事。实际上,我们将其从宿主和插件中分离,出来作为一个可选的外部工具。 😃
58+
59+
#### 安装依赖
60+
61+
⚪ 自动安装
62+
63+
- 运行 `tools/install.cmd`
64+
- 如果遇到诸如 `访问被拒绝` 之类的错误,多次运行直到提示 `Done!` 无错误退出 😂
65+
- 你将安装好 [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN-ncnn-vulkan), [RIFE](https://github.com/nihui/rife-ncnn-vulkan), [FFmpeg](https://ffmpeg.org/) 这三个组件在 [tools](tools) 目录下
66+
67+
⚪ 手动安装
68+
69+
- 参照 [README.md](README.md#post-processing-pipeline)
70+
- 我寻思你既然都想着手动安装了,也不至于不肯咬一口英文罢…… 🤔
71+
72+
#### 运行任务
73+
74+
- 检查 [postprocess.cmd](postprocess.cmd) 中的默认参数
75+
- 你有两种方式启动后处理任务 😃
76+
- 从命令行运行 `postprocess.cmd path/to/<image_folder>`
77+
- 鼠标拖拽任意图片文件夹到 `postprocess.cmd` 的文件图标上然后释放
78+
79+
ℹ 任务完成后,资源浏览器将被自动打开并定位到导出的 `synth.mp4` 文件~
80+
81+
82+
插件直出和加入后处理对比 (配置为 `img2img-fixed-ddim`):
83+
84+
| 插件直出 | 加入后处理 |
85+
| :-: | :-: |
86+
| ![i2i-f-ddim](img/i2i-f-ddim.gif) | ![i2i-f-ddim-pp](img/i2i-f-ddim-pp.gif) |
87+
88+
89+
----
90+
by Armit
91+
2023/01/20

img/i2i-f-ddim-pp.gif

9.48 MB
Loading

postprocess.cmd

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
@REM Test script for post-process pipeline
2+
@ECHO OFF
3+
SETLOCAL
4+
5+
REM =================================================
6+
REM Real-ESRGAN model ckpt
7+
SET RESR_MODEL=realesr-animevideov3
8+
REM image upscale rate, must choose from [2, 3, 4]
9+
SET RESR_UPSCALE=2
10+
REM RIFE model ckpt
11+
SET RIFE_MODEL=rife-v4
12+
REM interpolated frame count, set 0 to simply Nx2
13+
SET RIFE_INTERP=0
14+
REM rendered video fps, higher value requires more interpolations
15+
SET FPS=20
16+
REM =================================================
17+
18+
19+
IF NOT EXIST "%~1" (
20+
ECHO Usage: %~nx0 path/to/^<image_folder^> [-k]
21+
ECHO -k keep cache data for debug
22+
PAUSE
23+
GOTO :EOF
24+
)
25+
26+
SET RESR_HOME=%~dp0tools\realesrgan-ncnn-vulkan
27+
SET RIFE_HOME=%~dp0tools\rife-ncnn-vulkan
28+
SET FFMPEG_HOME=%~dp0tools\ffmpeg
29+
30+
SET RESR_BIN=realesrgan-ncnn-vulkan.exe
31+
SET RIFE_BIN=rife-ncnn-vulkan.exe
32+
SET FFMPEG_BIN=ffmpeg.exe
33+
34+
PATH %RESR_HOME%;%PATH%
35+
PATH %RIFE_HOME%;%PATH%
36+
PATH %FFMPEG_HOME%\bin;%FFMPEG_HOME%;%PATH%
37+
38+
SET IMAGE_FOLDER=%~1
39+
SET RESR_FOLDER="%IMAGE_FOLDER%\resr"
40+
SET RIFE_FOLDER="%IMAGE_FOLDER%\rife"
41+
SET OUT_FILE="%IMAGE_FOLDER%\synth.mp4"
42+
43+
ECHO ==================================================
44+
45+
ECHO [1/5] image super-resolution
46+
IF EXIST %RESR_FOLDER% GOTO skip_resr
47+
MKDIR %RESR_FOLDER%
48+
%RESR_BIN% -v -s %RESR_UPSCALE% -n %RESR_MODEL% -i %IMAGE_FOLDER% -o %RESR_FOLDER%
49+
IF ERRORLEVEL 1 GOTO die
50+
:skip_resr
51+
ECHO ==================================================
52+
53+
ECHO [2/5] video frame-interpolation
54+
IF EXIST %RIFE_FOLDER% GOTO skip_rife
55+
MKDIR %RIFE_FOLDER%
56+
SET NFRAMES=%RESR_FOLDER%
57+
58+
%RIFE_BIN% -v -n %RIFE_INTERP% -m %RIFE_MODEL% -i %RESR_FOLDER% -o %RIFE_FOLDER%
59+
IF ERRORLEVEL 1 GOTO die
60+
:skip_rife
61+
ECHO ==================================================
62+
63+
ECHO [3/5] render video
64+
%FFMPEG_BIN% -y -framerate %FPS% -i %RIFE_FOLDER%\%%08d.png -crf 20 -c:v libx264 -pix_fmt yuv420p %OUT_FILE%
65+
IF ERRORLEVEL 1 GOTO die
66+
ECHO ==================================================
67+
68+
IF NOT "%2"=="-k" (
69+
RMDIR /S /Q %RESR_FOLDER%
70+
RMDIR /S /Q %RIFE_FOLDER%
71+
)
72+
73+
explorer.exe /e,/select,%OUT_FILE%
74+
75+
ECHO ^>^> Done!
76+
ECHO.
77+
GOTO :eof
78+
79+
:die
80+
ECHO ^<^< errorlevel: %ERRORLEVEL%
81+
82+
:eof

tools/busybox.exe

607 KB
Binary file not shown.

tools/install.cmd

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
@REM Auto download and setup post-process tools
2+
@ECHO OFF
3+
SETLOCAL
4+
5+
TITLE Install tools for post-process...
6+
7+
SET CURL_BIN=curl.exe -L -C -
8+
SET UNZIP_BIN=busybox.exe unzip
9+
10+
SET RESR_URL=https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesrgan-ncnn-vulkan-20220424-windows.zip
11+
SET RESR_ZIP=realesrgan-ncnn-vulkan.zip
12+
SET RESR_DIR=realesrgan-ncnn-vulkan
13+
14+
SET RIFE_URL=https://github.com/nihui/rife-ncnn-vulkan/releases/download/20221029/rife-ncnn-vulkan-20221029-windows.zip
15+
SET RIFE_ZIP=rife-ncnn-vulkan.zip
16+
SET RIFE_DIR=rife-ncnn-vulkan
17+
SET RIFE_RDIR=rife-ncnn-vulkan-20221029-windows
18+
19+
SET FFMPEG_URL=https://github.com/GyanD/codexffmpeg/releases/download/5.1.2/ffmpeg-5.1.2-full_build-shared.zip
20+
SET FFMPEG_ZIP=ffmpeg.zip
21+
SET FFMPEG_DIR=ffmpeg
22+
SET FFMPEG_RDIR=ffmpeg-5.1.2-full_build-shared
23+
24+
SET DOWNLOAD_DIR=.download
25+
IF NOT EXIST %~dp0%DOWNLOAD_DIR% MKDIR %~dp0%DOWNLOAD_DIR%
26+
ATTRIB +H %~dp0%DOWNLOAD_DIR%
27+
28+
ECHO ==================================================
29+
30+
ECHO [1/3] install Real-ESRGAN
31+
IF EXIST %~dp0%RESR_DIR% GOTO skip_resr
32+
IF EXIST %DOWNLOAD_DIR%\%RESR_ZIP% GOTO skip_dl_resr
33+
ECHO ^>^> download from %RESR_URL%
34+
%CURL_BIN% %RESR_URL% -o %DOWNLOAD_DIR%\%RESR_ZIP%
35+
IF ERRORLEVEL 1 GOTO die
36+
:skip_dl_resr
37+
ECHO ^>^> uzip %RESR_ZIP%
38+
MKDIR %~dp0%RESR_DIR%
39+
%UNZIP_BIN% %DOWNLOAD_DIR%\%RESR_ZIP% -d %~dp0%RESR_DIR%
40+
IF ERRORLEVEL 1 GOTO die
41+
:skip_resr
42+
ECHO ==================================================
43+
44+
ECHO [2/3] install RIFE
45+
IF EXIST %~dp0%RIFE_DIR% GOTO skip_rife
46+
IF EXIST %DOWNLOAD_DIR%\%RIFE_ZIP% GOTO skip_dl_rife
47+
ECHO ^>^> download from %RIFE_URL%
48+
%CURL_BIN% %RIFE_URL% -o %DOWNLOAD_DIR%\%RIFE_ZIP%
49+
IF ERRORLEVEL 1 GOTO die
50+
:skip_dl_rife
51+
ECHO ^>^> uzip %RIFE_ZIP%
52+
%UNZIP_BIN% %DOWNLOAD_DIR%\%RIFE_ZIP% -d %~dp0
53+
IF ERRORLEVEL 1 GOTO die
54+
RENAME %~dp0%RIFE_RDIR% %RIFE_DIR%
55+
:skip_rife
56+
ECHO ==================================================
57+
58+
ECHO [3/3] install FFmpeg
59+
IF EXIST %~dp0%FFMPEG_DIR% GOTO skip_ffmpeg
60+
IF EXIST %DOWNLOAD_DIR%\%FFMPEG_ZIP% GOTO skip_dl_ffmpeg
61+
ECHO ^>^> download from %FFMPEG_URL%
62+
%CURL_BIN% %FFMPEG_URL% -o %DOWNLOAD_DIR%\%FFMPEG_ZIP%
63+
IF ERRORLEVEL 1 GOTO die
64+
:skip_dl_ffmpeg
65+
ECHO ^>^> uzip %FFMPEG_ZIP%
66+
%UNZIP_BIN% %DOWNLOAD_DIR%\%FFMPEG_ZIP% -d %~dp0
67+
IF ERRORLEVEL 1 GOTO die
68+
RENAME %~dp0%FFMPEG_RDIR% %FFMPEG_DIR%
69+
:skip_ffmpeg
70+
ECHO ==================================================
71+
72+
ECHO ^>^> Done!
73+
ECHO.
74+
75+
ATTRIB -H %~dp0%DOWNLOAD_DIR%
76+
RMDIR /S /Q %~dp0%DOWNLOAD_DIR%
77+
78+
PAUSE
79+
GOTO :eof
80+
81+
:die
82+
ECHO ^<^< errorlevel: %ERRORLEVEL%
83+
84+
:eof

0 commit comments

Comments
 (0)