戏耍脚本中~奇技淫巧

分割线

参数判空

字符串拼接判定

  • 有时候我们想判断一个变量是不是空的,会变得有些棘手

    if [ ${abc} != "" ]; then
    echo ${abc}
    fi

    我们的想法是判断是否存在 abc 这个变量,实际上这样写并不行,没有这个变量的话会变成下面的样子:

    if [  != "" ]; then
    echo ${abc}
    fi

    这样肯定会报错的


  • 改一下,比如添加冗余校验字符

    abc = "abc";

    if [ a${abc} != a ]; then
    echo ${abc}
    fi

  • bat 中引号也会视为变量一部分,所以:

    if "%DIRNAME%" == "" set DIRNAME=.

    或者:

    set abc=""

    if %abc% == "" (
    echo "abc为空"
    )

    跟 shell 语法差别很大来着, 注意别写错…


语法判定

  • shell 的语法:

    if [ -n "${abc}" ]; then
    echo ${abc}
    fi
  • bat 语法:

    if not defined abc (
    echo 'abc' not defined.
    )

程序占用-后台启动

aria2

  • 如果你用过 aria2 的话肯定会遇到一个头疼的事: 如何开机后台自动启动它

    1. 它的程序本身不带有开机启动,需要另外写启动脚本

    2. 它无法后台启动,必然会占据一个控制台程序的前台

  • 网上找到了比较好用的方法: vbs 脚本

    由于我平时用 bat 管理电脑,单独编写执行一个 vbs 脚本略显多余,所以直接结合进 bat 脚本里,用完就删针刺激:

    echo CreateObject("WScript.Shell").Run "aria2c --conf-path=D:\Game\Scoop\persist\aria2\conf",0 > aria2.vbs
    cscript //Nologo aria2.vbs
    del aria2.vbs
  • 后来又发现一个更好的: 用 powershell 后台启动 [3]

    powershell Start-Process -WindowStyle hidden aria2c.exe --conf-path=D:\Repos\Weidows-projects\Keeper\Programming-Configuration\others\aria2\aria2.conf

套娃

如上, sharemouse 也存在这问题, 通过套娃解决了:

start /b cmd /c "C:\Program Files (x86)\ShareMouse\ShareMouse.exe"

分割线

echo

其一

  • 看到一个脚本中这么写,乍一看蒙了:

    CLS&ECHO.&ECHO 完成, 以下选项自选:
    ECHO.&ECHO 1、启用视频播放程序(会驻留进程)
  • 实际上只是把几个命令压缩到了一行

    cls   # 清屏
    echo. # 换行

其二

echo "hello world" | xargs echo

脱裤子放一个颇有技巧的新活屁

分割线

Scoop

portable

我们可以通过创建虚拟链接把 C 盘中的 runtime 数据 -> scoop/persist 内

  • 此片段可自动判断 remix-ide / .remix-ipfsnode / .cache_remix_ide 所在目录是 USERPROFILE / APPDATA

    并将数据移动到 persist 内,创建虚拟链接

    需要注意只能是文件夹,不能是文件!!!

    "foreach ($folder in @('remix-ide', '.remix-ipfsnode', '.cache_remix_ide')) {",
    " if (Test-Path \"$env:USERPROFILE\\$folder\") {",
    " $runtimeCache = \"$env:USERPROFILE\\$folder\"",
    " $runtimeCachePersist = \"$persist_dir\\USERPROFILE\\$folder\"",
    " } else {",
    " if (Test-Path \"$env:APPDATA\\$folder\") {",
    " $runtimeCache = \"$env:APPDATA\\$folder\"",
    " $runtimeCachePersist = \"$persist_dir\\APPDATA\\$folder\"",
    " } else {continue}",
    " }",
    " if (Test-Path $runtimeCachePersist) {",
    " Remove-Item $runtimeCache -Force -Recurse -ErrorAction SilentlyContinue",
    " New-Item -Type Junction -Path $runtimeCache -Target $runtimeCachePersist | Out-Null",
    " } else {",
    " mkdir $runtimeCache",
    " Move-Item $runtimeCache $runtimeCachePersist -Force",
    " New-Item -Type Junction -Path $runtimeCache -Target $runtimeCachePersist | Out-Null",
    " }",
    "}"
  • 以及配对的 uninstaller:

    "uninstaller": {
    "script": [
    "foreach ($folder in @('remix-ide', '.remix-ipfsnode', '.cache_remix_ide')) {",
    " if (Test-Path \"$env:USERPROFILE\\$folder\") {",
    " $runtimeCache = \"$env:USERPROFILE\\$folder\"",
    " $runtimeCachePersist = \"$persist_dir\\USERPROFILE\\$folder\"",
    " } else {",
    " if (Test-Path \"$env:APPDATA\\$folder\") {",
    " $runtimeCache = \"$env:APPDATA\\$folder\"",
    " $runtimeCachePersist = \"$persist_dir\\APPDATA\\$folder\"",
    " } else {continue}",
    " }",
    " if (!(Test-Path $runtimeCachePersist)) { Move-Item $runtimeCache $runtimeCachePersist -Force -ErrorAction SilentlyContinue }",
    " else { Remove-Item $runtimeCache -Force -Recurse -ErrorAction SilentlyContinue }",
    "}"
    ]
    },

解剖-exe

  • 此片段可以把常见的 .exe -> .exe#/dl.7z 中的文件提取出来

    "Expand-7zipArchive \"$dir\\`$PLUGINSDIR\\app-64.7z\" \"$dir\"",
    "Remove-Item -Recurse -Force \"$dir\\`$PLUGINSDIR\"",

分割线

判断是否含有某字符串

  • 如下,可以判断.gitignore 中是否含有 ‘backup’

    cat %BACKUP_DIR%\.gitignore | findstr backup >nul || (
    echo backup>> %BACKUP_DIR%\.gitignore
    )

分割线

关于目录

@echo off
pwd
echo %0
echo %~dp0
╰─ cmd /c "d:\Repos\Weidows-projects\Keeper\test.bat"
/d/Repos/Weidows-projects/Keeper
d:\Repos\Weidows-projects\Keeper\test.bat
d:\Repos\Weidows-projects\Keeper\

分割线

XML-error

error on line 228 at column 35: Input is not proper UTF-8, indicate encoding !

这个报错它的意思是有字符并不是 UTF-8 编码, 虽然它报错指明的文件位置是对的, 但是 line/column 有可能不对

比如 jupyter-lab 运行的输出有时候会带有 XML 不支持的特殊符号 [1] (即使 echo $LANG 是 UTF-8)

解决办法就是通过 UTF-8 编码打开, 把这种符号全删掉保存 (参见脚本)

分割线

删除所有文件下下某文件

/mnt/test_data/Movie/1/a.txt
/mnt/test_data/Movie/2/a.txt
/mnt/test_data/Movie/3/a.txt
/mnt/test_data/Movie/4/a.txt

如上, 想批量删除 1,2,3,4 文件夹下的 a.txt 文件 [2]

find /mnt/test_data/Movie/ -maxdepth 3 -name output_face | xargs rm -rf

分割线

latex2word

  1. pandoc -s 1.md -o 1.docx
  2. typora 导出
  3. obsidian 搜索并安装 pandoc 插件, 导出

分割线

借物表

[1]: Input is not proper UTF-8, indicate encoding !错误处理

[2]: xargs 命令教程 - 阮一峰的网络日志

[3]: windows 通过 cmd 后台运行进程方法cmd 后端运行吉吉教主的博客-CSDN 博客