我试图调用一个接受参数的Python脚本来备份VMware中的PostgreSQL数据库。在
代码如下:
# 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
,它将显示以下内容:
这会引发错误:
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
有趣的是,我正在运行的是Windows2012 R2。同样的脚本在windows2008r2上运行得非常好。在
嗯?在
好吧,所以我认为我传递给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秒钟内调整。。我脑子进水了,不知道下一步该怎么办。最让我恼火的是,它在Windows2008上运行良好,但在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.
有什么想法可以让它在脚本中执行?在
不要将命令行定义为字符串(除非您想通过
Invoke-Expression
,which I wouldn't recommend在大多数情况下运行它)。只需使用call operator(&
)并像在控制台中那样放置参数:如果参数不同,可以将它们放入数组中,并在调用
^{pr2}$python.exe
时将其放入splat:相关问题 更多 >
编程相关推荐