Tôi đang cố gắng gọi một tập lệnh Python chấp nhận các đối số để sao lưu cơ sở dữ liệu PostgreSQL trong VMware.
Mã như thế này:
# path to where you want to save the backup to
$filepath = "D:\pgbackups\"
# filename you want to call the backup
$filename = "torwpinf002_postgresdb_bk_"
# format the date/time so you can append to the backup filename
$filedate = get-date -Format "yyyyMMdd_HHmm"
# pack it all together
$fullFileSave = $filepath + $filename + $filedate.ToString[] + ".bak"
$BackupScriptFile = "C:\backup_win.py"
$executebackup = "`"$BackupScriptFile`"" + ' -p "QX+qos5eu1D36&kB" -f ' + "`"$fullFileSave`""
python $executebackup
Nếu tôi ném điểm dừng, tôi có thể hiển thị biến $executebackup
và nó sẽ hiển thị điều này:
"C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
Điều này ném lỗi:
python : usage: backup_win.py [-h] -p PASSWORD -f BACKUP_FILE At C:\Program Files\VMware\vCenter Server\python\torwpinf002_pgbackup.ps1:39 char:1 + python $executebackup + ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: [usage: backup_w... -f BACKUP_FILE:String] [], RemoteException + FullyQualifiedErrorId : NativeCommandError backup_win.py: error: argument -p is required
Điều buồn cười về điều này là, hộp tôi đang chạy cái này là Windows 2012 R2. Kịch bản tương tự này hoạt động hoàn hảo trên Windows 2008 R2.
Huh?
Chà, vì vậy tôi nghĩ những gì đang xảy ra là các trích dẫn kép trên lệnh tôi đang chuyển vào python.exe
đang làm hỏng các tác phẩm, vì vậy tôi đã thay đổi nó một chút:
$executebackup = $BackupScriptFile + ' -p "QX+qos5eu1D36&kB" -f ' + $fullFileSave
dẫn đến đầu ra của điều này nếu tôi lặp lại nó với màn hình [thông báo không có báo giá xung quanh đường dẫn tệp]:
C:\backup_win.py -p "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak
Nhưng điều đó trả về lỗi này:
python.exe : C:\Program Files\VMware\vCenter Server\python\python.exe: can't open file 'C:\backup_win.py -p QX+qos5eu1D36&kB -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050': [Errno 22] Invalid argument At line:1 char:1 + python.exe $executebackup + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: [C:\Program File...nvalid argument:String] [], RemoteException + FullyQualifiedErrorId : NativeCommandError
Tôi thực sự bị mắc kẹt, tôi chắc chắn rằng điều đó đơn giản là các chuyên gia có thể điều chỉnh trong 5 giây .. Bộ não của tôi được nấu chín và tôi không chắc chắn nên thử gì tiếp theo. Phần làm tôi khó chịu nhất là nó hoạt động tốt trên Windows 2008 nhưng không phải vào năm 2012.
Đây là một cái gì đó thực sự buồn cười. Nếu tôi lấy đầu ra của $executebackup
:
C:\backup_win.py -p "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak
Và dán nó vào bảng điều khiển PowerShell, nó hoạt động tốt.
PS C:\Users\Administrator> C:\backup_win.py -p "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak Backup completed successfully.
Bất kỳ suy nghĩ về làm thế nào để có được điều này để thực thi từ trong kịch bản?
Mục đích của trang này là để chứng minh cách truyền các đối số cho các tập lệnh Python thông qua các tập lệnh PowerShell. Trong Terminal PowerShell, bạn có thể gõ chúng theo nghĩa đen. Nhưng trong các tập lệnh PowerShell, bạn phải sử dụng các biến. Tôi cung cấp các ví dụ về các đối số vị trí cũng như các tùy chọn bằng cách sử dụng Argparse [việc thực hiện các đối số từ khóa nội bộ của Python].1. Đối số vị trí bằng cách sử dụng sys.argv trong mã Python
PowerShell WrapperPyThon Script sử dụng `` belete` arg được truyền qua PowerShell
1 để phân tích đối số để biểu thị hành vi không mặc định"C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
2 để xóa thực tế qua API"C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
3 để thực hiện xóa hoặc "C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
4 cho bản vá mặc định"C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
2. Tùy chọn [đối số từ khóa] Sử dụng mô -đun ArgParse trong mã Python
trình bao bọc PowerShell có các đối số được đặt tên cho khóa và giá trị được sửa đổi các đối số phân tích tập lệnh python với mô -đun argparse
5 và "C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
6] là một phần của biến "C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
7"C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
Liên kết