我做了一个powershell脚本,[1]接受2个参数(aka parameters),[2]改变文件的修改日期&时间,和[3]写点东西给主持人。下面的命令行在powershell控制台中工作得很好,但是当我在Windows cmd提示符(DOS)窗口中运行相同的命令行时,会触发一个错误消息:
E:AppsUtilitiesByMarcChange_DateTime_for_test1.bat_and_Hello_world_with_2_named_args_aaa.ps1 -dateTimeVarArg "01/11/2005 06:01:36" -file_dateTimeMod_fullname "E:AppsDelete01test1.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:AppsDelete01test1.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:AppsUtilitiesByMarcChange_DateTime_for_test1.bat_and_Hello_world_with_1_named_arg_aaa.ps1:6 char:50
+ ... "E:AppsDelete01test1.bat" | % {$_.LastWriteTime = $dateTimeVarArg}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
我想知道[1]如何改变上面显示的命令行(它在powershell控制台中工作得很好),以便它在Windows DOS命令提示符设置中工作,[2]在那里我可以了解更多关于为什么我的命令行触发错误,以及如何避免它们。
根据"Get-Host | Select-Object version"命令的输出,我正在运行version。5.1.19041.1682 .
如有任何建议,我将不胜感激。
默认情况下,您可以不直接从cmd.exe
(Windows遗留shell)执行PowerShell脚本(.ps1
文件),或者从外部PowerShell执行.
- 尝试这样做打开脚本文件编辑,因为双击
.ps1
文件从文件资源管理器/桌面。
从PowerShell外部执行.ps1
脚本需要使用PowerShell CLI(powershell.exe
for Windows PowerShell,pwsh
for PowerShell (Core) 7+),在你的情况下,它转换为一个调用,如(额外的CLI参数可能被调用):
powershell.exe -File E:AppsUtilitiesByMarcChange_DateTime_for_test1.bat_and_Hello_world_with_2_named_args_aaa.ps1 -dateTimeVarArg "01/11/2005 06:01:36" -file_dateTimeMod_fullname "E:AppsDelete01test1.bat"
至于你试过的:
您能够从cmd.exe
执行.ps1
的事实表明,您更改了这些文件的文件类型定义,改为通过powershell.exe
执行。
您试图传递给脚本的参数被忽略的事实-正如您得到的错误消息所暗示的那样-表明您使用文件资源管理器的Open with
快捷菜单命令选择使用powershell.exe
打开所有.ps1
文件;上述方法不支持参数传递。
是一种改变文件类型定义以支持参数传递的方法,在这个答案中有详细说明("编程方法"一节)。
但是,一般来说,我建议不要应用这个自定义,特别是在必须由其他用户运行的批处理文件中/在其他机器上,不能期望有相同的自定义。