Powershell returns 负退出代码,而脚本结果是正确的
Powershell returns negative exit code while script results are correct
我制作了以下 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 window 执行脚本命令时,我仍然会收到错误消息,但文件名确实按预期更改了。但是,由于返回错误,SSIS 中的执行进程任务将失败。
我的问题是,这个错误的原因是什么?我认为它与以下内容有关:
{$_.BaseName.insert(19,'loadtime') + (Get-Date -Format HHmm) + $_.Extension};
其中 $.BaseName.insert(19,'loadtime') 和 (Get-Date -Format HHmm) 和 + $.Extension 被视为单独的争论。
我对 PowerShell 的了解不是很多,所以这只是我的猜测。
什么可以帮助我摆脱错误?
提前致谢!
根据评论,问题是由于试图插入字符串的不存在部分引起的。这将 raise an exception.
作为解决方案,请确保索引位置存在,或者只是在末尾连接。像这样,
$_.basename + 'loadtime' + (get-date -format hhMM) + $_.extension
奇怪的错误代码 -196608
实际上是错误代码表示为十进制(基数 10)整数而不是十六进制值(基数 16)的结果。考虑一下:
[int]$i = -196608
$i.ToString('x')
fffd0000
这里发生的是真正的错误代码,十六进制格式,0xFFFD0000
。由于 Two's Compliment,足够大的十六进制值实际上表示负十进制数。
至于这个特定的错误代码,它会在没有适当文档的情况下随处弹出。我是否应该冒险猜测,这与 Powershell 本身工作正常这一事实有关,但它被告知 运行 的脚本却没有。
我制作了以下 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 window 执行脚本命令时,我仍然会收到错误消息,但文件名确实按预期更改了。但是,由于返回错误,SSIS 中的执行进程任务将失败。
我的问题是,这个错误的原因是什么?我认为它与以下内容有关:
{$_.BaseName.insert(19,'loadtime') + (Get-Date -Format HHmm) + $_.Extension};
其中 $.BaseName.insert(19,'loadtime') 和 (Get-Date -Format HHmm) 和 + $.Extension 被视为单独的争论。 我对 PowerShell 的了解不是很多,所以这只是我的猜测。
什么可以帮助我摆脱错误?
提前致谢!
根据评论,问题是由于试图插入字符串的不存在部分引起的。这将 raise an exception.
作为解决方案,请确保索引位置存在,或者只是在末尾连接。像这样,
$_.basename + 'loadtime' + (get-date -format hhMM) + $_.extension
奇怪的错误代码 -196608
实际上是错误代码表示为十进制(基数 10)整数而不是十六进制值(基数 16)的结果。考虑一下:
[int]$i = -196608
$i.ToString('x')
fffd0000
这里发生的是真正的错误代码,十六进制格式,0xFFFD0000
。由于 Two's Compliment,足够大的十六进制值实际上表示负十进制数。
至于这个特定的错误代码,它会在没有适当文档的情况下随处弹出。我是否应该冒险猜测,这与 Powershell 本身工作正常这一事实有关,但它被告知 运行 的脚本却没有。