符号是否需要转义?

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

我已验证 addressdel_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 与相应的 10.

作为旁注,我还在 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