Windows perl if(-e";带空格路径的窗口){}

Windows perl if(-e";带空格路径的窗口){},windows,perl,path,executable,space,Windows,Perl,Path,Executable,Space,我在Windows上:-/在我的脚本中: $ENV{'Powmig Path'}powermt 这给了我: C:\Program\ Files\EMC\PowerPath\powermt 如果我执行if(-e$ENV{'Powmig Path'}powermt) 我试图用一些替代品来改变我的道路\/ 我还尝试添加更多双引号,但似乎没有任何效果:-( 例如: #!/usr/bin/perl use strict; use warnings; use File::Spec; if($^O =~

我在Windows上:-/在我的脚本中:

$ENV{'Powmig Path'}powermt
这给了我:

C:\Program\ Files\EMC\PowerPath\powermt
如果我执行
if(-e$ENV{'Powmig Path'}powermt)

我试图用一些替代品来改变我的道路\/

我还尝试添加更多双引号,但似乎没有任何效果:-(

例如:

#!/usr/bin/perl
use strict;
use warnings;
use File::Spec;

if($^O =~ m/^MSWin32$/){
    my $tmp = File::Spec->catdir($ENV{'Powmig Path'}, "powermt");
    if(-e "\"$tmp\""){
        print "powermt found\n";
    }else{
        print "No multipathing found \"$tmp\"\n";
    }
    $tmp =~ s/\\/\//g;
    if(-e "\"$tmp\""){
        print "powermt found\n";
    }else{
        print "No multipathing found \"$tmp\"\n";
    }
}else{
    print "Error: Unknow OS\n";
}
exit;
输出:

C:\Users\sgargasson\Desktop>perl test.pl
No multipathing found "C:\Program Files\EMC\PowerPath\powermt"
No multipathing found "C:/Program Files/EMC/PowerPath/powermt"
在尝试使用不同的文件后,问题出现在空间中

有人能帮我吗


Thx在Adv

中,您确实意识到您不能只在源代码中键入字符串,对吗?您需要引用它:

print "$ENV{'Powmig Path'}powermt";
...
if (-e "$ENV{'Powmig Path'}powermt") 
这将插入变量,在本例中是来自哈希
%ENV
的哈希值,并将其与字符串
powermt
连接起来

如果尝试将字符串连接到变量,则首先需要将其引用,然后使用将其附加到变量:

my $string = $ENV{'Powmig Path'} . "powermt";
#                                ^--- concatenation operator
但是,如果您试图构建路径,则可以使用适合该任务的模块,例如:

这里有一个问题:

if(-e "\"$tmp\""){
您有一组额外的引号。文件名不是
“C:\Program Files\whatever”
,而是
C:\Program Files\whatever
。只有在命令提示符或类似命令解释文件名时,您才需要这些额外的引号,这里不是这种情况

试试这个,我已经删除了多余的引号(
“\“$tmp\”
变成了
“$tmp”
,这与
$tmp
完全相同):

非常感谢TLP

我真是个愚蠢的linux用户

问题:

my $tmp="$ENV{'Powmig Path'}powermt";
解决:

my $tmp="$ENV{'Powmig Path'}powermt.exe";
正确的代码是:

#!/usr/bin/perl
use strict;
use warnings;

if($^O =~ m/^MSWin32$/){
    if(-e "$ENV{'Powmig Path'}powermt.exe"){
        print "powermt found\n";
    }else{
        print "No multipathing found\n";
    }
}else{
    print "Error: Unknow OS\n";
}
exit;

我太蠢了,我需要取消选中“隐藏知道扩展”在这方面花了这么多时间…

也许你应该包括你使用过的实际代码。我在windows中对有空格的路径进行文件测试
-e
没有问题。很可能你的问题只是你的代码出了问题。而且,永远,永远,永远,永远都不要包括近似代码。Always,始终包括您自己使用的代码,这些代码描述了您的确切问题。re:Edit:在更改字符串之前,您尚未对字符串执行
-e
文件测试。两部分:1)您正在使用
-x
文件测试。2) 您在更改字符串后正在进行文件测试。我直接尝试了-e和-x测试,并做了大量更改。没有区别:-(我试过使用concat和File::Spec,不是更好:-(这样做。
使用Data::Dumper;$Data::Dumper::Useqq=1;print Dumper$path;system(“dir”,$path);
看看是否有任何隐藏的空格字符错误,看看shell是否可以用dir找到文件。我做$path=$ENV{'Powmig path'};输出:$VAR1=“C:\\Program Files\\EMC\\PowerPath\\”,在显示目录后,您的shell找不到该目录。如果您直接在shell
dir“%Powmig Path%”中键入该目录,则在编辑之前粘贴的内容会显示“未找到文件”。
my $tmp="$ENV{'Powmig Path'}powermt.exe";
#!/usr/bin/perl
use strict;
use warnings;

if($^O =~ m/^MSWin32$/){
    if(-e "$ENV{'Powmig Path'}powermt.exe"){
        print "powermt found\n";
    }else{
        print "No multipathing found\n";
    }
}else{
    print "Error: Unknow OS\n";
}
exit;