新手 powershell 参数问题

Newbie powershell argument issues

我制作了 powershell 脚本,[1] 接受 2 个参数(又名参数),[2] 更改文件的修改日期和时间,[3] 向主机写入内容。以下命令行在 powershell 控制台中运行良好,但当我在 Windows cmd 提示符 (DOS) Window:[=13= 中 运行 相同命令行时触发错误消息]

E:\Apps\UtilitiesByMarc\Change_DateTime_for_test1.bat_and_Hello_world_with_2_named_args_aaa.ps1 -dateTimeVarArg "01/11/2005 06:01:36" -file_dateTimeMod_fullname "E:\Apps\Delete01\test1.bat"

以下是 powershell 脚本的编码,我给它起了个长名字,'Change_DateTime_for_test1.bat_and_Hello_world_with_2_named_args_aaa.ps1':

param ( [string]$dateTimeVarArg,  [string]$file_dateTimeMod_fullname)
Get-ChildItem  $file_dateTimeMod_fullname | % {$_.LastWriteTime = $dateTimeVarArg}
#Get-ChildItem  "E:\Apps\Delete01\test1.bat" | % {$_.LastWriteTime = $dateTimeVarArg}
$strString = "Hello World"
write-host $strString


function ftest{
$test = "Test"
write-host $test
}

ftest

当我在 Windows DOS 命令提示符设置中 运行 上面显示的命令行时,我收到以下错误消息:

Exception setting "LastWriteTime": "Cannot convert null to type "System.DateTime"."
At E:\Apps\UtilitiesByMarc\Change_DateTime_for_test1.bat_and_Hello_world_with_1_named_arg_aaa.ps1:6 char:50
+ ... "E:\Apps\Delete01\test1.bat" | % {$_.LastWriteTime = $dateTimeVarArg}
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting

我想知道 [1] 如何更改上面显示的命令行(它在 powershell 控制台中工作正常)以便它在 Windows DOS 命令提示符设置中工作,并且 [2]我可以在其中详细了解为什么我的命令行会触发错误,以及如何避免这些错误。
根据命令“Get-Host | Select-Object Version”的输出,我是运行ning版本。 5.1.19041.1682.

如有任何提示,我们将不胜感激。

默认情况下,您可以直接执行 PowerShell脚本(.ps1文件)来自cmd.exe、Windows 遗留 shell,或来自 外部 PowerShell 完全

  • 尝试这样做会打开脚本文件进行编辑,就像 double-clicking .ps1 来自文件资源管理器/桌面的文件一样。

从 PowerShell 本身外部执行 .ps1 脚本需要使用 PowerShell CLIpowershell.exe for Windows PowerShell, pwsh 适用于 PowerShell (Core) 7+),这在您的case 转换为这样的调用(可能需要额外的 CLI 参数):

powershell.exe -File E:\Apps\UtilitiesByMarc\Change_DateTime_for_test1.bat_and_Hello_world_with_2_named_args_aaa.ps1 -dateTimeVarArg "01/11/2005 06:01:36" -file_dateTimeMod_fullname "E:\Apps\Delete01\test1.bat"

至于你试过的

能够从 cmd.exe 执行您的 .ps1 这一事实表明您将此类文件的 file-type 定义更改为通过 powershell.exe 执行。

您试图传递给脚本的 参数 忽略 的事实 - 正如您收到的错误消息所暗示的那样 - 表明您使用文件资源管理器的 Open with shortcut-menu 命令选择打开所有 .ps1powershell.exe 文件;所述方法 支持 argument-passing.

一种改变file-type定义以支持argument-passing的方法,在this answer中有详细说明(部分“程序化方法").

但是,一般来说,我建议 不要 应用此自定义,尤其是在批处理文件中,这些文件也必须由其他用户/在其他机器上 运行,这不能预计会有相同的定制。