符号是否需要转义?
Does the ampersand need to be escaped?
我正在尝试在 python 2.7.8 中创建一个函数来删除远程 PC 上不再需要的文件。
如果我从命令行 运行 它,我可以这样做:
C:\>del /f /q \RemotePC\d$\temp\testfile.txt && if exist \RemotePC\d$\temp\testfile.txt (set errorlevel=1) else (set errorlevel=0)
由此我得到了预期的结果:
C:\>echo %errorlevel%
0
但是当我尝试将它放入我的 python 函数时它不起作用。未设置测试变量。
这是我的 python 函数中的内容:
def DelFile(self, address, del_file):
cmd_line = "del /f /q \\" + address + del_file + "\&\& if exist \"\\" + address + del_file + "\" (set errorlevel=1) else (set errorlevel=0)"
myP = subprocess.Popen(cmd_line, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
out = timeout(myP.communicate, (), {}, 120, (None, None))
result = out[0]
error = out[1]
error_code = None
error_code = myP.returncode
notes = []
return cmd_line, result, error, error_code, notes
我已验证 address
和 del_file
变量的格式是否正确,以便让我找到所需的文件。我还验证了它根据情况删除或不删除预期的文件。但由于某种原因,测试变量永远不会被设置。
我的理解是和号字符需要转义,就像 "\&"
在字符串中使用时一样。这不是真的还是我没有正确转义?
你的 cmd_line 应该是这样的
cmd_line = "del /f /q \\{0}{1} & if exist \\{0}{1} (set test=1) else (set test=0)".format(address, del_file)
尝试使用一个 &
我想通了这个问题,原来我确实有几个。第一个是&符号显然不需要转义(谢谢 FirebladeDan),第二个是我在&符号之前缺少 space (再次感谢 FirebladeDan 的格式化提示,就是这样我注意到缺少 space)。最后一个比 python 更像是一个 CMD 问题,我试图直接设置 errorlevel
变量,而我本应该将 exit /b
与相应的 1
或0
.
作为旁注,我还在 psexec
的使用中添加了,这对于解决方案来说不是必需的,它只是有助于提高整个程序的性能。
这是我最终得到的结果:
def DelFile(self, address, del_file):
cmd_line = r'psexec \{0} cmd /c "del /f /q "{1}" && if exist "{1}" (exit /b 1) else (exit /b 0)"'.format(address, del_file)
myP = subprocess.Popen(cmd_line, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
out = timeout(myP.communicate, (), {}, 60, (None, None))
result = out[0]
error = out[1]
error_code = None
error_code = myP.returncode
notes = []
return cmd_line, result, error, error_code, notes
我正在尝试在 python 2.7.8 中创建一个函数来删除远程 PC 上不再需要的文件。
如果我从命令行 运行 它,我可以这样做:
C:\>del /f /q \RemotePC\d$\temp\testfile.txt && if exist \RemotePC\d$\temp\testfile.txt (set errorlevel=1) else (set errorlevel=0)
由此我得到了预期的结果:
C:\>echo %errorlevel%
0
但是当我尝试将它放入我的 python 函数时它不起作用。未设置测试变量。
这是我的 python 函数中的内容:
def DelFile(self, address, del_file):
cmd_line = "del /f /q \\" + address + del_file + "\&\& if exist \"\\" + address + del_file + "\" (set errorlevel=1) else (set errorlevel=0)"
myP = subprocess.Popen(cmd_line, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
out = timeout(myP.communicate, (), {}, 120, (None, None))
result = out[0]
error = out[1]
error_code = None
error_code = myP.returncode
notes = []
return cmd_line, result, error, error_code, notes
我已验证 address
和 del_file
变量的格式是否正确,以便让我找到所需的文件。我还验证了它根据情况删除或不删除预期的文件。但由于某种原因,测试变量永远不会被设置。
我的理解是和号字符需要转义,就像 "\&"
在字符串中使用时一样。这不是真的还是我没有正确转义?
你的 cmd_line 应该是这样的
cmd_line = "del /f /q \\{0}{1} & if exist \\{0}{1} (set test=1) else (set test=0)".format(address, del_file)
尝试使用一个 &
我想通了这个问题,原来我确实有几个。第一个是&符号显然不需要转义(谢谢 FirebladeDan),第二个是我在&符号之前缺少 space (再次感谢 FirebladeDan 的格式化提示,就是这样我注意到缺少 space)。最后一个比 python 更像是一个 CMD 问题,我试图直接设置 errorlevel
变量,而我本应该将 exit /b
与相应的 1
或0
.
作为旁注,我还在 psexec
的使用中添加了,这对于解决方案来说不是必需的,它只是有助于提高整个程序的性能。
这是我最终得到的结果:
def DelFile(self, address, del_file):
cmd_line = r'psexec \{0} cmd /c "del /f /q "{1}" && if exist "{1}" (exit /b 1) else (exit /b 0)"'.format(address, del_file)
myP = subprocess.Popen(cmd_line, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
out = timeout(myP.communicate, (), {}, 60, (None, None))
result = out[0]
error = out[1]
error_code = None
error_code = myP.returncode
notes = []
return cmd_line, result, error, error_code, notes