我的 NAS 上有一个非常小的、非必需的数据库,它将每周由一个小的 Bash 脚本备份 that is a modified version of this link's one :
outpath='/media/backupfiles/mysql_data'
dumpdate=$(date +"%Y-%m-%d")
mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > ${outpath}/mysqldump_${dumpdate}.sql.gz
此脚本完美运行。但是,我对 Bash 不太熟练,而我喜欢使用 PowerShell 编写代码。自然地,我想创建一个模拟的 PowerShell 脚本:
param(
[string]$OutPath = "/media/backupfiles/mysql_data",
[string]$DumpBaseName = "mysqldump_$(Get-Date -Format "yyyy-MM-dd").sql"
)
mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 > $($OutPath)/$($DumpBaseName).gz
为了启动脚本,我首先以 root
启动控制台,然后启动 powershell
,然后启动脚本 /home/mysqldump.ps1
.
不幸的是,上面的脚本不起作用:
out-file : Access to the path '/media/backupfiles/mysql_data' is denied.
当我进入
mysqldump --user=xxx --password=xxx --events --all-databases | gzip -7 >/media/backupfiles/mysql_data/test.sql.gz
在控制台中手动生成文件,但它太大(大约是 Bash 版本大小的两倍),本身没有用户权限(这意味着我必须运行 chown
在我可以访问它之前),而且,当我尝试打开它时(使用 7-zip 或使用 gzip -d
),两者都告诉我文件无法打开并且它不是 gzip 格式。
然后我尝试:
Start-Process mysqldump -ArgumentList " --user=xxx --password=xxx --events --all-databases | gzip -7 > /media/backupfiles/mysql_data/test.sql.gz"
这也失败了:
mysqldump: unknown option '-7'
对我来说,管道/重定向运算符似乎是问题所在。不幸的是,对于如何使这个脚本工作(没有中间文件或脚本),我没有更多的想法。这次互联网并没有太大帮助,但是,这可能是我搜索错误的东西造成的。
有什么我遗漏的吗?还是我只是想获得(尚未)在适用于 Linux 的 PowerShell 中实现的功能?
使用的软件:
- 操作系统:openmediavault 3.0.88(即 Debian 4.9.30-2+deb9u2~bpo8+1 2017-06-27)x86_64 GNU/Linux)
- PowerShell:v6.0.0-beta.6
- gzip:1.6
- mysqldump:Ver 10.13 Distrib 5.5.57
最佳答案
PowerShell 中的 >
重定向运算符与 | 的作用相同输出文件
。 Out-File
的默认编码是 Unicode(准确地说是 UTF-16 LE),不能为重定向运算符更改。
替换
... > $($OutPath)/$($DumpBaseName).gz
无论是
... | Out-File "${OutPath}/${DumpBaseName}.gz" -Encoding Ascii
或
... | Set-Content "${OutPath}/${DumpBaseName}.gz"
Set-Content
cmdlet 默认为 ASCII 输出。
不过,就我个人而言,我会坚持使用 bash 来完成这样的任务。您正在使用外部命令将文本转储写入(压缩的)输出文件,因此您没有在任何地方利用 PowerShell 功能。 bash 和 PowerShell 代码之间的唯一区别是 PowerShell 代码具有带默认值的参数。您可以通过参数扩展在 bash 中做类似的事情:
outpath="${1:-'/media/backupfiles/mysql_data'}"
dumpdate="${2:-$(date +"%Y-%m-%d")}"
上面的代码将第一个和第二个位置参数(如果缺少参数则指定默认值)分别分配给变量$outpath
和$dumpdate
。不过,这里的订单很重要。如果您希望能够彼此独立地指定参数(例如,将日期作为参数传递,而不是路径),您需要这样的代码:
while getopts ':do' opt; do
case "$opt" in
d) dumpdate="$OPTARG";;
o) outpath="$OPTARG";;
\?) echo "Invalid option: -${OPTARG}"; exit 1;;
esac
done
shift $((OPTIND-1))
outpath="${outpath:-'/media/backupfiles/mysql_data'}"
dumpdate="${dumpdate:-$(date +"%Y-%m-%d")}"
关于mysql - Debian 8 上的 PowerShell - 从 mysqldump 到 gzip 的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46157211/