PowerShell返回负的退出代码,但脚本结果是正确的。

6
我已经编写了以下PowerShell脚本:
Set-Location D:\folder1\folder2\folder3\folder4;
Get-ChildItem | Rename-Item -NewName {$_.BaseName.insert(19,'loadtime') + (Get-Date -Format HHmm) + $_.Extension};

目标是通过在第19位添加加载时间和时间戳来重命名文件。运行脚本后,会返回以下错误消息:

Rename-Item : The input to the script block for parameter 'NewName' failed. 
Exception calling "Insert" with "2" argument(s): "Specified argument was out 
of the range of valid values.
Parameter name: startIndex"
At D:\folder1\folder2\folder3\folder4\folder5\RenameFile.ps1:2 
char:38
+ Get-ChildItem | Rename-Item -NewName {$_.BaseName.insert(19,'loadtime') + 
(Get-D ...
+                                      
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Archive:PSObject) [Rename-
Item], ParameterBindingException
    + FullyQualifiedErrorId : 
ScriptBlockArgumentInvocationFailed,
Microsoft.PowerShell.Commands.RenameItemCommand

当我从我的SSIS包中运行脚本时,我会收到以下错误:
[Execute Process Task] Error: In Executing "PowerShell.exe" "-F D:\folder1\folder2\folder3\folder4\folder5\exec RenameFile.ps1" at "", The process exit code was "-196608" while the expected was "0".

我尝试搜索这个错误信息,但是我找不到任何一个页面讨论这个特定的退出代码。

问题在于,在从PowerShell窗口运行脚本命令时,我仍然会收到错误消息,但文件名确实按预期更改。然而,由于返回了错误,SSIS中的Execute Process任务将失败。

我的问题是,这个错误的原因是什么?我认为这可能与以下事项有关:

{$_.BaseName.insert(19,'loadtime') + (Get-Date -Format HHmm) + $_.Extension};

其中 $.BaseName.insert(19,'loadtime') 和 (Get-Date -Format HHmm) 和 + $.Extension 被视为单独的参数。

我的PowerShell知识不是很丰富,所以这只是我猜测的。

有什么方法可以帮助我消除错误?

提前感谢!


1
错误提示称您正在尝试将数据插入到不存在的位置。 您确定文件名足够长吗? 为什么要使用索引19? 为什么不只在末尾拼接时间戳? - vonPryz
好问题,说实话是因为我不知道怎么做。我能这样做吗:$.BaseName + 'Loadtime' + (Get-Date -Format HHmm) + $.Extension};? - Ruben Jonkers
@vonPryz 那个有效!我应该更明智地尝试这个...如果您将其作为答案添加,我将为其投票并关闭问题。 - Ruben Jonkers
@vonPryz 然而... 当我从 PowerShell 窗口运行脚本时,仍然会在 SSIS 中得到一个错误代码。我可以通过添加退出代码来修复这个问题吗?这样它就总是以 0 退出? - Ruben Jonkers
1个回答

5
根据评论,该问题是由于尝试插入到字符串不存在的部分引起的。这将引发异常
解决方案是确保索引位置存在,或者只需在末尾进行连接。就像这样,
$_.basename + 'loadtime' + (get-date -format hhMM) + $_.extension

奇怪的错误代码-196608实际上是一个十进制整数表示的错误代码,而不是十六进制值(基数为16)。考虑以下内容:

[int]$i = -196608
$i.ToString('x')
fffd0000

这里发生的情况是,真正的错误代码以十六进制格式为0xFFFD0000。由于二进制补码,足够大的十六进制值实际上表示负十进制数。
至于这个特定的错误代码,它会在没有适当文档的情况下不时出现。如果我猜测一下,它可能与PowerShell本身运行良好,但被告知运行的脚本没有关系。

感谢您的解释。连接操作有效,并且十六进制错误代码实际上在搜索引擎上提供了很多帮助,帮助我解决了问题。 - Ruben Jonkers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接