在powershell脚本中运行mysqldbcompare

在powershell脚本中运行mysqldbcompare,mysql,powershell-2.0,Mysql,Powershell 2.0,我正在尝试从PowerShell中执行mysqldbcompare 基本命令是: mysqldbcompare--server1=用户名:password@1.2.3.4:3306--server2=用户名:password@5.6.7.8:3306 dbname:dbname--运行所有测试--更改=server2--跳过数据检查--跳过行计数--跳过表选项--禁用二进制日志记录-dsql 当在标准cmd窗口中运行时,此功能可以正常工作 但是,我需要相关的部分是动态的,因此我有如下内容: #S

我正在尝试从PowerShell中执行
mysqldbcompare

基本命令是:

mysqldbcompare--server1=用户名:password@1.2.3.4:3306--server2=用户名:password@5.6.7.8:3306 dbname:dbname--运行所有测试--更改=server2--跳过数据检查--跳过行计数--跳过表选项--禁用二进制日志记录-dsql

当在标准cmd窗口中运行时,此功能可以正常工作

但是,我需要相关的部分是动态的,因此我有如下内容:

#Server 1
$user1    = "username"
$pass1    = "password"
$db1addr  = "1.2.3.4"
$db1Port  = "3306"
$schema1  = "dbname"

#Server 2
$user2    = $user1
$pass2    = $pass1
$db2addr  = "5.6.7.8"
$db2port  = $db1port
$schema2  = $schema1
然后我试着跑步

& 'mysqldbcompare --server1=$user1:$pass1@$db1addr:$db1Port --server2=$user2:$pass2@$db2addr:$db2Port $schema1:$schema2 --run-all-tests --changes-for=server2 --skip-data-check --skip-row-count --skip-table-options --disable-binary-logging -dsql'

我也尝试过“构建”命令,例如

$args = @("--server1=".$user1.":".$pass1."@".$db........
这也失败了

大多数错误倾向于类似于:

mysqldbcompare.exe : Usage: mysqldbcompare.exe --server1=user:pass@host:port:socket --server2=user:pass@host:port
:socket db1:db2
At C:\dbCompare.ps1:27 char:2
+ & <<<<  'mysqldbcompare' $args
    + CategoryInfo          : NotSpecified: (Usage: mysqldbc...:socket db1:db2:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError


mysqldbcompare.exe: error: Server1 connection values invalid: Connection '$db1addr:$db1Port' cannot be parsed. Pl
ease review the used connection string (accepted formats: <user>[:<password>]@<host>[:<port>][:<socket>] or <logi
n-path>[:<port>][:<socket>]).
mysqldbcompare.exe:用法:mysqldbcompare.exe--server1=用户:pass@host:端口:套接字--server2=用户:pass@host:端口
:socket db1:db2
在C:\dbCompare.ps1:27 char:2

+&您的第三种方法几乎是正确的,只是使用了单引号字符串。单引号用于定义文字字符串,无需任何扩展。要在字符串中展开变量/表达式,必须使用双引号

演示:

PS C:\>$s='foo'
PS C:\>'-$s-'
-$s-
私人秘书长:\>“-$s-”
-foo-
此外,如果变量名后面跟一个冒号,则需要在其周围加上大括号,因为PowerShell将
$
之间的字符解释为作用域名称

演示:

PS C:\>$s='foo'
PS C:\>“$s:23
PS C:\>“${s}:23”
foo:23
更改此项:

$args=@('--server1=$user1:$pass1@$db1addr:$db1Port',
“--server2=$user2:$pass2@$db2addr:$db2Port”,
“$schema1:$schema2”,
“--运行所有测试”,
“--server2的更改”,
“--跳过数据检查”,
“--跳过行计数”,
“--跳过表选项”,
“--禁用二进制日志记录”,
“-dsql”
)
&“mysqldbcompare”$args
为此:

$args=“--server1=${user1}:${pass1}@${db1addr}:${db1Port}”,
“--server2=${user2}:${pass2}@${db2addr}:${db2Port}”,
“${schema1}:$schema2}”,
“--运行所有测试”,
“--server2的更改”,
“--跳过数据检查”,
“--跳过行计数”,
“--跳过表选项”,
“--禁用二进制日志记录”,
“-dsql”
&“mysqldbcompare”$args

这个问题应该会消失。

试试
$args=@(“--server1=${user1}:${pass1}${db1addr}:${db1Port}”,…)
。变量不会在单引号字符串中展开。花括号是为了确保冒号不会被解释为作用域运算符。这已经解决了问题。
$args = @("--server1=".$user1.":".$pass1."@".$db........
mysqldbcompare.exe : Usage: mysqldbcompare.exe --server1=user:pass@host:port:socket --server2=user:pass@host:port
:socket db1:db2
At C:\dbCompare.ps1:27 char:2
+ & <<<<  'mysqldbcompare' $args
    + CategoryInfo          : NotSpecified: (Usage: mysqldbc...:socket db1:db2:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError


mysqldbcompare.exe: error: Server1 connection values invalid: Connection '$db1addr:$db1Port' cannot be parsed. Pl
ease review the used connection string (accepted formats: <user>[:<password>]@<host>[:<port>][:<socket>] or <logi
n-path>[:<port>][:<socket>]).