文件名中的Powershell字符串
这是我正在使用的代码,当读取主机出现时,我可以键入任何我想要的内容,例如Hello,它将在我的桌面上创建一个Hello.txt文件 我如何获得它,以便读取主机能够理解我的变量?所以你可以打电话给他们说$firstname\uu$lastname\ufile4 然后在另一个场合可以在2021年4月投入$firstname 我的变量总是相同的,我只是希望在创建文件名时能够使用它们文件名中的Powershell字符串,powershell,Powershell,这是我正在使用的代码,当读取主机出现时,我可以键入任何我想要的内容,例如Hello,它将在我的桌面上创建一个Hello.txt文件 我如何获得它,以便读取主机能够理解我的变量?所以你可以打电话给他们说$firstname\uu$lastname\ufile4 然后在另一个场合可以在2021年4月投入$firstname 我的变量总是相同的,我只是希望在创建文件名时能够使用它们 $firstname = 'John' $lastname = 'Smith' $ID = 324230 $filen
$firstname = 'John'
$lastname = 'Smith'
$ID = 324230
$filename = Read-Host "What would you like to call the file?"
New-Item "C:\\Myarea\Desktop\$filename"
您可以使用:
尽管-ExpandString
将执行原始字符串中包含的任何有效子表达式,但要小心,因此如果用户输入$(删除项C:\Windows\System32)
,脚本将为他们执行它
为了防止此类输入,我们可以使用PowerShell的解析器为我们检查字符串表达式:
function Test-SafeExpandableString {
param([string]$LiteralStringExpression)
# Construct StringExpression AST
$emptyExtent = [Activator]::CreateInstance([psobject].Assembly.GetType('System.Management.Automation.Language.EmptyScriptPosition'))
$stringExpressionAST = [System.Management.Automation.Language.ExpandableStringExpressionAst]::new($emptyExtent, $LiteralStringExpression, [System.Management.Automation.Language.StringConstantType]::DoubleQuoted)
# Inspect result AST's nested expressions
foreach($expr in $stringExpressionAST.NestedExpressions){
if($expr -isnot [System.Management.Automation.Language.VariableExpressionAst]){
# There's a non-variable sub expression in the string, it's not safe
return $false
}
}
return $true
}
现在我们可以安全地继续:
$filename = Read-Host "What would you like to call the file?"
if(Test-SafeExpandableString $filename){
$filenameExpanded = $ExecutionContext.InvokeCommand.ExpandString($filename)
New-Item "C:\path\to\$filenameExpanded"
}
else {
Write-Error "Only variable expressions allowed!"
}
您可以修改
Test SafeExpandableString
函数以接受要测试的变量名列表,我将把它作为练习留给读者:)谢谢Mathias!如果我想用他们的名字和姓氏命名文件,然后键入'April2021',那么代码中应该怎么看呢?它看起来会像John_Smith_April2021。txt@DanielDeLaWarr然后在控制台中输入${firstname}{lastname}{ID}.ps1
$filename = Read-Host "What would you like to call the file?"
if(Test-SafeExpandableString $filename){
$filenameExpanded = $ExecutionContext.InvokeCommand.ExpandString($filename)
New-Item "C:\path\to\$filenameExpanded"
}
else {
Write-Error "Only variable expressions allowed!"
}