带变量的UNC中无法识别的转义序列

本文关键字:识别 转义序列 变量 UNC | 更新日期: 2023-09-27 18:06:41

下面的代码给出了无法识别的转义序列错误,在代码中的两个反斜杠处为:'C$'temp

我尝试了双''"",但仍然不起作用。

代码+ txtWSName.Text +用于作为计算机名的变量。

txtFileDetails.Text = RunScript(@"Get-ChildItem '' " + txtWSName.Text + " 'C$'temp | Sort-Object -Property LastWriteTime -Descending");

我想做的是导航到目录并查看文件

带变量的UNC中无法识别的转义序列

如果有疑问,请阅读文档:

c#支持两种形式的字符串字面值:常规字符串字面值和逐字字符串字面值。

一个常规字符串字面值由用双引号括起来的零个或多个字符组成,如"hello",并且可以包括简单的转义序列(如制表符的't)和十六进制和Unicode转义序列。

逐字字符串字面值由一个@字符后面跟着一个双引号字符、零个或多个字符以及一个结束双引号字符组成。一个简单的例子是@"hello"。在逐字字符串字面值中,分隔符之间的字符被逐字解释,唯一的例外是引号-转义序列。特别是,简单的转义序列以及十六进制和Unicode转义序列不会在逐字字符串字面量中处理。逐字字符串字面值可以跨越多行。

您希望在字符串字面量中使用反斜杠。这意味着您必须转义它们,或者在字符串前加上@字符(就像您对第一个文字所做的那样):

@"Get-ChildItem '' " + txtWSName.Text + @" 'C$'temp ..."

"Get-ChildItem '''' " + txtWSName.Text + " ''C$''temp ..."

在此之上,您需要删除第一个字符串字面值的尾随空格,以及第二个字符串字面值的前导空格,否则您将以无效路径告终。

底线,改变这个:

txtFileDetails.Text = RunScript(@"Get-ChildItem ''" + txtWSName.Text + " 'C$'temp | Sort-Object -Property LastWriteTime -Descending");

这:

txtFileDetails.Text = RunScript(@"Get-ChildItem ''" + txtWSName.Text + @"'C$'temp | Sort-Object -Property LastWriteTime -Descending");

您在@"Get-ChildItem '' "中有一个空格,这意味着''被视为单独的参数。在" 'C$'temp"中有另一个空格,顺便说一下,它将'视为转义字符。

一般情况下,您应该在单独的行中构造您想要执行的字符串,以使调试更容易。执行结果也是如此。性能不会受到影响。

你应该试试:

var path   = @"''" + txtWSName.Text + @"'C$'temp";
var script = "Get-ChildItem " + path + 
           " | sort-Object -property LastWriteTime -Descending";
var result = RunScript(script);
txtFileDetails.Text = result;

在c# 6中,你可以使用字符串插值,使代码更简洁,避免生成临时字符串,例如:

var server = txtWSName.Text;
var path   = $@"''{server}'C$'temp";
var script = $"Get-ChildItem {path} | sort-Object -property LastWriteTime -Descending";