新手 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 CLI(powershell.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 命令选择打开所有 .ps1
个 powershell.exe
文件;所述方法 不 支持 argument-passing.
是一种改变file-type定义以支持argument-passing的方法,在this answer中有详细说明(部分“程序化方法").
但是,一般来说,我建议 不要 应用此自定义,尤其是在批处理文件中,这些文件也必须由其他用户/在其他机器上 运行,这不能预计会有相同的定制。
我制作了 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 CLI(powershell.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 命令选择打开所有 .ps1
个 powershell.exe
文件;所述方法 不 支持 argument-passing.
是一种改变file-type定义以支持argument-passing的方法,在this answer中有详细说明(部分“程序化方法").
但是,一般来说,我建议 不要 应用此自定义,尤其是在批处理文件中,这些文件也必须由其他用户/在其他机器上 运行,这不能预计会有相同的定制。