【问题标题】:Perl system access deniedPerl 系统访问被拒绝
【发布时间】:2011-02-15 13:40:27
【问题描述】:

我以管理员身份在 Windows 机器上运行以下命令

system("tracert 192.168.63.1 > d:\netmon\test.txt");

输出是拒绝访问。在不创建文件的情况下运行 tracert 可以正常工作。那么为什么我不能在现有的 netmon 目录中创建文件。我拥有对该目录的完全访问权限。

谁能指出我正确的方向。谢谢

【问题讨论】:

  • 如果您从命令提示符运行,您的命令是否有效?

标签: perl system


【解决方案1】:

在 Perl 中,反斜杠 (\) 是双引号内的特殊字符,用于“转义”其他特殊字符或指定其他不可键入的字符。您的示例中包含的序列"\n""\t" 分别用于生成换行符和制表符。

为了在双引号内产生一个文字反斜杠字符,我们使用两个连续的反斜杠字符,所以:

system("tracert 192.168.63.1 > d:\\netmon\\test.txt");

会产生你想要的结果。

Perl 处理由单引号 ('') 括起来的字符串与双引号不同。在单引号内,\ 不是特殊字符(实际上,它仍然有点特殊,但比双引号内的特殊性要小得多),因此您也可以将表达式写为:

system('tracert 192.168.63.1 > d:\netmon\test.txt');

【讨论】:

  • 您可以在路径中使用“/”字符。不管你是在linux还是windows下工作。通用 '/' 字符分隔符用于不同系统之间的兼容性脚本。或者,您可以将“...”更改为“....”,并且您将阻止使用“\”作为转义字符。有时您必须插入任何变量,您可以使用 system(sprintf('tracert %s > %s',$ip_number_or_name,$path));请不要删除括号。否则附加参数将直接分配给系统,而不是打印函数。
【解决方案2】:

如果在路径中使用\,则需要加倍:

system("tracert 192.168.63.1 > d:\\netmon\\test.txt");

【讨论】:

    【解决方案3】:

    或者你可以只使用斜杠:

     system('tracert 192.168.63.1 > d:/netmon/test.txt');
    

    【讨论】:

    • system/exec/qx 调用中的文件名是 Perl 无法自动更正路径分隔符的一个地方。
    • 或者更确切地说,一个带有 IO 重定向的文件名。 system("C:/path/to/Windows/executable.exe") 可以,system("program.exe > C:/path/to/Windows/file") 不行。
    • 我认为 / 在 Windows 本身是合法的?或者这只是 Perl 做我的意思?
    猜你喜欢
    • 2023-03-05
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2011-09-24
    • 2012-04-10
    • 2020-10-24
    相关资源
    最近更新 更多