我試圖調用一個接受參數的Python腳本來備份VMware中的PostgreSQL數據庫。使用參數執行python
代碼是這樣的:
# 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
如果我把一個斷點,我可以顯示變量$executebackup
,它會顯示這樣的:
"C:\backup_win.py " -p "QX+qos5eu1D36&kB" -f "D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak"
這引發錯誤:
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
有趣的是關於這個,我正在運行這個的盒子是Windows 2012 R2。這個SAME腳本在Windows 2008 R2上完美運行。
咦?
嘛,所以我認爲正在發生的事情是在我傳遞到python.exe
該命令的雙引號被打亂的作品,所以我改變了一點:
$executebackup = $BackupScriptFile + ' -p "QX+qos5eu1D36&kB" -f ' + $fullFileSave
導致的輸出這一點,如果我把它回顯到屏幕(注意周圍的文件路徑不包括引號):
C:\backup_win.py -p "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1050.bak
但返回此錯誤:
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
我真的被卡住了,我相信這是簡單的,專家可以在5秒內調整..我的大腦已煮熟,我不知道接下來要嘗試什麼。最讓我感到迷惑的部分是,它在Windows 2008上運行良好,但在2012年沒有問題。
這是一件非常有趣的事情。如果我參加了$executebackup
的輸出:
C:\backup_win.py -p "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak
並將其粘貼到PowerShell控制檯它工作得很好。
PS C:\Users\Administrator>C:\backup_win.py -p "QX+qos5eu1D36&kB" -f D:\pgbackups\torwpinf002_postgresdb_bk_20160715_1058.bak Backup completed successfully.
有關如何從腳本內執行此操作的任何想法?
那方式會工作,但問題是我必須動態地建立命令,所以路徑必須放入字符串..當我建立的字符串與正確的值它炸彈..(幾乎就像它不能鰭python.exe或.py腳本),但從控制檯中的命令行它沒有問題.. – user6594922
好的,這是奇怪的..你的方式工作..我剛剛取代了這樣的動態路徑和文件名var $ PARAMS = $ backupscriptFile, '-p', 「QX + qos5eu1D36與KB」, '-f',$ fullfileSave &python.exe @params 和它的工作就像一個魅力。現在真正讓我瘋狂的是,爲什麼我之前編寫的腳本在2008年的作品中沒有和問題,但我必須像上面那樣更改它以在Windows 2012上運行...該死的你窗戶! – user6594922
因此,讓我問你,我是否應該在2008盒子上以相同的方式運行腳本?我的意思是,在PowerShell中運行命令的首選方式是? (標準化編碼) – user6594922