Những gì bạn đang cố gắng thực hiện sẽ không hoạt động, bởi vì mã của bạn sẽ không truy cập được show databases;
cho đến khi bạn thoát khỏi mysql.exe
. Cách thông thường để sử dụng mysql.exe
từ một tập lệnh là chạy tệp thực thi với mỗi truy vấn:
$db = 'testasset'
$user = 'asset'
$pass = 'test'
$mysql = 'C:\Users\I16A1\Downloads\mysql\bin\mysql.exe'
$params = '-u', $user, '-p', $pass, $db
& $mysql @params -e 'SHOW DATABASES'
& $mysql @params -e '...'
...
Sử dụng phân tách để cung cấp các thông số chung.
Thông thường, bạn cũng sẽ thêm các tham số -B
(--batch
, thực thi không tương tác, không có định dạng đầu ra ưa thích) và -N
(--skip-column-names
, không hiển thị tiêu đề cột trong đầu ra) để có được đầu ra "dễ tiêu hóa" hơn như thế này:
information_schema mysql performance_schema test
thay vì nhận đầu ra mặc định như thế này, điều đó sẽ yêu cầu phân tích dữ liệu ra khỏi bảng để xử lý thêm:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+
Như đã nói, một cách tiếp cận tốt hơn nhiều so với làm việc với máy khách dòng lệnh sẽ là sử dụng .Net Trình kết nối , ví dụ. như thế này:
$server = 'localhost'
$db = 'testasset'
$user = 'asset'
$pass = 'test'
$cs = "server=$server;user id=$user;password=$pass;database=$db;pooling=false"
[void][Reflection.Assembly]::LoadWithPartialName('MySQL.Data')
$cn = New-Object MySql.Data.MySqlClient.MySqlConnection
$cn.ConnectionString = $cs
$cn.Open()
$cmd= New-Object MySql.Data.MySqlClient.MySqlCommand
$cmd.Connection = $cn
$cmd.CommandText = 'SHOW DATABASES'
$reader = $cmd.ExecuteReader()
$tbl = New-Object Data.DataTable
$tbl.Load($reader)
$reader.Close()
$cn.Close()
$tbl | Format-Table -AutoSize
Bằng cách đó, đầu ra bạn nhận được sẽ là các đối tượng thực tế thay vì chuỗi.